2013-01-01 39 views
0

我正在寫一個非阻塞聊天服務器,到目前爲止服務器工作正常,但我不知道如何糾正部分發送,如果他們發生。 send(int,char *,int);函數總是在成功時返回0,在發送失敗時返回-1。我讀過的每個文檔/手冊頁都說它應該返回實際送入網絡緩衝區的字節數。我已經檢查確認我可以發送到服務器並重復收回數據而沒有任何問題。伯克利插座發送返回0成功非阻塞發送

這是我用來調用send的函數。我都試圖首先將返回數據打印到控制檯,然後嘗試換行返回ReturnValue;同時調試。同樣的結果,ReturnValue始終爲0或-1;

int Connection::Transmit(string MessageToSend) 
{   
    // check for send attempts on a closed socket 
    // return if it happens. 
    if(this->Socket_Filedescriptor == -1) 
     return -1; 

    // Send a message to the client on the other end 
    // note, the last parameter is a flag bit which 
    // is used for declaring out of bound data transmissions. 
    ReturnValue = send(Socket_Filedescriptor, 
         MessageToSend.c_str(), 
         MessageToSend.length(), 
         0); 

    return ReturnValue;   
} 
+1

當返回值是-1時,你會得到什麼錯誤?檢查'errno'的值或使用'perror' –

+1

當'send'返回'-1'時,你應該在POSIX系統(例如Linux或OSX)上檢查'errno',或者在Windows上使用'WSAGetLastError'。這將幫助你瞭解哪裏出了問題。 –

+0

'send(int,char *,int);'不完全是Berkeley Socket'send'。你在使用哪個平臺?你是否嘗試過使用'write'而不是'send'? –

回答

0

爲什麼不嘗試發送循環?例如:

int Connection::Transmit(string MessageToSend) 
{   
    // check for send attempts on a closed socket 
    // return if it happens. 
    if(this->Socket_Filedescriptor == -1) 
     return -1; 

    int expected = MessageToSend.length(); 
    int sent  = 0; 

    // Send a message to the client on the other end 
    // note, the last parameter is a flag bit which 
    // is used for declaring out of bound data transmissions. 
    while(sent < expected) { 
     ReturnValue = send(Socket_Filedescriptor, 
         MessageToSend.c_str() + sent, // Send from correct location 
         MessageToSend.length() - sent, // Update how much remains 
         0); 
     if(ReturnValue == -1) 
     return -1; // Error occurred 
     sent += ReturnValue; 
    } 

    return sent;   
} 

這樣,你的代碼會不斷地嘗試,直到發生任何錯誤,或所有數據成功發送到發送的所有數據。

+0

我首先嚐試了類似的東西。我的服務器進入了一個無限循環,我的客戶端被重複發送同樣的消息而被垃圾郵件扼殺。由於返回始終爲0,儘管每次嘗試都發送所有數據。 – user1908813

+0

對不起 - 我修改了我原來的帖子。我添加了一個簡單條件來檢查0.請記住,如果'send'調用返回0,那麼套接字已關閉。 – RageD

+0

其實如果這是我得到的結果,那麼它不會是一個問題。在我的情況下,套接字保持打開,併爲將來的讀取和寫入功能儘管0 – user1908813