2011-09-25 46 views
0

這是我第一次使用套接字,並且在接受服務器端的連接時遇到問題。我的服務器一次只能接受一個連接。一旦接收到連接,當前日期和時間將被寫入套接字,然後客戶端會打印出從服務器收到的日期和時間。我的服務器具有下面的代碼:服務器使用accept()接受連接後的問題

cout << "Server: Waiting for connections." << endl; 
client_length = sizeof(client_address); 
connection_fd = accept(listen_fd, (struct sockaddr*)&client_address, (socklen_t*)&client_length); 
cout << "Server: Client connected" << endl; 

當我跑我的服務器,我得到下面的輸出:

./server& 
Server: Waiting for connections. 

後來,當我跑我的客戶,我得到下面的輸出:

./client 127.0.0.1 
Client: Connecting to: 127.0.0.1 
Client: Connected to server. 
Sun Sep 25 13:20:07 2011 

客戶端似乎打印出正確的數據,但服務器從不打印出連接的客戶端。這裏不對勁。另一個症狀是當我嘗試寫入管道(客戶端寫入,服務器讀取)時,客戶端發生管道故障錯誤。有什麼我失蹤?如果您想查看任何代碼,請詢問。

編輯:這是在strace下運行的服務器。接受印出後似乎沒有任何事情發生。奇怪的?

write(2, "Server: Socket created.", 23Server: Socket created.) = 23 
write(2, "\n", 1 
)      = 1 
bind(3, {sa_family=AF_INET, sin_port=htons(4007), sin_addr=inet_addr("0.0.0.0")}, 16) = -1 EADDRINUSE (Address already in use) 
write(2, "Server: Address and port bound t"..., 41Server: Address and port bound to socket.) = 41 
write(2, "\n", 1 
)      = 1 
listen(3, 100)       = 0 
write(2, "Server: Socket is now a listenin"..., 41Server: Socket is now a listening socket.) = 41 
write(2, "\n", 1 
)      = 1 
write(2, "Server: Waiting for connections.", 32Server: Waiting for connections.) = 32 
write(2, "\n", 1 
)      = 1 
accept(3, 

謝謝。

+0

嘗試運行下'strace'您的服務器綁定同一個端口在客戶端和獲取日誌的接受 – bdonlan

+2

後會發生什麼情況顯示更多的服務器代碼。 – cnicutar

+0

好吧,我用strace添加了運行服務器的輸出。 'accept(3,'是最後一個要輸出的東西,即使在與客戶端連接之後。我正在debian上開發這個代碼,但是當我嘗試在我的mac上運行它時奇怪地工作正常,你有什麼建議嗎? – Max

回答

1

這不應該發生。

甚至很難想象一個破損的情況,就像你有兩個服務器實例在運行,另一個在接受連接,但是新的實例不應該再次使用相同的端口號,所以你可能不驗證系統調用的返回值,但是接受應該失敗,並且你應該看到一個錯誤的客戶端連接的消息。所以,你在做什麼?

更新:YEPP ... -1 EADDRINUSE (Address already in use)

另一個實例正在運行,還是其他什麼東西使用該端口號。請與netstat聯繫。爲了上帝的緣故,請檢查這些電話的返回值。

+0

我的問題是,當我開始製作服務器時,我通過ssh進行了這樣的操作,並且我的連接一直在斷開,這導致運行ps的服務器實例沒有顯示(必須執行ps -A)。 – Max

+0

檢查'屏幕',它會讓你的生活更輕鬆'ssh' –

1

您的bindEADDRINUSE一起失敗,但您的服務器已打開。 將錯誤處理添加到您的代碼中,並可能更改您正在使用的端口。

另外,我建議你確保你不被意外

+0

謝謝你這是正確的。我回答了上面的人回答,因爲他先回答了,但有一個投票。 – Max