代码如下:
#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
接受到的字符串匹配失败
抓包数据: