Я работаю над проектом, в котором партнер предоставляет службу в качестве сокет-сервера.И я пишу клиентские сокеты, чтобы общаться с ним.Связь осуществляется двумя способами: я отправляю запрос на сервер, а затем получаю ответ от сервера.
Проблема в том, что я отправляю данные на сервер, но, очевидно, сервер не может получить данные.
Со своей стороны, я просто использую очень простую реализацию, как в примере с 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 и выполнить сброс?
илисокет сервера должен использовать «небуферизованный» поток?
спасибо за любые предложения и советы!