Добрый день.
Прежде чем задать это вопрос, я чщательно просмотрел множество тем на форуме, но кажеться никто пока еще не сталкивался с такой проблемой или багом. Собственно вот её описание: надо слать c клиента на сервер пакет по UDP, поэтому делаем примерно так (обработка ошибок присутствует) :
Ошибок нет ни при создании, ни при bind, ни при sendto (исправно показывает что ушло 8 бит в любом случае). Однако сниффер и файрвалл, а так же реакция сервера показывают, что пакет действительно ушел только в случае если N!=M. При одинаковых портах сниффер, файрвалл и сервер на другом конце показывают что пакета не было. WSAGetLastError выдает 0. В документации тоже не нашел внятного описания данной ситуации.
ЗЫ. compilator: minGW, OS: WinXP noSP
AtomKrieg wrote:
> Добрый день. > Прежде чем задать это вопрос, я чщательно просмотрел множество тем на форуме, но кажеться никто пока еще не сталкивался с такой проблемой или багом. Собственно вот её описание: надо слать c клиента на сервер пакет по UDP, поэтому делаем примерно так (обработка ошибок присутствует) : >
Клиенту не обязательно делать bind, чтобы отослать дейтаграмму, или законнектиться к серверу. Если bind сделан не был, то адрес и порт будут назначены стеком IP.
Как-то странно ты отсылаешь message. sendto() принимает void const*, поэтому, судя по коду message у тебя имеет тип какого-то указателя, но sizeof ты берешь не от *message...
Непонятно, зачем присутствует инициализация неиспользуемого server_addr и отсутсвует для game_sock.
> Ошибок нет ни при создании, ни при bind, ни при sendto (исправно показывает что ушло 8 бит в любом случае). Однако сниффер и файрвалл, а так же реакция сервера показывают, что пакет действительно ушел только в случае если N!=M. При одинаковых портах сниффер, файрвалл и сервер на другом конце показывают что пакета не было. WSAGetLastError выдает 0. В документации тоже не нашел внятного описания данной ситуации.
Здравствуйте, MaximE, Вы писали:
ME>AtomKrieg wrote:
ME>Клиенту не обязательно делать bind, чтобы отослать дейтаграмму, или законнектиться к серверу. Если bind сделан не был, то адрес и порт будут назначены стеком IP.
Собственно, да. Бинд необходим для того, чтобы сообщение посылалось с заданного порта — это проверяться на сервере. Насколько я понял это один из способов послать датаграмму с определенного порта.
ME>Как-то странно ты отсылаешь message. sendto() принимает void const*, поэтому, судя по коду message у тебя имеет тип какого-то указателя, но sizeof ты берешь не от *message...
Задётся следующими способами.
char message[] = {0x00, ...}
Вроде sizeof дает правльное значение. Только что проверил — подставляя мессаг разной длины.
ME>Непонятно, зачем присутствует инициализация неиспользуемого server_addr и отсутсвует для game_sock.
Очепятка (game_sock, тоже самое что server_sock), не везде заменил
sendto(game_sock, message, sizeof(message), 0, (struct sockaddr *)&server_addr, sizeof(server_addr))
>> Ошибок нет ни при создании, ни при bind, ни при sendto (исправно показывает что ушло 8 бит в любом случае). Однако сниффер и файрвалл, а так же реакция сервера показывают, что пакет действительно ушел только в случае если N!=M. При одинаковых портах сниффер, файрвалл и сервер на другом конце показывают что пакета не было. WSAGetLastError выдает 0. В документации тоже не нашел внятного описания данной ситуации.
ME>Проверь, что game_sock у тебя не локальный адрес.
Не локальный, даже специально IP mail.ru использую
ME>-- ME>Maxim Yegorushkin