Господа, прошу прощения, если вопрос слишком туп.Мне надо накатать программку типа ping, которая посылала бы UDP пакет и ждала ответ, причем с минимальными изменениями работала бы под winsock и Unix. Порт dest/src должен быть всегда 3386 ( это GTP, если интересно ). Я делаю socket, bind, sendto, select и recvfrom. Кстати, пока это всё под Windows, sorry. Нужный пакет посылается ( я его вижу на приборе ) , select говорит - можно читать ( хотя ответа нет ) , recvfrom не блокируется но и не читает, код ошибки от WSAGetLastError "Connection reset by peer". Попробовал разблокировать сокет с помощью ioctrlsocket - ничего не меняется. Какой коннекшн, какой пир - ничего не понимаю, чайник я в этом деле. А надо мне или слететь по таймауту или прочесть чего - нибудь. Как бы этого добиться ???
А bind тебе зачем ? Ты же клиента пишешь ?
Типа, socket, sendto и recvfrom хватит. Если у тебя один сокет, то select тоже можно не пользовать.
>А bind тебе зачем ? Ты
>же клиента пишешь ?
Bind ом я устанавливаю порт отправителя ( просто не знаю как по другому, а надо )
>Типа, socket, sendto и recvfrom хватит.
>Если у тебя один сокет,
>то select тоже можно не
>пользовать.
А КАК ПОДОЖДАТЬ ОТВЕТА И ЕСЛИ ЕГО НЕТ, ДВИГАТЬ ДАЛЬШЕ ??!!
1. bind создает сокет для сервера, который получает SYN-пакеты, пришедшие на этот порт :))
Вообще сокеты и порты - это разные понятия.2. для задания timeout при ожидании действительно лучше пользовать select. У него есть такой параметр.
>1. bind создает сокет для сервера,
>который получает SYN-пакеты, пришедшие на
>этот порт :))
SYN-пакеты в UDP ??!! это я не понял
>Вообще сокеты и порты - это
>разные понятия.
Это я понял
Согласен - про SYN-пакеты я прогнал :))
Это для TCP :))
Вобщем, на клиенте bind тебе все равно не нужен.
UDP? WSAConnReset oznachaet, chto korrespondent ne slushaet na etom portu. Bind tebe ne nuzhen, esli tebe ne nuzhen specificheski port na kliente:Client Server
s=socket s=socket
bind(s,3386)
while(1) while(1)
{ {
send(s,data); select(s,read);
select(s,read); read(s);
if(ok) read(s,data); if(ok)
send (s,reply,clientIP);
}
Незнаю как в win, но в linux/freebsd об отсутствии слушалки говорит сообщение "Connection refused" ("в соединении отказано"), а "Connection reset by peer" (если правильно помню) говорит о закрытии сервером соединения ("сервер сбросил соединение").
А вообще к UDP эти понятия пожалуй неприменимы.
>Незнаю как в win, но в
>linux/freebsd об отсутствии слушалки говорит
>сообщение "Connection refused" ("в соединении
>отказано"), а "Connection reset by
>peer" (если правильно помню) говорит
>о закрытии сервером соединения ("сервер
>сбросил соединение").
>А вообще к UDP эти понятия
>пожалуй неприменимы.
Primenimy. Esli UDP socket ne otkryt i OS TCP stack podderzhivaet/razreshaet ICMP error messages, to posylatelu paketa budet poslana oshibka, kotoraya na socket layer budet vozvraschena kak "Connection reset".
Вообще конечно сообщение "Connection reset by peer" - тот ещё прикол :-). Никакого конекшена тут и близко быть не может, т.к. UDP. Ты ничего не сказал про сервер. Может дело в нём? Ты случайно не пытаешься отправить UDP-сообщение на TCP-порт? (извини, но ты сам сказал, что чайник в этом деле)