LINUX.ORG.RU

Клиентский TCP сокет, send или recv?

 , , ,


0

3

Вот есть простой tcp клиент, самый обычный socket(..), connect(..) а что дальше нужно , send или recv?

Во всех мануалах «учим сокеты» после connect идет send, т.е. мы отправляем какие-то данные серверу. Но, вот я пробую соединиться с сервером DAYTIME (13 порт), там если идет запрос send, то до запроса recv уже не доходит, сервер разрывает соединение. И как быть? Если начинать общение с сервером с recv, тогда (если сервер ожидает от нас данные) вызов recv подвесит клиента на бесконечное время.

Запутался уже совсем.

Причем Perl как-то умеет это обрабатывать, там идет send-recv, но ответ получаю. А на Си - никак, обрыв соединения сразу после send..

zer0cat ()
Ответ на: комментарий от zer0cat

А почитать протокол DAYTIME (13 порт) тебя вот наглухо отбило? О_о

Либо, значит, что-то не то отправляешь-получаешь.

Anoxemian ★★★★★ ()

Что тебе нужно сделать то и пишешь.

firkax ★★★ ()

тебе нужно читать как делать таймаут на recv

и хотя у меня есть где-то свой код на это дело, но проще привести из инета

основной смысл в использовании неблокирующего сокета и функций ожидания poll или select на файловых дескрипторах.

ты встаешь в ожидании на неблокирующем сокете с неким таймаутом. из функции (poll/select) ты вернешься или если пришло событие(то есть данные в сокет) или произошла ошибка или закончился таймаут(интервал ожидания)… короче читай доки.

если все нормально - то читаешь из сокета данные, в остальных случаях - сам решаешь что делать.

тут вот обсуждается https://stackoverflow.com/questions/2876024/linux-is-there-a-read-or-recv-from-socket-with-timeout

примерно так -

struct pollfd fd;
int ret;

fd.fd = mySocket; // your socket handler 
fd.events = POLLIN;
ret = poll(&fd, 1, 1000); // 1 second for timeout
switch (ret) {
    case -1:
        // Error
        break;
    case 0:
        // Timeout 
        break;
    default:
        recv(mySocket,buf,sizeof(buf), 0); // get your data
        break;
}

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

по poll смотри ман https://man7.org/linux/man-pages/man2/poll.2.html

alysnix ★★ ()
Последнее исправление: alysnix (всего исправлений: 1)

Подключаешься к серверу, с помощью send посылаешь запрос, потом с помощью recv читаешь ответ и отключаешься.

vbr ()

Запутался уже совсем.

А чего тут путаться - socket(..), connect(..) устанавливают физический канал связи. Далее вступает протокол обмена. Клиент посылает запрос и ждет ответа, или молча ловит то, что шлет сервер. Все это определяет протокол обмена!

sigurd ★★★★★ ()
Ответ на: комментарий от vbr

Подключаешься к серверу, с помощью send посылаешь запрос, потом с помощью recv читаешь ответ и отключаешься.

Ага - а сервер не ждет никаких запросов и на send() - обрывает канал. Или запросы идут по другому каналу.

sigurd ★★★★★ ()
Последнее исправление: sigurd (всего исправлений: 1)
Ответ на: комментарий от zer0cat

Причем Perl как-то умеет это обрабатывать, там идет send-recv, но ответ получаю. А на Си - никак, обрыв соединения сразу после send..

strace в зубы и вперёд.

utf8nowhere ★★★ ()
Ответ на: комментарий от alysnix

Спасибо, поизучаю, так то юзал сугубо блокирующие сокеты.

zer0cat ()
Ответ на: комментарий от zer0cat

вопрос в универсальности

Универсальность протоколов? Бред, конечно, так не бывает.

Anoxemian ★★★★★ ()
Ответ на: комментарий от zer0cat

Какие именно данные ты посылаешь с помощью send() и зачем?

i-rinat ★★★★★ ()
Ответ на: комментарий от zer0cat

Наверное как-то не так посылаешь. Тем более если в перле работает.

vbr ()

Если начинать общение с сервером с recv, тогда (если сервер ожидает от нас данные) вызов recv подвесит клиента на бесконечное время.

Судя по rfc сервер не ожидет данные от клиента если обмен по tcp

tyamur ★★ ()

Всем спасибо за ответы, понял что универсальных вещей не бывает, нужно смотреть RFC под конкретный протокол. Тему можно закрывать.

zer0cat ()
Ответ на: комментарий от zer0cat

сокеты асинхронные, вы можете как читать так и писать одновременно в разных потоках.

anonymous2 ★★★★★ ()

ощущается недостаток основ. очень рекомендую вот эту книгу…

UNIX: Разработка сетевых приложений (Уильям Стивенс)

сам по ней учился 20 лет назад.

в гугле полно ресурсов, где ее можно скачать бесплатно

upd: тут выше в комментариях эту книгу уже порекомендовали :)

ergo ★★ ()
Последнее исправление: ergo (всего исправлений: 1)
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.