2014-01-15 199 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