2014-01-15 250 views
0

我的任務是通過來自客戶端的TCP連接接收數據,然後將相同的值連續發送回客戶端。這是一個基本代碼,但我只需確定p1 [i]是否與p [i]具有相同的值,並將接收到的數據發送回客戶端,因爲我無法在明天之前對其進行測試。我剛剛把通信部分包含在客戶端,而不是連接建立。通過TCP接收和發送數據

int main(int argc , char *argv[]) 
{ 
    WSADATA wsa; 
    SOCKET s , new_socket; 
    struct sockaddr_in server , client; 
    int c; 
    char iResult; 
    char recvbuf[DEFAULT_BUFLEN]; 
    int recvbuflen = DEFAULT_BUFLEN; 
    char sendbuf [DEFAULT_BUFLEN]; 
    int sendbuflen = DEFAULT_BUFLEN; 
    unsigned int i; 
    uint8_t* p; 
    uint8_t* p1; 
    int x=0; 
    int q=0; 
    size_t len; 

    p = (uint8_t*)recvbuf; 
    len= iResult/sizeof(uint8_t); 

    do 
    { 
     iResult = recv(new_socket, recvbuf, recvbuflen, 0); 
     { 
      for(i=0; i<len; i++) 
      { 
       p[i]; 
      }  
     } 
     if(iResult == 0) 
     { 
      wprintf(L"Connection closed\n"); 
     } 
     else 
     { 
      wprintf(L"recv failed with error: %d\n", WSAGetLastError()); 
     } 
    } 
    while(iResult > 0); 

    // Send uint8_t back data to client 
    p1 = (uint8_t*)sendbuf; 

    iResult = send(new_socket, sendbuf, sendbuflen, 0); 
    { 
     for(q=0; q<len; q++) 
     { 
      p1[q] = p[q]; 
     } 
    } 

    return 0; 

    closesocket(new_socket); 
    WSACleanup(); 
    return 0; 
} 
+0

而且你的問題是什麼? – EJP

+0

代碼是否將收到的數據發送回去? –

回答

2

我的任務是通過來自客戶端的TCP連接接收數據,然後將相同的值連續發送回客戶端。

這可能是你的任務,但這不是你的代碼實際上在做什麼。有很多的你的代碼的問題:

  1. iResult是初始化時len分配,所以recv()後你的循環是無效的。循環本身是無用的,因爲它實際上並沒有做任何事情。

  2. recv()返回>0如果接收的字節,0上斷開,並-1上錯誤。如果確實沒有,則記錄>0爲錯誤。

  3. 您沒有呼叫send()直到recv()報告了錯誤/斷開連接。您需要在接收循環內移動send()

  4. 在調用send()之前,您並未將recvbuf中的任何數據複製到sendbuf,因此您正在發送隨機垃圾。只有在send()被調用後,您纔會將數據從recvbuf複製到sendbuf,但您仍然使用在調用recv()之前計算的無效的len值,因此現在您可能會破壞隨機存儲器。

  5. 致電closesocket()WSACleanup()之前致電return

如果你想要做的就是回顯接收到的數據爲連接的生命週期那就試試這個來代替:

int main(int argc , char *argv[]) 
{ 
    SOCKET new_socket; 
    int iResult, len; 
    char recvbuf[DEFAULT_BUFLEN]; 
    char *p; 

    // establish connection ... 

    do 
    { 
     iResult = recv(new_socket, recvbuf, sizeof(recvbuf), 0); 
     if(iResult < 0) 
     { 
      wprintf(L"recv failed with error: %d\n", WSAGetLastError()); 
      break; 
     } 

     if(iResult == 0) 
     { 
      wprintf(L"Connection closed\n"); 
      break; 
     } 

     p = recvbuf; 
     len = iResult; 

     do 
     { 
      iResult = send(new_socket, p, len, 0); 
      if(iResult <= 0) 
      { 
       wprintf(L"send failed with error: %d\n", WSAGetLastError()); 
       break; 
      } 

      p += iResult; 
      len -= iResult; 
     } 
     while(len > 0); 
    } 
    while (true); 

    closesocket(new_socket); 

    WSACleanup(); 

    return 0; 
} 
2

代碼是否將所接收的數據?

不,它不會,因爲它從一個不同的緩衝區發送,也因爲它忽略由recv(),返回的長度,所以它可以發送任意垃圾。

大部分的代碼沒有開始道理:

for(i=0; i<len; i++) 
    { 
    p[i]; 
    } 

這正是實現什麼。

if(iResult == 0) 
    { 
     wprintf(L"Connection closed\n"); 
    } 
    else 
    { 
     wprintf(L"recv failed with error: %d\n", WSAGetLastError()); 
    } 

要打印的錯誤信息即使iResult > 0,這意味着接收到的數據和沒有錯誤。

for(q=0; q<len; q++) 
    { 
    p1[q] = p[q]; 
    } 

同樣,這正是完成什麼,因爲你這樣做,你退出方法,當它聲明的所有變量都將消失,反正之前。

+0

非常感謝您的回覆。爲什麼從一個不同的緩衝區發送問題?我遵循以下鏈接中的過程:http://msdn.microsoft.com/en-us/library/windows/desktop/ms740121(v=vs.85).aspx –

+0

@ user2292615:您沒有將接收的數據複製到您正在發送的緩衝區。您的發送緩衝區包含隨機垃圾,因爲您從不初始化它。您的代碼還存在其他問題。 –

+0

如果第二個緩衝區中有任何數據*,從第二個緩衝區發送數據不是問題。在這種情況下沒有。只是垃圾。您可以將數據從接收緩衝區複製到發送緩衝區,但爲何不從接收緩衝區發送並節省時間? – EJP