【发布时间】:2016-06-20 11:07:12
【问题描述】:
我正在尝试开发一个 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);调用未定义的行为,所以不要使用它。 -
printf("%s", buf);也可以调用 undefined behavior 如果buf中的内容不是以空值结尾的字符串。打印前正确终止“字符串”,或以其他方式打印。 -
以前,我的程序卡在无法读取数据,所以我不得不强制清理标准输入缓冲区。还有更好的选择吗?
-
我正在尝试发送:
temp[0] = 't'; temp[1] = 'e'; temp[2] = 'm'; temp[3] = '\0';仍然无法正常工作。 -
“没有任何错误处理”。在完成这些基础知识之前,您真的不应该在这里发帖。这不是对社区时间的有效利用。如果您添加错误检查,它可能会帮助您自己解决问题,或者至少让您或我们更接近问题所在。
标签: c linux sockets ubuntu udp