【发布时间】: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