gpt4 book ai didi

c - UDP 套接字 - 服务器未收到任何数据

转载 作者:太空狗 更新时间:2023-10-29 12:42:58 24 4
gpt4 key购买 nike

我正在尝试开发一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com