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

标签 c linux sockets ubuntu udp

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

相关文章:

与 g++ 链接时找不到 -lcuda

c - 为什么这个泊松分布实现在 msvc 上返回 0

c - 硬链接(hard link)与其在 C 中的程序之间的区别

java - TCP/IP 等的套接字应该放在一个单独的类中吗? ( java )

sockets - 如何在UDP套接字中使用select()从客户端到服务器进行读写

c - Tiva C TM4C123GXL 接口(interface)库

来自 OOP 背景,一些 C 程序/库可以帮助我获得 "C way"?

linux - 单步调试 Linux 内核源代码?

python - 为什么我的 python 代码使我的服务器停滞不前?

Linux TCP : high Send-Q on sender, 接收器上的 Recv-Q 为零