URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 711
[ Назад ]

Исходное сообщение
"UDP sockets recvfrom() problem"

Отправлено Алексей Запруднов , 22-Апр-02 13:55 
Господа, прошу прощения, если вопрос слишком туп.Мне надо накатать программку типа ping, которая посылала бы UDP пакет и ждала ответ, причем с минимальными изменениями работала бы под winsock и Unix. Порт dest/src должен быть всегда 3386 ( это GTP, если интересно ). Я делаю socket, bind, sendto, select и recvfrom. Кстати, пока это всё под Windows, sorry. Нужный пакет посылается ( я его вижу на приборе ) , select говорит - можно читать ( хотя ответа нет ) , recvfrom не блокируется но и не читает, код ошибки от WSAGetLastError "Connection reset by peer". Попробовал разблокировать сокет с помощью ioctrlsocket - ничего не меняется. Какой коннекшн, какой пир - ничего не понимаю, чайник я в этом деле. А надо мне или слететь по таймауту или прочесть чего - нибудь. Как бы этого добиться ???

Содержание

Сообщения в этом обсуждении
"RE: UDP sockets recvfrom() problem"
Отправлено XMan , 22-Апр-02 14:25 
А bind тебе зачем ? Ты же клиента пишешь ?
Типа, socket, sendto и recvfrom хватит. Если у тебя один сокет, то select тоже можно не пользовать.

"RE: UDP sockets recvfrom() problem"
Отправлено Алексей Запруднов , 22-Апр-02 14:33 
>А bind тебе зачем ? Ты
>же клиента пишешь ?
Bind ом я устанавливаю порт отправителя ( просто не знаю как по другому, а надо )
>Типа, socket, sendto и recvfrom хватит.
>Если у тебя один сокет,
>то select тоже можно не
>пользовать.
А КАК ПОДОЖДАТЬ ОТВЕТА И ЕСЛИ ЕГО НЕТ, ДВИГАТЬ ДАЛЬШЕ  ??!!



"RE: UDP sockets recvfrom() problem"
Отправлено XMan , 22-Апр-02 18:02 
1. bind создает сокет для сервера, который получает SYN-пакеты, пришедшие на этот порт :))
Вообще сокеты и порты - это разные понятия.

2. для задания timeout при ожидании действительно лучше пользовать select. У него есть такой параметр.


"RE: UDP sockets recvfrom() problem"
Отправлено Алексей Запруднов , 23-Апр-02 10:24 
>1. bind создает сокет для сервера,
>который получает SYN-пакеты, пришедшие на
>этот порт :))
SYN-пакеты в UDP ??!! это я не понял
>Вообще сокеты и порты - это
>разные понятия.
Это я понял


"RE: UDP sockets recvfrom() problem"
Отправлено XMan , 23-Апр-02 15:32 
Согласен - про SYN-пакеты я прогнал :))
Это для TCP :))
Вобщем, на клиенте bind тебе все равно не нужен.

"RE: UDP sockets recvfrom() problem"
Отправлено genie , 23-Апр-02 03:59 
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);
    }


"RE: UDP sockets recvfrom() problem"
Отправлено XMan , 23-Апр-02 15:36 
Незнаю как в win, но в linux/freebsd об отсутствии слушалки говорит сообщение "Connection refused" ("в соединении отказано"), а "Connection reset by peer" (если правильно помню) говорит о закрытии сервером соединения ("сервер сбросил соединение").
А вообще к UDP эти понятия пожалуй неприменимы.

"RE: UDP sockets recvfrom() problem"
Отправлено genie , 24-Апр-02 01:32 
>Незнаю как в 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".


"RE: UDP sockets recvfrom() problem"
Отправлено David , 04-Май-02 19:58 
Вообще конечно сообщение "Connection reset by peer" - тот ещё прикол :-). Никакого конекшена тут и близко быть не может, т.к. UDP. Ты ничего не сказал про сервер. Может дело в нём? Ты случайно не пытаешься отправить UDP-сообщение на TCP-порт? (извини, но ты сам сказал, что чайник в этом деле)