这是一个简单的Udp服务器。我正在尝试将数据传输到某些客户端,但不幸的是它无法传输数据。尽管发送运行非常成功,但它返回的是返回值,意味着它没有发送任何内容.On他们收到的客户端显然是零字节。
void* UdpServerStreamToClients(void *fileToServe)
{
int sockfd,n=0,k;
struct sockaddr_in servaddr,cliaddr;
socklen_t len;
char dataToSend[1000];
sockfd=socket(AF_INET,SOCK_DGRAM,0);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
servaddr.sin_port=htons(32000);
bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
FILE *fp;
if((fp=fopen((char*)fileToServe,"r"))==NULL)
{
printf("can not open file ");
perror("fopen");
exit(1);
}
int dataRead=1;
while(dataRead)
{
len = sizeof(cliaddr);
if((dataRead=fread(dataToSend,1,500,fp))<0)
{
perror("fread");
exit(1);
}
//sleep(2);
for(list<clientInfo>::iterator it=clients.begin();it!=clients.end();it++)
{
cliaddr.sin_family = AF_INET;
inet_aton(inet_ntoa(it->addr.sin_addr),&cliaddr.sin_addr);
cliaddr.sin_port = htons(it->udp_port);
n=sendto(sockfd,dataToSend,sizeof(dataToSend),0,(struct sockaddr *)&cliaddr,len);
cout<<"number of bytes send by udp: "<< n << endl;
printf("SEND this message %d : %s to %s :%d \n",n,dataToSend,inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port));
}
}
}
我正在检查sizeof(dataTosend)的值,它几乎与预期的一样,即千位,即缓冲区的大小。 你是否有人看到一些可能的缺陷。 在这方面的所有帮助将不胜感激。 谢谢!
答案 0 :(得分:0)
不确定这是确切的答案,但在使用之前您忘记了memset()
(或bzero()
} cliaddr
结构。
另外,该行:
inet_aton(inet_ntoa(it->addr.sin_addr),&cliaddr.sin_addr);
可能写得:
cliaddr.sin_addr = it->addr.sin_addr;