- 论坛徽章:
- 0
|
在编程中遇到一个比较奇怪的问题,请大家给解释一下是啥原因。
这个函数所做的功能就是“广播功能”,把packet广播出去。
在调试中,我发现了如下问题,这个问题有时会出现,有时不错出现,不知道啥原因...
貌似当网络流量比较大时,会出现代码中所指出的问题。当网络流量正常时,不会出现问题,不知道是啥原因?
A_STATUS scLBBroadcast( const LB_INFO *packet)
{
int fd = 0, optval = 1, i;
struct sockaddr_in sin, to;
unsigned char buf[LB_MAX_SIZE];
if ((fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)
{
printf("scLBBroadcast : error : can not establish a socket for broadcast!\n\n") ;
return A_ERROR;
}
bzero((char *)&sin, sizeof(struct sockaddr_in));
sin.sin_family = AF_INET;
sin.sin_port = htons(0x868D);
sin.sin_addr.s_addr = htonl(INADDR_ANY);
if(setsockopt(fd, SOL_SOCKET, SO_BROADCAST, (char *)&optval, sizeof (optval)) == -1)
{
printf("scLBBroadcast : error : can not set broadcast!\n\n") ;
return A_ERROR;
}
// 当网络流量比较繁忙时,bind 这一步往往会出现问题!
if (bind(fd, (struct sockaddr *)&sin, sizeof(struct sockaddr_in)) == -1)
{
close(fd);
printf("scLBBroadcast : error : can not bind the socket for broadcast!\n\n") ;
return A_ERROR;
}
bzero((char *)&to, sizeof(struct sockaddr_in));
to.sin_family = AF_INET;
to.sin_port = htons(0x868C);
to.sin_addr.s_addr = htonl(apCfgIpAddrGet() | 0x000000FF);
memcpy( (char*)buf, (char*)(packet), sizeof(LB_INFO) );
for (i=0; i<LB_BROADCAST_TIMES; i++)
{
if (sendto(fd, buf, sizeof(LB_INFO), 0, (struct sockaddr *)&(to), sizeof(struct sockaddr_in)) < 0)
{
}
}
if ( close(fd) == -1)
{
printf("scLBBroadcast : error : error occurs when closing socket !\n\n") ;
return A_ERROR;
}
fd = 0;
return A_OK;
}
[ 本帖最后由 anank 于 2009-1-6 09:39 编辑 ] |
|