创建了一个UDP客户端与服务器,在通讯过程中发现客户端在第一次启动时会阻塞在recvfrom()函数,退出客户端重连之后就能正常通讯。
系统:Ubuntu 20.04
GCC版本:10.1.0
以下是代码:
server:
int main(int argc,char *atgv[])
{
int sockfd;
struct sockaddr_in server,client;
char send_buf[100],read_buf[100];
unsigned int len,length;
int rev;
time_t timep;
sockfd = socket(AF_INET,SOCK_DGRAM,0);
if(sockfd<0)
{
perror("socket error");
return -1;
}
bzero(&server,sizeof(server));
server.sin_family = AF_INET;
server.sin_addr.s_addr=htons(INADDR_ANY);/
server.sin_port =htons(8888);
len = sizeof(struct sockaddr);
if(bind(sockfd,(struct sockaddr *)&server,len)<0)
{
perror("bind error");
return -2;
}
while(1)
{
rev=recvfrom(sockfd, read_buf,100, 0, (struct sockaddr *)&client, &length);
if(rev<0)
{
printf("recvfrom error\n");
close(sockfd);
return -3;
}
printf("rev len: %d\n",rev);
printf("IP: 0x%x, PORT: %d\n",ntohl(client.sin_addr.s_addr),ntohs(client.sin_port));
printf("recv_buf: %s\n",read_buf);
timep=time(NULL);
snprintf(send_buf,sizeof(send_buf),"%s",ctime(&timep));
sendto(sockfd, send_buf, strlen(send_buf), 0, (struct sockaddr *)&client, length);
printf("send_buf: %s\n",send_buf);
bzero(&client,length);
bzero(send_buf,100);
bzero(read_buf,100);
}
close(sockfd);
return 0;
}
client:
int main(int argc,char *atgv)
{
int sockfd;
struct sockaddr_in server,serv;
int len,length, rv;
char send_buf[100]="Hello, UDP!", read_buf[100];
bzero(read_buf,100);
sockfd = socket(AF_INET,SOCK_DGRAM,0);
if(sockfd<0)
{
perror("socket error");
return -1;
}
bzero(&server,sizeof(server));
server.sin_family = AF_INET;
inet_pton(AF_INET,"192.168.83.129", &server.sin_addr.s_addr)
server.sin_port =htons(8888);
length=sizeof(struct sockaddr_in);
sendto(sockfd, send_buf ,strlen(send_buf), 0, (struct sockaddr *)&server, length);
rv=recvfrom(sockfd, read_buf, 100 ,0, (struct sockaddr*)&serv, &len);
if(rv<0)
{
printf("recvfrom error\n");
close(sockfd);
return -3;
}
printf("read_buf is: %s\n",read_buf);
close(sockfd);
return 0;
}
运行结果:
server:
client:
试了很多次都是第一次连接会阻塞,
后面退出client再连就可以了,请问各位大神是哪里有问题?