我在服务器上接受UDP数据,当服务器启动的时候,第一次接受到客户段发送过来的数据是不能得到他的地址,当客户端第2次发送以后就可以得到正常的地址。
我的程序大概如下:
int udp_listen_fd ;
int create_udp_socket(void)
{
int ret ;
struct sockaddr_in serv_addr ;// myselfhost;
/* bint listen udp fd*/
BZERO(&serv_addr,sizeof(serv_addr)) ;
serv_addr.sin_family = AF_INET ;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY) ;
serv_addr.sin_port = htons(get_port());
udp_listen_fd = socket(AF_INET, SOCK_DGRAM, 0);
if(-1 == udp_listen_fd){
return -1 ;
}
if(-1 == bind(udp_listen_fd, (struct sockaddr*)&serv_addr,sizeof(serv_addr)) ){
return -1;
}
return 0 ;
}
int udp_message_handle(int fd)
{
int ret ,sock_len;
char send_buf[1024] ;
struct sockaddr_in cli_addr ;
BZERO(&send_buf, sizeof(send_buf)) ;
ret = recvfrom(fd, &send_buf, sizeof(send_buf), 0, (struct sockaddr *)&cli_addr, &sock_len ) ;
if(ret < sizeof(send_buf.uggcp) )
return 1 ;
fprintf(stderr,"received udp connect from %s:%d\n",inet_ntoa(cli_addr.sin_addr), ntohs(cli_addr.sin_port));
/* send success message to client ,
* no matter what register client UDP REGISTER
* success or not
*/
sendto(fd, &send_buf, sizeof(uggcp_t),0,
(struct sockaddr*)&(cli_addr), sock_len) ;
return 0 ;
}
输出的结果是:
received udp connect from 0.0.0.0:0
如果我在client第2次连接的话就对了
请问这是什么问题啊?
问题出在这里:
ret = recvfrom(fd, &send_buf, sizeof(send_buf), 0, (struct sockaddr *)&cli_addr, &sock_len ) ;
sock_len是一个值结果参数,而你并没有事先给它赋值,所以导致第一次取不到地址。
当第二次连接时由于recvfrom()给sock_len赋了值,所以你就能取得地址了。
解决方法:
recvfrom()前增加一行
sock_len=sizeof(cli_addr);