UDP客户端/服务器c

UDP客户端/服务器c,c,sockets,udp,wireshark,C,Sockets,Udp,Wireshark,我一直在到处寻找答案。我对C语言的编码还不熟悉,如果我的教授允许我们选择C语言,我会喜欢的,但我离题了。我在本地运行OracleV-Box,运行Ubuntu客户端和Ubuntu服务器。我在服务器和客户端上编译了下面的代码,并给出了一些警告。我在服务器上运行代码(看起来不错),然后在客户机上运行。客户端要求发送一个PDF文件,就像我在TCP套接字传输中所做的那样(这非常有效)。我还在客户机和服务器上运行Wireshark,看起来请求是从客户机发出的,但服务器什么也不做,只是两端都坐着,没有把文件拉

我一直在到处寻找答案。我对C语言的编码还不熟悉,如果我的教授允许我们选择C语言,我会喜欢的,但我离题了。我在本地运行OracleV-Box,运行Ubuntu客户端和Ubuntu服务器。我在服务器和客户端上编译了下面的代码,并给出了一些警告。我在服务器上运行代码(看起来不错),然后在客户机上运行。客户端要求发送一个PDF文件,就像我在TCP套接字传输中所做的那样(这非常有效)。我还在客户机和服务器上运行Wireshark,看起来请求是从客户机发出的,但服务器什么也不做,只是两端都坐着,没有把文件拉过来。不确定是代码还是别的什么

/* Echo server using UDP */
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define SERVER_UDP_PORT     2466    
#define MAXLEN      4096

int main(int argc, char **argv)
{
    int     sd, client_len, port, n;
    char    buf[MAXLEN];
    struct  sockaddr_in     server, client;

    switch(argc) {
    case 1:
        port = SERVER_UDP_PORT;
        break;
    case 2:
        port = atoi(argv[1]);
        break;
    default:
        fprintf(stderr, "Usage: %s [port]\n", argv[0]);
        exit(1);
    }

    /* Create a datagram socket */
    if ((sd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
        fprintf(stderr, "Can't create a socket\n");
        exit(1);
    }

    /* Bind an address to the socket */
    bzero((char *)&server, sizeof(server));
    server.sin_family = AF_INET;
    server.sin_port = htons(port);
    server.sin_addr.s_addr = htonl(INADDR_ANY);
    if (bind(sd, (struct sockaddr *)&server, 
             sizeof(server)) == -1) {
        fprintf(stderr, "Can't bind name to socket\n");
        exit(1);
    }

    while (1) {
        client_len = sizeof(client);
        if ((n = recvfrom(sd, buf, MAXLEN, 0, 
                          (struct sockaddr *)&client, &client_len)) < 0) {
            fprintf(stderr, "Can't receive datagram\n");
            exit(1);
        }

        if (sendto(sd, buf, n, 0, 
                   (struct sockaddr *)&client, client_len) != n) {
            fprintf(stderr, "Can't send datagram\n");
            exit(1);
        }
    }
    close(sd);
    return(0);
}
坐在那里等着客户

编译后,在客户端上运行代码:

./udp_client -s 1500 10.0.2.11 2466 > test.pdf
我运行的是(./udp\u客户端-s数据速率服务器\u IP服务器\u端口>(输出到客户端桌面上的文件))

这只会生成一个空白页。它应该有几页文字和图片

我还在Wireshark上收到客户端发送的消息,但服务器没有回复。

这就是我从终端运行STRACE时得到的结果


我想您只是忘记了在客户端打印接收到的数据:

if (strncmp(sbuf, rbuf, data_size) != 0)
    printf("Data is corrupted\n");
close(sd);

printf(rbuf);  // <----

return(0);
if(strncmp(sbuf、rbuf、数据大小)!=0)
printf(“数据已损坏\n”);
关闭(sd);

printf(rbuf);// 我想您只是忘记了在客户端打印接收到的数据:

if (strncmp(sbuf, rbuf, data_size) != 0)
    printf("Data is corrupted\n");
close(sd);

printf(rbuf);  // <----

return(0);
if(strncmp(sbuf、rbuf、数据大小)!=0)
printf(“数据已损坏\n”);
关闭(sd);


printf(rbuf);//在
策略下运行服务器。这将产生大量的狼吞虎咽。等到它在你的终点站停止喷出。然后,在不点击control-C的情况下,复制并通过未编辑的gobbledygook的最后十到十五行,进入问题。然后运行发送客户端。如果这导致服务器运行的终端窗口中出现更多内容,请将其复制并粘贴到问题中,同样,未经编辑。您是否尝试在调试器下运行服务器,要查看它是否正在接收数据包,请在服务器上运行Wireshark,查看它是否正在接收数据包。服务器端的Wireshark看到的内容与客户端看到的完全相同。注意:我可以ping双方,并且双方都可以从对方ping中获取ICMP。请在
strace
下运行服务器。这将产生大量的狼吞虎咽。等到它在你的终点站停止喷出。然后,在不点击control-C的情况下,复制并通过未编辑的gobbledygook的最后十到十五行,进入问题。然后运行发送客户端。如果这导致服务器运行的终端窗口中出现更多内容,请将其复制并粘贴到问题中,同样,未经编辑。您是否尝试在调试器下运行服务器,要查看它是否正在接收数据包,请在服务器上运行Wireshark,查看它是否正在接收数据包。服务器端的Wireshark看到的内容与客户端看到的完全相同。注意:我可以ping双方,并且双方都可以从对方的ping中获取ICMP。@MartinJames:我在本地测试了代码,它产生了预期的结果。尝试运行更改…没有成功。@MathiasKroll:在同一台计算机上运行客户机和服务器有效吗?我确实在同一台计算机上运行了客户机和服务器,它给了我“abcdefg…等等”大约10行,这是新的。这就是你得到的吗?如果有人能找出两个独立的客户机/服务器实例,而不是将它们保留在同一个系统上,那就太酷了。。但不管怎样……感谢blender和其他人(马蒂……不得不加上他平时的两分钱……价值这么多)@MartinJames:我在本地测试了代码,它产生了预期的结果。尝试在更改的情况下运行……没有成功。@MathiasKroll:在同一台计算机上运行客户机和服务器有效吗?我在同一台计算机上运行了客户机和服务器,它给了我大约10行新的“abcdefg…等”。这就是你得到的吗?如果有人能找出两个独立的客户机/服务器实例,而不是将它们保留在同一个系统上,那就太酷了。。但不管怎样……感谢blender和其他人(马蒂……不得不加上他平时的两分钱……价值这么多)
if (strncmp(sbuf, rbuf, data_size) != 0)
    printf("Data is corrupted\n");
close(sd);

printf(rbuf);  // <----

return(0);