当前位置: 技术问答>linux和unix
谁能帮忙看看,广播响应第一次执行总是超时
来源: 互联网 发布时间:2016-12-23
本文导语: 客户端发送广播,服务器响应,但是客户端第一次在接受响应的时候老是超时,不晓得怎么回事?每次执行./client 时候都是发5次广播,但是第一次执行的5次广播响应都是超时,从第二个5次才能收到响应数据,但是...
客户端发送广播,服务器响应,但是客户端第一次在接受响应的时候老是超时,不晓得怎么回事?每次执行./client 时候都是发5次广播,但是第一次执行的5次广播响应都是超时,从第二个5次才能收到响应数据,但是第一次的返回ip是很随机的一个ip?
|
我这边有一个运行成功了的例子,你可以参考下:
这是服务端的。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define SERV_PORT 7838
#define SA struct sockaddr
#define LISTENQ 20
#define MAX_BUF_LEN 1000
int main ( int argc, char* argv[] )
{
int listenfd = 0, connfd = 0;
socklen_t sinsize = 0;
struct sockaddr_in cliaddr, servaddr;
char buf[MAX_BUF_LEN];
int buflen = MAX_BUF_LEN;
memset( buf, 0, sizeof(buf) );
memset ( &servaddr, 0, sizeof ( servaddr ) );
memset( &cliaddr, 0, sizeof( cliaddr ) );
listenfd = socket ( AF_INET, SOCK_STREAM, 0 );
if ( -1 == listenfd )
{
printf ( "Create socket error,reason is %sn", strerror ( errno ) );
return -1;
}
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl ( INADDR_ANY );
servaddr.sin_port = htons ( SERV_PORT );
if ( -1 == bind ( listenfd, ( SA * ) ( &servaddr ), sizeof ( SA ) ) )
{
printf ( "Bind listen socket error, reason is %sn", strerror ( errno ) );
return -1;
}
if ( -1 == listen ( listenfd, LISTENQ ) )
{
printf ( "Listen connection error, reason is %sn", strerror ( errno ) );
return -1;
}
sinsize = sizeof ( struct sockaddr_in );
if ( -1 == ( connfd = accept ( listenfd, ( SA * ) & cliaddr, &sinsize ) ) )
{
printf ( "Accept connection socket error, reason is %sn", strerror ( errno ) );
return -1;
}
while ( 1 )
{
int recvlen;
int sendlen;
if ( 1 > ( recvlen = recv ( connfd, buf, buflen, 0 ) ) )
{
printf ( "Connction socket recv data error ,reason is %s", strerror ( errno ) );
continue;
}
else
{
printf ( "Server receive data:%s. Length is %d", buf, recvlen );
}
if ( -1 == ( sendlen = send ( connfd, buf, strlen ( buf ) + 1, 0 ) ) )
{
printf ( "Send data error, reason is %sn", strerror ( errno ) );
continue;
}
else
{
printf ( "Server send data successfully, Length is %dn", sendlen );
}
}
if ( -1 == close ( connfd ) )
{
printf ( "Close connection socket error, reason is %sn", strerror ( errno ) );
return -1;
}
if ( -1 == close ( listenfd ) )
{
printf ( "Close listen socket error, reason is %sn", strerror ( errno ) );
return -1;
}
return 0;
}
这是服务端的。
|
设置阻塞式看看。。
是不是用同一个套接字连续发送5次,然后再接收5次?
有可能在发送的时候接收包到了,然后丢掉了,其中我不知道socket里面的实现。
是不是用同一个套接字连续发送5次,然后再接收5次?
有可能在发送的时候接收包到了,然后丢掉了,其中我不知道socket里面的实现。
|
你是用recvfrom还是recv?
recvfrom获取的sockaddr不就是源包的ip!
recvfrom获取的sockaddr不就是源包的ip!