2010-10-29 102 views
0

我正在合作伙伴提供服務作爲套接字服務器的項目。我編寫客戶端套接字來與它進行通信。通信有兩種方式:我向服務器發送請求,然後從服務器接收響應。客戶端套接字發送數據,但服務器套接字不接收它們。 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中並沖洗?

或服務器套接字應該使用「無緩衝」流?

感謝您的任何建議和意見!

+0

由於'recv'和'send'是低級函數,它們可以讓您完全控制通過套接字傳輸的數據,因此不應該有任何使用它無法實現的功能。在不知道'server_socket_io','receive_data'和'response_data'的類型的情況下,不可能確切地知道它們是如何格式化數據的,而且也不知道用'send'發送的緩衝區的內容,所以不可能知道那裏存在什麼材料差異介於兩種實現之間。你能發表一些表現差異的代碼嗎? – 2010-11-01 07:53:14

回答

3

除了Jay的回答,你可以嘗試任何網絡數據包嗅探器,並檢查你的數據包是否到達服務器。看看wireshark或tcpdump。

+0

服務器端使用iostram和streambuf封裝套接字,開始時我擔心streambuf :: underflow()可能無法正確實現。然後,我使用wireshark監控數據包流量,發現客戶端確實發送了數據包,服務器也應該收到數據包。突然間,我發現客戶端發送的數據包在某種程度上與應用程序不同(針對特定的協議),然後我很容易地確定了問題,因爲我剛發送了錯誤的數據包內容,服務器無法識別它(因此無法處理它)。 – elgcom 2010-11-05 08:35:05

+0

那真是一個簡單的失敗!它甚至不是關於套接字的東西!但是使用wireshark或tcpdump來查看數據包始終是縮小問題的好主意。因此,我以你的建議作爲我的回答:P – elgcom 2010-11-05 08:37:37

+0

@elgcom很樂於助人。 – Himanshu 2010-11-05 13:58:26

0

您應該檢查兩個系統的防火牆設置。他們可能不會傳遞您的數據。

+0

這不能成爲問題。我檢查過。 – elgcom 2010-10-30 06:22:28

2

讓我們用「分而治之」來解決問題。

首先,服務器是否工作?

從您的代碼中查找您的服務器正在偵聽的端口號。

啓動您的服務器程序。 運行下面的命令行程序,以查看服務器是否是聽:

的netstat -an -p tcp的

它會產生連接的列表。服務器運行時,您應該在選定的端口上看到連接。停止服務器並再次運行該命令以確保該端口不再被使用。

一旦你驗證了該服務器監聽嘗試使用以下命令連接到它:

telnet到你的服務器地址,在這裏你的端口數,這裏

的telnet將打印什麼您的服務器會在屏幕上發送給您,並將您輸入的內容發送回服務器。

這應該給你一些很好的線索。

1

我曾經有過類似的問題。我的問題是,我從來沒有「接受」服務器上的連接(TCP),以便在服務器/客戶端之間創建流。在我接受服務器端的連接後,所有事情都按照設計工作。

相關問題