Я работаю над проектом, где партнер предоставляет услугу в качестве сервера сокетов. И я пишу клиентские сокеты для связи с ним. Сообщение имеет два направления: я отправляю запрос на сервер, а затем получаю ответ от сервера.Клиентский сокет отправляет данные, но серверный сокет не получает их. C++ буферизованный поток?
Проблема в том, что я отправляю данные на сервер, но, по-видимому, сервер не может получить данные.
С моей стороны я просто использовать очень простую реализацию так же, как, например, из 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 и буферизуется поток , (То есть гнездо посыла/RECV делается в iostream :: записи/чтения.)
server_socket_io >> receive_data;
server_socket_io << response_data;
Btw, я получил тестовый клиент от своего партнера, и он обернут в iostream, а также. Клиент тестового сокета может без проблем общаться с сервером, но он должен делать iostream :: flush() после каждого сокета.
Но я хочу просто просто не обернуть мой сокет-клиент в iostream.
Мне просто интересно, возникает ли проблема с буферизацией iostream: данные не обрабатываются, поскольку данные, отправленные клиентским сокетом, находятся в очень небольшом количестве и все еще буферизованы.
Или это может быть проблемой? как я могу узнать, действительно ли я отправляю данные? мой клиентский сокет также буферизует данные?
Я пробовал некоторое «плохое» обходное решение с TCP_NODELAY, но это не помогло!
Как я могу решить проблему? с клиентской стороны? или на стороне сервера? Должен ли я закрыть сокет после отправки запроса и до получения ответа, чтобы данные были «сброшены» и обработаны?
или должен ли я обернуть мой сокет в iostream и сделать флеш?
или серверный сокет должен использовать «небуферизованный» поток?
благодарит за любые предложения и советы!
Как 'recv' и' send' являются низкоуровневыми функциями, которые дают вам полный контроль над данными, передаваемыми по вашему сокету, не должно быть ничего, чего вы не можете достичь с помощью. Не зная тип 'server_socket_io',' receive_data' и 'response_data', невозможно точно знать, как они форматируют данные и не видя содержимого буфера, который вы отправляете с помощью' send', невозможно узнать, какие материальные различия там находятся между двумя реализациями. Можете ли вы опубликовать код, который показывает различия? –