Chinaunix首页 | 论坛 | 博客
  • 博客访问: 558969
  • 博文数量: 105
  • 博客积分: 3274
  • 博客等级: 中校
  • 技术积分: 1161
  • 用 户 组: 普通用户
  • 注册时间: 2010-02-21 12:14
文章分类

全部博文(105)

文章存档

2011年(1)

2010年(104)

分类: LINUX

2010-04-12 21:18:09

测试一个udp服务器时,写了如下程序。
#include
#include
#include
#include
#include
#include
 
int main(int argc,char *argv[])
{
 int srv_sock;
 socklen_t clt_len;
 struct sockaddr_in srv_addr;
 struct sockaddr_in clt_addr;
 struct timeval wait_time;
 int port;
 int ret;
 fd_set read_fds;
 int num; 
 char recv_buf[1024];
 if(argc!=2){
  printf("Usage: %s port_name\n",argv[0]);
  return 1;
 }
 
 port=atoi(argv[1]);
 srv_sock=socket(AF_INET,SOCK_DGRAM,0);
 if(srv_sock<0){
  perror("cannot create socket");
  return 1;
 }
 
 memset(&srv_addr,0,sizeof(srv_addr));
 srv_addr.sin_family=AF_INET;
 srv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
 srv_addr.sin_port=htons(port);
 ret=bind(srv_sock,(struct sockaddr*)&srv_addr,sizeof(srv_addr));
 if(ret<0){
  perror("cannot bind the socket");
  return 1;
 }
   // clt_len = sizeof(struct sockaddr_in);
   
 while(1){
  wait_time.tv_sec=0;
  wait_time.tv_usec=0;
  FD_ZERO(&read_fds);
  FD_SET(srv_sock,&read_fds);
  
  num=select(srv_sock+1,&read_fds,NULL,NULL,&wait_time);
  if(num<0){
   perror("select fail");
   continue;
  }
  
  if(FD_ISSET(srv_sock,&read_fds)){
   int n=recvfrom(srv_sock,recv_buf,sizeof(recv_buf),0,(struct sockaddr*)&clt_addr,&clt_len);
   printf("clt_len is %d\n",clt_len);
   if(n<0){
    perror("cannot receive client message");
    close(srv_sock);
    return 1;
   }
   recv_buf[n] = 0;
   printf("server receive: %s\n",recv_buf);
   memset(recv_buf,0,sizeof(recv_buf));
   
   n = sendto(srv_sock,"hello\n",6,0,(struct sockaddr*)&clt_addr,clt_len);
   if(n < 0)
   {
       perror("can't sent client message");
   }
  
   
  } 
 }
}
 
测试代码时,发现服务器第一次收到数据发送总是提示
can't sent client message: Address family not supported by protocol
 
后面的就会一直成功。
 
不明白什么原因。
 
比较了几个udp例子之后,发现把程序里面红色部分不注释掉,就可以成功了。
 
始终找不到原因,到后续再看看源代码看怎么解决?
 
希望知道的兄弟能说下。
阅读(7261) | 评论(2) | 转发(0) |
0

上一篇:devkit8000的HDMI转DVI可用吗?

下一篇:随笔

给主人留下些什么吧!~~

vibe262014-11-21 12:24:27

无意间看到楼主的这篇文章,恰好我昨天也遇到类似的问题,我已把这个问题解决了,不过不知道为什么是这么解决的,知其然不知其所以然。
楼主现在把这个问题解决了吗?请教一下

James_Ji2012-03-16 15:56:32

查看man recvfrom,发现clt_len是值结果参数,在调用recvfrom时,clt_len是指定clt_addr的长度的,函数返回时,指定为更新过的clt_addr长度,所以开始调用recvfrom时需要初始化下。不知道对不对,只是个人的理解。