сервер udp не может передавать данные - PullRequest
3 голосов
/ 14 мая 2010

Я написал простой сервер udp, который должен передавать определенные данные нескольким своим клиентам. но хотя сервер успешно выполняет отправку, но не может передать даже один байт. Возвращаемое значение отправки равно 0, хотя у меня достаточно данных для передачи. Вы можете увидеть код для указанного сервера здесь: http://pastebin.com/zeMcwd6X

Можете ли вы, люди, помочь найти возможного виновника того же. Любой ответ в этом отношении будет оценен. Большое спасибо заранее! Мавия

Редактировать: ребята, как справедливо указал мистер Ясир, эта опечатка была исправлена. Но проблема в том, что проблема сохраняется даже после исправления.

Ответы [ 2 ]

3 голосов
/ 14 мая 2010

Вы использовали sendto неправильно. В третьем аргументе вы должны указать количество байтов, которые вы собираетесь отправить, но у вас есть:

n=sendto(sockfd,data,n,0,(struct sockaddr *)&setOfClient[k],(char*)(setOfClient+1)-(char*)setOfClient);

где n на первой итерации присваивается 0 из-за более раннего int n=0;. Таким образом, возвращаемое значение равно 0 и никогда не изменяется, потому что n всегда используется в цикле.

Таким образом, использование strlen(data) вместо n в качестве аргумента при вызове sendto и использование другой переменной, которой присвоено значение sendto return, будет более целесообразным.

P. S. Полезно читать справочные страницы, они, как правило, предоставляют вам большинство деталей, которые вы хотели бы знать, поэтому man 2 sendto.

2 голосов
/ 14 мая 2010

Ваша проблема здесь:

int n = 0;
for( k = 0; k < numberOfConnections; k++ )
    n = sendto( sockfd, data, n, 0, ... );

Уведомление n=0; назначение - вы просите сокет отправить пустую дейтаграмму.

Некоторые другие примечания к вашему коду:

  • избегайте жесткого кодирования таких вещей, как номера портов - рано или поздно вам придется их поменять
  • свести к минимуму глобальные переменные, вместо этого использовать аргументы функции, использовать структуры и указатели
  • рассмотрим многоадресную рассылку для отправки идентичных сообщений на многие узлы
  • рассмотрим подключенных UDP-сокетов для обмена сообщениями UDP с одним и тем же узлом

Надеюсь, это поможет.

Edit:

Многоадресная рассылка через Интернет является сложной задачей - вам потребуется либо явная поддержка маршрутизаторов, либо какое-то туннелирование. То есть многоадресная рассылка лучше всего подходит для локальной сети. Если вам интересно, взгляните на mbone project .

Взгляните на epoll(2) / kqueue(2) средства для высокопроизводительных сетей. Также прочитайте эти страницы: http://www.kegel.com/c10k.html и http://pl.atyp.us/content/tech/servers.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...