C ++套接字只发送前4个字节的数据

时间:2016-11-29 22:32:23

标签: c++ sockets

我目前正在用C ++ for Linux编写套接字包装器。它基本上是一个类的集合,用于处理TCP套接字的创建,连接,发送,读取和关闭。

在我的socket类中,除了send和receive函数之外,所有函数都能正常工作。他们不会返回错误;相反,它只发送前四个字节的数据。

我的发送功能:

int Socket::sends(char* buffer){

    int bytes; // for number of bytes sent

    /* First, send the size of buffer */
    int datalen = strlen(buffer); // get sizeof buffer
    int len     = htonl(datalen); // reformat

    // send the size of the buffer
    bytes = send(socketfd, (char*)&len, sizeof(len), 0); // send the size
    if (bytes < 0){
        cerr << "Error sending size of buffer to socket" << endl;
        return 1;
    }

    /* Now acutally send the data */

    bytes = send(socketfd, buffer, datalen, 0);
    if (bytes < 0){
        cerr << "Error writing buffer to socket" << endl;
        return 1;
    }

    cout << bytes << " written" << endl;

    return 0;

}

它背后的想法是它通过首先发送缓冲区的大小,然后发送实际的缓冲区来发送缓冲区(char* buffer)。如果遇到错误(返回-1),则函数通过返回1来终止。

现在,这是read方法:

 int Socket::reads(char* buffer){

    int bytes, buflen; // for bytes written and size of buffer

    /* Read the incoming size */
    bytes = recv(socketfd, (char*)&buflen, sizeof(buflen), 0);
    if (bytes < 0){
        cerr << "Error reading size of data" << endl;
        return 1;
    }
    buflen = ntohl(buflen);

    /* Read the data */

    bytes = recv(socketfd, buffer, buflen, 0);
    if (bytes < 0){
        cerr << "Error reading data" << endl;
        return 1;
    }

    return 0;
}

这里的想法是首先读取数据的大小,然后将缓冲区设置为该大小并读入其中。该函数在出错时返回1(recv返回-1)。

使用这些方法看起来像这样:

socket.sends("Hello World"); // socket object sends the message

char* buffer;
socket.reads(buffer); // reads into the buffer

但是,当我使用这些函数时,我只接收前4个字节的数据,然后是奇怪的非ASCII字符。我不知道为什么会这样。 sendrecv函数中没有遇到错误,函数表示只写了4个字节。有没有更好的方式来发送或接收数据?我忽略了一个非常简单的错误?

感谢您的帮助!

1 个答案:

答案 0 :(得分:4)

您将未初始化的指针(buffer)传递给您的reads方法,这可能解释了它部分工作(未定义的行为)。

并且您不应该将buffer作为参数传递,因为它不会被修改(而且您还不知道尺寸)

另外,收到邮件时必须以空白方式终止邮件。

我会这样做:

 char *Socket::reads(){
    char* buffer;
    int bytes, buflen; // for bytes written and size of buffer

    /* Read the incoming size */
    bytes = recv(socketfd, (char*)&buflen, sizeof(buflen), 0);
    if (bytes < 0){
        cerr << "Error reading size of data" << endl;
        return 1;
    }
    buflen = ntohl(buflen);
    buffer = new char[buflen+1]; // +1 for the NUL-terminator
    /* Read the data */

    bytes = recv(socketfd, buffer, buflen, 0);
    if (bytes < 0){
        cerr << "Error reading data" << endl;
        return 1;
    }
    buffer[buflen] = '\0'; // NUL-terminate the string

    return buffer;
}

主要:

socket.sends("Hello World"); // socket object sends the message

char* buffer = socket.reads(); // reads into the buffer

不要忘记delete []缓冲区。

也可以使用std::stringstd::vector<char>来完成,以避免newdelete