我正在尝试开发一个 UDP 客户端-服务器程序。这是我的代码:
服务器
int main(int argc, char *argv[]) {
struct sockaddr_in client, server;
int s, i=0;
socklen_t n;
char buf[4];
s=socket(AF_INET,SOCK_DGRAM,0);
server.sin_family=AF_INET;
server.sin_port=atoi(argv[1]);
inet_pton(AF_INET, "localhost", &(server.sin_addr));
bind(s,(struct sockaddr *)&server,sizeof(server));
n=sizeof(client);
while(1) {
recvfrom(s, buf, sizeof(buf), 0, (struct sockaddr *)&client, &n);
printf("%s", buf);
}
close(s);
return 0;
}
客户端
int main (int argc, char *argv[]) {
struct sockaddr_in client, server;
int s, n;
char buf[30];
char temp[4];
s=socket(AF_INET,SOCK_DGRAM,0);
server.sin_family=AF_INET;
server.sin_port=atoi(argv[2]);
inet_pton(AF_INET, argv[1], &(server.sin_addr));
n=sizeof(server);
while(1) {
scanf("%s", buf);
fflush(stdin);
sendto(s, buf, sizeof(buf), 0, (struct sockaddr *) &server, n);
}
close(s);
return 0;
}
本质上相当基本,没有任何错误处理。服务器输出客户端发送的任何内容。
当我在测试某些东西时忘记删除/释放动态分配的内存后,它在我的 Ubuntu 机器上停止工作。它在不同的 Linux 服务器上工作得很好。
知道是什么原因造成的吗?未关闭的端口,内存泄漏?我该如何解决这个问题?
最佳答案
您的方法存在问题:
fflush(stdin);
调用未定义的行为。如果您想读取并丢弃用户输入的其余行,请使用:scanf("%*[^\n]"); /* consume all remaining chars on the line, if any */ scanf("%*c"); /* consume the linefeed if any */
客户端代码应该只发送字符串,可能带有分隔符,而不是完整的缓冲区,其中部分未初始化:
sendto(s, buf, strlen(buf), 0, (struct sockaddr *)&server, n);
服务器代码应该空终止从客户端接收的缓冲区:
while(1) { ssize_t nr = recvfrom(s, buf, sizeof(buf) - 1, 0, (struct sockaddr *)&client, &n); if (nr >= 0) { buf[nr] = '\0'; printf("%s", buf); } }
客户端和服务器都应该优雅地处理文件结束和系统调用失败。
关于c - UDP 套接字 - 服务器未收到任何数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35834593/