- 論壇徽章:
- 0
|
在編程中遇到一個比較奇怪的問題,請大家給解釋一下是啥原因。
這個函數(shù)所做的功能就是“廣播功能”,把packet廣播出去。
在調(diào)試中,我發(fā)現(xiàn)了如下問題,這個問題有時會出現(xiàn),有時不錯出現(xiàn),不知道啥原因...
貌似當(dāng)網(wǎng)絡(luò)流量比較大時,會出現(xiàn)代碼中所指出的問題。當(dāng)網(wǎng)絡(luò)流量正常時,不會出現(xiàn)問題,不知道是啥原因?
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;
}
// 當(dāng)網(wǎng)絡(luò)流量比較繁忙時,bind 這一步往往會出現(xiàn)問題!
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 編輯 ] |
|