技术解析

请教一个折腾好几天的问题, udp 收发小实验
0
2021-07-13 05:50:20
idczone

系统是Macintosh Yosemite,编译器gcc

实验的基本内容是客户端发消息,服务器端回显,
这里做在同一台电脑上用两个终端联系,

  • 第一次学这个,速度比较慢,弄了一晚上做出来了,回显一切正确。

但是接下来麻烦来了

  • 第二天增加功能之前,测试了一下昨天的成果,结果试了多少遍,回显一直有问题。

Alt text

客户端显示莫名其妙的字符(好像是之前测试输入的。。跟本次输入完全没有关系)
用很原始的调试方法发现,客户端显示的东西完全不是服务器端返回的(服务器端get sendline!这句话根本就不执行。。。)

  • 于是我用ubuntu虚拟机跑了一遍这个程序,第一遍okay,仅仅是重启了一下,又跟mac下一模一样了!!!
  • 哭死。。。。

是我代码的问题还是电脑的问题
能帮我解释一下为什么么?十分感谢!

最后附代码

/*
 * udpcli01.cpp
 *
 *  Created on: 2015年4月23日
 *      Author: gzxultra
 */

    #include        
    #include        
    #include        
    #include        
    #include        
    #include        
    #include        
    #define MAXLINE                  4096
    #define LISTENQ                  1024    /* 2nd argument to listen() */
    #define SERV_PORT                9877
    #define SA      struct sockaddr


    void dg_cli(FILE *, int, const SA *, socklen_t);

    int
    main(int argc, char **argv)
    {
        int sockfd;
        struct sockaddr_in servaddr;

        if (argc != 2) {
            printf("usage:udpcli01sigio \n");
            exit(1);
        }

        bzero(&servaddr, sizeof(servaddr));
        servaddr.sin_family = AF_INET;
        servaddr.sin_port = htons(SERV_PORT);

        inet_pton(AF_INET, argv[1], &servaddr.sin_addr);

        if((sockfd = socket(AF_INET, SOCK_DGRAM, 0))<0) {
            printf("socket error.\n");
            exit(1);
        }

        dg_cli(stdin, sockfd, (SA *)&servaddr, sizeof(servaddr));

        exit(0);
    }

    void
    dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)
    {
        int  n;
        char sendline[MAXLINE], recvline[MAXLINE + 1];
        //struct sockaddr_in from;

        while (fgets(sendline, MAXLINE,fp) != NULL) {
            sendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);
            n = recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL);
            recvline[n] = 0; /* null terminate */
            fputs(recvline, stdout);
            memset(sendline,0,sizeof(sendline));
            memset(recvline,0,sizeof(recvline));
        }
    }

recvfrom没收到消息,就会一直阻塞
所以,就一直卡在那里了


就是想知道为啥recvfrom没收到消息
网络不好?系统问题还是代码错了?
感谢!

你用 Wireshark 抓包看看

没有收到数据的原因:
1. 运行client程序,传入的ip地址错误的,我第一遍输入127.0.0.1 确实出现了楼主说的情况
2. 系统有防火墙,禁止server程序传入数据
乱码的原因,是你接收数据的缓冲区没有初始化了。
变量定义的时候初始化是个好习惯。

关于显示莫名字符串的问题
1. 字符串取长度用strlen,代码里好多用了sizeof。
2. 客户端传给服务端的字符串不带0,服务端取长度前要加0。
不回显的问题参考3楼用Wireshark分析。


首先感谢热心解答,莫名字符串已修改
关于无法recvfrom的问题也已经发现原因和解决方法
习惯sublime先手编译一下,command+b 实际上运行了程序(开了一个服务器进程)
命令行执行开了一个服务器进程,
因为有两个服务器端口,client端无法正确发送!!!
折磨我几天了,再次感谢!

数据地带为您的网站提供全球顶级IDC资源