Sendto после bind при одинаковых портах.
От: AtomKrieg  
Дата: 13.06.05 13:54
Оценка:
Добрый день.
Прежде чем задать это вопрос, я чщательно просмотрел множество тем на форуме, но кажеться никто пока еще не сталкивался с такой проблемой или багом. Собственно вот её описание: надо слать c клиента на сервер пакет по UDP, поэтому делаем примерно так (обработка ошибок присутствует) :
server_sock = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP);

server_addr.sin_family = AF_INET;
server_addr.sin_port = htons (N);
server_addr.sin_addr.s_addr = server_ip; 

local_addr.sin_family = AF_INET;
local_addr.sin_port = htons (M);
local_addr.sin_addr.s_addr = htonl(INADDR_ANY);

bind(server_sock, (sockaddr  *)  &local_addr, sizeof(local_addr))

sendto(server_sock, message, sizeof(message), 0, (struct sockaddr *)&game_sock, sizeof(game_sock));


Ошибок нет ни при создании, ни при bind, ни при sendto (исправно показывает что ушло 8 бит в любом случае). Однако сниффер и файрвалл, а так же реакция сервера показывают, что пакет действительно ушел только в случае если N!=M. При одинаковых портах сниффер, файрвалл и сервер на другом конце показывают что пакета не было. WSAGetLastError выдает 0. В документации тоже не нашел внятного описания данной ситуации.
ЗЫ. compilator: minGW, OS: WinXP noSP
Re: Sendto после bind при одинаковых портах.
От: AtomKrieg  
Дата: 13.06.05 14:00
Оценка:
Здесь описка:
AK>
AK>sendto(server_sock, message, sizeof(message), 0, (struct sockaddr *)&server_sock, sizeof(server_sock));
AK>


В коде на самом деле так:
AK>
AK>sendto(server_sock, message, sizeof(message), 0, (struct sockaddr *)&server_addr, sizeof(server_addr));
AK>

Проблема остаеться.
Re: Sendto после bind при одинаковых портах.
От: MaximE Великобритания  
Дата: 13.06.05 14:07
Оценка:
AtomKrieg wrote:

> Добрый день.

> Прежде чем задать это вопрос, я чщательно просмотрел множество тем на форуме, но кажеться никто пока еще не сталкивался с такой проблемой или багом. Собственно вот её описание: надо слать c клиента на сервер пакет по UDP, поэтому делаем примерно так (обработка ошибок присутствует) :
>
> server_sock = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP);
>
> server_addr.sin_family = AF_INET;
> server_addr.sin_port = htons (N);
> server_addr.sin_addr.s_addr = server_ip;
>
> local_addr.sin_family = AF_INET;
> local_addr.sin_port = htons (M);
> local_addr.sin_addr.s_addr = htonl(INADDR_ANY);
>
> bind(server_sock, (sockaddr  *)  &local_addr, sizeof(local_addr))
>
> sendto(server_sock, message, sizeof(message), 0, (struct sockaddr *)&game_sock, sizeof(game_sock));
>


Клиенту не обязательно делать bind, чтобы отослать дейтаграмму, или законнектиться к серверу. Если bind сделан не был, то адрес и порт будут назначены стеком IP.

Как-то странно ты отсылаешь message. sendto() принимает void const*, поэтому, судя по коду message у тебя имеет тип какого-то указателя, но sizeof ты берешь не от *message...

Непонятно, зачем присутствует инициализация неиспользуемого server_addr и отсутсвует для game_sock.

> Ошибок нет ни при создании, ни при bind, ни при sendto (исправно показывает что ушло 8 бит в любом случае). Однако сниффер и файрвалл, а так же реакция сервера показывают, что пакет действительно ушел только в случае если N!=M. При одинаковых портах сниффер, файрвалл и сервер на другом конце показывают что пакета не было. WSAGetLastError выдает 0. В документации тоже не нашел внятного описания данной ситуации.


Проверь, что game_sock у тебя не локальный адрес.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re[2]: Sendto после bind при одинаковых портах.
От: AtomKrieg  
Дата: 13.06.05 16:50
Оценка:
Здравствуйте, 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
Re: Sendto после bind при одинаковых портах.
От: AtomKrieg  
Дата: 14.06.05 22:04
Оценка:
Тему можно закрывать. Как выяснилась причина не ошибки в коде, а правило в файрволле, непонятно откуда взявшееся.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.