与春风 2021-08-07 18:05 采纳率: 63.6%
浏览 27
已结题

C语言udp通信,抓包两次数据不一样,第二次接收输出服务器发送的字符串出错,输出的与第一次的一样是怎么回事呢?

代码如下:


#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<netdb.h>
#include<sys/socket.h>
#include<sys/wait.h>
#include<arpa/inet.h>
int main(){
        int sockListen;
        int ret = -1;
        if((sockListen = socket(AF_INET, SOCK_DGRAM, 0)) == -1){
                printf("socket fail\n");
                return -1;
        }
        int set = 1;
        setsockopt(sockListen, SOL_SOCKET, SO_REUSEADDR, &set, sizeof(int));
        struct sockaddr_in recvAddr;
        struct sockaddr_in client;
        memset(&recvAddr, 0, sizeof(struct sockaddr_in));
        recvAddr.sin_family = AF_INET;
        recvAddr.sin_port = htons(1467);
        recvAddr.sin_addr.s_addr = INADDR_ANY;
        // 必须绑定,否则无法监听
        if(bind(sockListen, (struct sockaddr *)&recvAddr, sizeof(struct sockaddr)) == -1){
                printf("bind fail\n");
                return -1;
        } 
        int recvbytes;
        char recvbuf[512];
        //char printbuf1[1024]={0x57,0x69,0x74,0x2d,0x55,0x6e,0x69,0x74,0x00,0x01};
        char printbuf2[1024];
        char printbuf3[1024];
        socklen_t addrLen = sizeof(struct sockaddr_in);
        char replybuf[]={""};
        int cnt = 1; 

        if((recvbytes = recvfrom(sockListen, recvbuf, 512, 0,(struct sockaddr *)&client, &addrLen)) != -1)
        {
                recvbuf[recvbytes] = '\0';
                printf("第%d次接受:%s\n", cnt++,recvbuf);
        }
        else{
                printf("recvfrom fail\n");
        }//接收第一次发送的字符串
        ret = sendto(sockListen, printbuf1, 34, 0, (struct sockaddr*)&client, addrLen);//第一次回复mac:00 0c 29 73 03 4f ip:c0 a8 f2 80/192.168.242.128
        printf("第一次回复:%s\n",printbuf1);
        //memset(&recvbuf, 0, sizeof(recvbuf));
        char *p = "info";
        while(1)
        {
                if((recvbytes = recvfrom(sockListen, recvbuf, 512, 0,(struct sockaddr *)&client, &addrLen)) != -1)
                {
                        recvbuf[recvbytes] = '\0';
                        printf("第%d次接受:%s\n", cnt++,recvbuf);
                }
                else{
                        printf("recvfrom fail\n");
                }//接收第一次后发送的字符串


                if(strstr(recvbuf,p))
                {
                        ret = sendto(sockListen, printbuf2,483, 0, (struct sockaddr*)&client, addrLen);
                        printf("第二次回复:%s\n",printbuf2);
                }else if(strstr(recvbuf,"1111"))
                {

                        ret = sendto(sockListen, printbuf3, 34, 0, (struct sockaddr*)&client, addrLen);
                }else
                {
                        printf("接受到的字符串匹配失败\n");
                }
                //printf("reply = %s \n",printbuf);
                sleep(1);
        }//循环第一次后的接收回复

        close(sockListen);
        return 0;
}

运行输出结果:

第1次接受:Wit-Unit
第一次回复:Wit-Unit
第2次接受:Wit-Unit
接受到的字符串匹配失败

抓包数据:

img

img

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 8月15日
    • 创建了问题 8月7日

    悬赏问题

    • ¥15 Android Navigation: 某XDirections类不能自动生成
    • ¥20 C#上传XML格式数据
    • ¥15 elementui上传结合oss接口断点续传,现在只差停止上传和继续上传,各大精英看下
    • ¥100 单片机hardfaulr
    • ¥20 手机截图相片分辨率降低一半
    • ¥50 求一段sql语句,遇到小难题了,可以50米解决
    • ¥15 速求,对多种商品的购买力优化问题(用遗传算法、枚举法、粒子群算法、模拟退火算法等方法求解)
    • ¥100 速求!商品购买力最优化问题(用遗传算法求解,给出python代码)
    • ¥15 虚拟机检测,可以是封装好的DLL,可付费
    • ¥15 kafka无法正常启动(只启动了一瞬间会然后挂了)