2010-05-30 21 views
0

的這是一個簡單的udp server.I我試圖將數據傳輸到某些客戶端,但偏偏它是無法傳輸data.Though發送頗爲成功運行,但它與返回返回價值意味着它沒有發送任何東西。在客戶端他們正在接收,但顯然,零字節。UDP服務器只發送0字節的數據

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)的值,它是如預期,即一千即緩衝區的大小差不多。 你的人是否看到了一些可能的缺陷。 所有在這方面的幫助將不勝感激。 謝謝!

+1

你應該送DATAREAD字節,而不是的sizeof(dataToSend),但它仍應工作(你得到一些垃圾,但這不是套接字問題)。 您是否證實cliaddr是您期望的? – garph0 2010-05-30 15:39:12

回答

0

不確定這是否是確切的答案,但您在使用它之前忘記了memset()(或bzero()cliaddr結構。

此外,該行:

inet_aton(inet_ntoa(it->addr.sin_addr),&cliaddr.sin_addr); 

也許可以寫成:

cliaddr.sin_addr = it->addr.sin_addr; 
相關問題