клиентский сокет отправляет данные, но серверный сокет не получает их. c ++ буферизованный поток? - PullRequest
0 голосов
/ 30 октября 2010

Я работаю над проектом, в котором партнер предоставляет службу в качестве сокет-сервера.И я пишу клиентские сокеты, чтобы общаться с ним.Связь осуществляется двумя способами: я отправляю запрос на сервер, а затем получаю ответ от сервера.

Проблема в том, что я отправляю данные на сервер, но, очевидно, сервер не может получить данные.

Со своей стороны, я просто использую очень простую реализацию, как в примере с http://www.linuxhowtos.org/C_C++/socket.htm

#include <sys/socket.h>

socket_connect();

construct_request_data();

send(socket, request_data, request_length, 0/*flag*/); // I set flag as 0

// now the server should receive my request and send response to me    

recv(socket, response_data, response_length, 0);   

socket_close();

И похоже, что сокет сервера реализован с "привязкой" к std :: iostream, и этобуферный поток.(то есть сокет send / recv выполняется в iostream :: write / read.)

server_socket_io >> receive_data;

server_socket_io << response_data; 

Кстати, я получил тестового клиента от моего партнера, и он также обернут в iostream.Клиент тестового сокета может без проблем взаимодействовать с сервером, но он должен выполнять iostream :: flush () после каждой отправки сокета.

Но я просто хочу упростить задачу, чтобы не обернуть мой клиент сокетов в iostream.

Мне просто интересно, приводит ли проблема к буферизованному iostream: данные не обрабатываются, посколькуотправленный клиентский сокет находится в очень маленьком количестве и все еще буферизован.

Или это может быть моей проблемой?как я могу узнать, действительно ли я отправляю данные?мой клиентский сокет также буферизует данные?

Я попробовал «плохой» обходной путь с TCP_NODELAY , но это не помогло!

Как мне решить проблему?со стороны клиента?или на стороне сервера?Должен ли я закрыть сокет после отправки запроса и до получения ответа, чтобы данные были «сброшены» и обработаны?

или мне нужно обернуть мой сокет в iostream и выполнить сброс?

илисокет сервера должен использовать «небуферизованный» поток?

спасибо за любые предложения и советы!

Ответы [ 4 ]

3 голосов
/ 30 октября 2010

В дополнение к ответу Джея вы можете попробовать любой анализатор сетевых пакетов и проверить, поступают ли ваши пакеты на сервер или нет.Посмотрите на wireshark или tcpdump.

2 голосов
/ 01 ноября 2010

Давайте использовать «разделяй и властвуй» для решения проблемы.

Во-первых, работает ли сервер?

Из вашего кода найдите номер порта, который прослушивает ваш сервер.

Запустите серверную программу. Запустите следующую программу командной строки, чтобы увидеть, действительно ли сервер прослушивает:

netstat -an -p tcp

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

После того, как вы убедились, что сервер прослушивает, попробуйте подключиться к нему с помощью следующей команды:

telnet ваш-сервер-адрес-здесь ваш-порт-номер-здесь

telnet напечатает на экране то, что отправляет вам ваш сервер, и отправит то, что вы набрали, серверу.

Это должно дать вам несколько хороших подсказок.

1 голос
/ 04 ноября 2010

Однажды у меня была похожая проблема.Моя проблема заключалась в том, что я никогда не «принимал» соединение (TCP) на сервере для создания потока между сервером / клиентом.После того, как я принял соединение на стороне сервера, все заработало как задумано.

0 голосов
/ 30 октября 2010

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

...