【问题标题】:How to setup a local server for simple data transmission (UDP/TCP)如何设置本地服务器进行简单数据传输 (UDP/TCP)
【发布时间】:2023-03-03 22:46:01
【问题描述】:

我目前正在与一些 gps tracking devices 合作完成一个大学项目,但我需要设置一个本地服务器来发送数据(我可以定义数据发送到哪个 IP 地址和端口到)。

由于从设备发送的数据是一个string,其中多个字节写成二进制代码(它包含有关地理定位、温度和湿度值等信息),我正在寻找实际上查看整个字符串(我的想法是将其存储在记事本上,以便我可以手动查看字符串的外观)以及解码整个字符串(将其切成小信息包: “第一部分”对应坐标;“从这里到那里”对应温度传感器1的值;等等)。

由于所有这些都需要时间和多次编码,我想首先了解如何设置本地服务器(或者如果可能的话),以便简单地查看我的“客户端”发送的字符串。

我在客户端/服务器通信方面的知识是基本的,我理解基本概念,并且我在编写套接字方面是合理的(我可能需要使用它来建立我的服务器端连接)。

任何帮助将不胜感激!

编辑:

客户

    // Client side implementation of UDP client-server model 

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <arpa/inet.h> 
#include <netinet/in.h> 

#define PORT     8080 

// Driver code 
int main() { 
    int sockfd; 
    
    // Creating socket file descriptor 
    if ( (sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0 ) { 
        perror("socket creation failed"); 
        exit(EXIT_FAILURE); 
    } 

    struct sockaddr_in servaddr;
    memset(&servaddr, 0, sizeof(servaddr)); 
    
    // Filling server information 
    servaddr.sin_family = AF_INET; 
    servaddr.sin_port = htons(PORT); 
    servaddr.sin_addr.s_addr = INADDR_ANY; 
    
    // Sending message to server
    sendto(sockfd, "Hello", 5, 0, (const struct sockaddr *) &servaddr, sizeof(servaddr));
    printf("Message sent.\n"); 

    close(sockfd); 
    return 0; 
} 

服务器

    // Server side implementation of UDP client-server model 

#define PORT     8080 
#define MAXLINE 1024 

// Driver code 
int main() { 
    int sockfd, len; 
     
    
    // Creating socket file descriptor 
    if ( (sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0 ) { 
        perror("socket creation failed"); 
        exit(EXIT_FAILURE); 
    }
     
    struct sockaddr_in servaddr, cliaddr; 
    memset(&servaddr, 0, sizeof(servaddr)); 
    memset(&cliaddr, 0, sizeof(cliaddr)); 
    
    // Filling server information 
    servaddr.sin_family = AF_INET; // IPv4 
    servaddr.sin_addr.s_addr = INADDR_ANY; 
    servaddr.sin_port = htons(PORT); 
    
    // Bind the socket with the server address 
    if ( bind(sockfd, (const struct sockaddr *)&servaddr, sizeof(servaddr)) < 0 ) { 
        perror("bind failed"); 
        exit(EXIT_FAILURE); 
    } 
    
    char buffer[MAXLINE]; 
    len = sizeof(cliaddr);

    int n = recvfrom(sockfd, buffer, sizeof(buffer) -1, 0, ( struct sockaddr *) &cliaddr, &len);
    if (n < 0)
        perror("rcvfrom failed");
    
    buffer[n] = '\0'; 
    printf("%d bytes sent by client: %s\n", n, buffer); 
    
    return 0; 
} 

【问题讨论】:

  • 第一步是决定是使用UDP还是TCP。这些设备实际使用什么?
  • @user3386109 它使用 UDP 或 TCP。有人告诉我使用 UDP(因为我稍后会在一家真实的公司中实现它,所以使用 UDP 是因为它降低了互联网带宽的一般成本等)。但是,如果使用 TCP 会简化这一点(很多),我更喜欢使用它,因为它不是必须使用 UDP。
  • Here's an example of a simple UDP server。在一台计算机上按原样运行它。然后弄清楚如何在两台不同的计算机上运行服务器和客户端(即客户端代码需要服务器的正确 IP 地址)。最后,用您的 GPS 设备试一试。 GPS 设备需要被告知服务器的 IP 地址,并且您可能需要遵循一些协议才能让 GPS 设备开始发送。
  • 在拥塞的 Internet 连接上使用 UDP 实际上可能比 TCP 更昂贵。 TCP 有流量控制 UDP 没有。因此,在其他用户共享的网络上发送 UDP 数据而不实施某种流控制可能被认为是不礼貌的。您还应该准备好处理丢失和重复的数据包,以及乱序的数据包。如果您是网络编程新手,根据经验,请使用 TCP。
  • @HAL9000 我了解 TCP 与 UDP 附带的所有“理论知识”。话虽如此(根据我在实习公司的要求),他们使用 UDP,因为除了降低总体成本外,对于“他们想要的”来说已经足够了(如果 GPS 每 X 分钟发送一次信息,所以如果信息丢失也没关系)。可能发生的最坏情况是不刷新其本地化或每个温度值等。我想我也更喜欢使用 TCP(因为它显然更安全)但这不是我的选择。我总是可以创建一个 UDP 客户端/服务器代码,然后考虑构建一个 TCP!

标签: c sockets server gps client


【解决方案1】:

1 - 谷歌搜索一个简单的 TCP 或 UDP 服务器-客户端应用程序,您会发现很多,

2 - 首先让您的服务器运行,然后使用类似 telnet 的方式连接到它,将您的第一条消息发送到您的服务器。 (可能使用您的客户将发送的示例消息)。尝试从另一台设备在同一网络中且不在同一网络中时发送消息,

3 - 重塑您的服务器以解析和评估它将收到的消息(NMEA 语句或它收到的任何内容)

4 - 然后一直回到示例代码并在其上实现您的客户端。相对而言,构建客户端应该花费更少的时间。

我假设您可以处理监听 GPS 和其他传感器。祝你好运。

【讨论】:

  • 鉴于@user3386109 UDP 服务器建议(除了我在网上找到的一些其他信息),我创建了我的服务器/客户端代码。这一切正常,我可以在我的客户端和我的服务器之间交换消息(仅建立单向连接:客户端 -> 服务器),因为我不会使用我的服务器来回复我的 GPS 设备。将编辑我的帖子并向所有人展示制作的代码。我会假设我仍然在第 2 步。我现在将尝试在与我的服务器代码不同的电脑上运行我的客户端代码(在我的网络内部和外部)。仍在弄清楚需要做出哪些改变!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-01
  • 1970-01-01
  • 2015-05-01
  • 2012-03-07
  • 2020-11-08
  • 2012-08-26
  • 2011-01-19
相关资源
最近更新 更多