gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 22:48:09 26 4
gpt4 key购买 nike

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

在我的套接字类中,除了发送和接收函数外,所有函数都运行良好。他们不返回错误;相反,它只发送前四个字节的数据。

我的发送函数:

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 终止。

现在,这是读取方法:

 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 个字节。有没有更好的方法来发送或接收数据?我忽略了一个非常简单的错误?

感谢您的帮助!

最佳答案

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

而且你不应该通过 buffer作为参数,因为它不会被修改(而且你还不知道大小)

此外,您必须在收到消息时以 null 终止。

我会这样做:

 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::string 完成或 std::vector<char>避免newdelete

关于C++ 套接字只发送前 4 个字节的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40877015/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com