我正在合作伙伴提供服務作爲套接字服務器的項目。我編寫客戶端套接字來與它進行通信。通信有兩種方式:我向服務器發送請求,然後從服務器接收響應。客戶端套接字發送數據,但服務器套接字不接收它們。 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;
順便說一句,我從我的合作伙伴測試客戶端,它被包裹在一個iostream的爲好。測試套接字客戶端可以毫無問題地與服務器通信,但它必須在每個套接字發送之後執行iostream :: flush()。
但我想保持簡單,不要將我的套接字客戶端封裝在iostream中。
我只是想知道緩衝的iostream是否會導致這個問題:數據不會被處理,因爲客戶端套接字發送的數據量非常小,並且仍然緩衝。
或者它可能是我的問題?我怎麼知道我是否真的發出數據?我的客戶端套接字是否也緩衝了數據?
我試過一些「壞」的解決方法TCP_NODELAY但它沒有幫助!
我該如何解決問題?從客戶端?或服務器端? 我應該在發送請求之後和接收響應之前關閉套接字,以便數據將被「刷新」並處理?
或者我應該將套接字包裝在iostream中並沖洗?
或服務器套接字應該使用「無緩衝」流?
感謝您的任何建議和意見!
由於'recv'和'send'是低級函數,它們可以讓您完全控制通過套接字傳輸的數據,因此不應該有任何使用它無法實現的功能。在不知道'server_socket_io','receive_data'和'response_data'的類型的情況下,不可能確切地知道它們是如何格式化數據的,而且也不知道用'send'發送的緩衝區的內容,所以不可能知道那裏存在什麼材料差異介於兩種實現之間。你能發表一些表現差異的代碼嗎? – 2010-11-01 07:53:14