recv函数总是给我相同的缓冲区

时间:2015-06-11 09:06:25

标签: c++ sockets winsock winsock2

这个问题是我之前提出的一个问题的后续问题。基本上我有一个在ubuntu中运行的c ++服务器,我现在正试图让这个代码在windows中运行。我在使用Windows套接字时遇到了一些问题,因为它是我第一次使用它们。刚刚接收到套接字数据的麻烦后,我现在面临一些奇怪的事情:我传递给recv()的缓冲区总是包含相同的数据。

当然,我已经检查了我的客户端,它确实发送了不同的东西。 所以我一直在尽我所能得到一些可以帮助我找出错误的东西。我在控制台上打印了recv()收到的字节数,并猜测它正在按预期变化!所以我现在有点困惑,如果我传递给recv()的缓冲区的内容总是相同的话,我不太明白收到的字节数会有所不同。想要帮助找出原因。

这是我的代码:

int tcp_server::acceptConns()
{
    sockaddr_in from;
    bool infinite = true ;
    int fromlen=sizeof(from);
    /* Infinte loop to echo
 the IP address of the client */

    int readsize;
    char* message;
    char* clientmessage = (char*) malloc(256*sizeof(char));
    string smatrix ;
    int ind ;
    string tok;
    int i = 0 ;
    int bytesSent ;

    float matrix[16] ;
     do {
        readsize = recv(ClientSocket, clientmessage, 256, 0);
        if (readsize > 0) {
            printf("Bytes received: %d\n", readsize);
            message = "ack";
            bytesSent = send(ClientSocket, message, strlen(message),0);
            if(bytesSent == 0){
                std::cerr << "Error sending ACK" << endl ;
            }
            smatrix = clientmessage ;
            std::stringstream ss(smatrix);
            while(getline(ss, tok, ',') && i < 16 ){
                matrix[i] = static_cast<float>(::atof(tok.c_str()));
                i++ ;
            }
            coutMessage(matrix);
            message ="ok";
            bytesSent = send(ClientSocket, message, strlen(message),0);
            if(bytesSent == 0){
                std::cerr << "Error sending OK" << endl ;
            }
        }
        else if (readsize == 0)
            printf("Connection closing...\n");
        else  {
            printf("recv failed with error: %d\n", WSAGetLastError());
            closesocket(ClientSocket);
            WSACleanup();
            return 1;
        }

    } while (readsize > 0);

    // shutdown the connection since we're done
     readsize = shutdown(ClientSocket, SD_SEND);
     if (readsize == SOCKET_ERROR) {
        printf("shutdown failed with error: %d\n", WSAGetLastError());
        closesocket(ClientSocket);
        WSACleanup();
        return 1;
    }

    // cleanup
    closesocket(ClientSocket);
    WSACleanup();
    return 0 ;
}

Thansk提前为你提供帮助。

1 个答案:

答案 0 :(得分:4)

while(getline(ss, tok, ',') && i < 16 ){
    matrix[i] = static_cast<float>(::atof(tok.c_str()));
    i++ ;
}

由于您从未重置i,因此matrix将在第一次之后永远不会更新。 recv没问题。