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