我目前正在用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字符。我不知道为什么会这样。 send
和recv
函数中没有遇到错误,函数表示只写了4个字节。有没有更好的方式来发送或接收数据?我忽略了一个非常简单的错误?
感谢您的帮助!
答案 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::string
或std::vector<char>
来完成,以避免new
和delete