Udp сервер отправляет только 0 байтов данных - PullRequest
0 голосов
/ 30 мая 2010

Это простой сервер UDP. Я пытаюсь передать данные некоторым клиентам, но, к сожалению, он не может передать данные. Несмотря на то, что отправка выполняется достаточно успешно, но возвращается с возвращаемым значением, означающим, что она ничего не отправила клиент, которого они получают, но опять же, очевидно, ноль байтов.

   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 Ответ

0 голосов
/ 30 мая 2010

Не уверен, что это точный ответ, но вы забыли memset() (или bzero()) структуру cliaddr перед использованием.

Также строка:

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

Возможно, можно написать:

cliaddr.sin_addr = it->addr.sin_addr;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...