通过TCP接收和发送数据

时间:2014-01-15 23:32:54

标签: c sockets tcp

我的任务是通过客户端的TCP连接接收数据,然后将相同的值连续发送回客户端。这是一个基本代码,但我只是确定p1 [i]是否与p [i]具有相同的值,并将接收到的数据发送回客户端,因为我无法在明天之前对其进行测试。我刚刚将客户端的通信部分包括在内,而不是建立连接。

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;
}

2 个答案:

答案 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];
    }

同样,这完全没有任何结果,因为你在退出方法之前就已经这样做了,当它中声明的所有变量无论如何都会消失。

答案 1 :(得分:2)

  

我的任务是通过客户端的TCP连接接收数据,然后将相同的值连续发送回客户端。

这可能是你的任务,但这不是你的代码实际做的事情。您的代码存在很多问题:

    分配iResult时,
  1. len未初始化,因此recv()之后的循环无效。循环本身没用,因为它实际上没有做任何事情。

  2. recv()如果收到字节则返回>0,断开连接时返回0,错误时返回-1。您确实将>0记录为错误。

  3. send()报告错误/断开连接之前,您没有致电recv()。您需要在接收循环内移动send()

  4. 在调用recvbuf之前,您没有将任何数据从sendbuf复制到send(),因此您发送随机垃圾。您只有在调用recvbuf后才会将数据从sendbuf复制到send(),但您仍在使用len之前计算的无效recv()值叫,所以现在你可能会破坏随机记忆。

  5. 您在致电returnclosesocket()之前致电WSACleanup()

  6. 如果要做的只是在连接的生命周期内回显任何收到的数据,请尝试改为:

    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;
    }