gpt4 book ai didi

c++ - 通过套接字发送和接收字符串的子函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:20:17 25 4
gpt4 key购买 nike

我假设对于只有 1 个字节(一个字符)的消息,我将直接使用 read() 和 write()。

对于那些大小大于 1 字节的消息,我使用两个子函数通过套接字读取和写入它们。

例如,我让服务器构造一个名为 strcities(城市列表)的字符串并将其打印出来 --> 没什么奇怪的。然后将这个字符串的字节数发送给客户端,然后是实际的字符串。

客户端首先会读取字节数,然后才是实际的城市列表。

出于某种原因,我的代码有时有效,有时无效。如果可行,它还会打印出一些我不知道它们来自哪里的额外字符。如果没有,它会挂起并永远在客户端等待,而服务器会返回循环顶部并等待来自客户端的下一个命令。你能看看我下面的代码,让我知道我哪里做错了吗?

尝试阅读

string attempt_read(int rbytes) { // rbytes = number of bytes of message to be read
int count1, bytes_read;
char buffer[rbytes+1];
bool notdone = true;

count1 = read(sd, buffer, rbytes);

while (notdone) {
if (count1 == -1){
perror("Error on write call");
exit(1);
}
else if (count1 < rbytes) {
rbytes = rbytes - count1; // update remaining bytes to be read
count1 = read(sd, buffer, rbytes);
}
else {notdone = false;}
} // end while
string returnme;
returnme = string(buffer);
return returnme;
}

尝试写入

void attempt_write(string input1, int wbytes) { // wbytes = number of bytes of message 
int count1;
bool notdone = true;

count1 = write(sd, input1.c_str(), wbytes);

while (notdone) {
if (count1 == -1){
perror("Error on write call");
exit(1);
}
else if (count1 < wbytes) {
wbytes = wbytes - count1;
count1 = write(sd, input1.c_str(), wbytes);
}
else {notdone = false;}
} // end while
return;
}

最佳答案

1) string 类有一个方法 size() 将返回字符串的长度,因此您实际上不需要第二个 attempt_write 参数。

2) 你可以在消息之前传输消息的长度,或者你可以在消息之后传输一个终止 0,如果你只发送一个 ASCII 字符串。因为您的连接可能随时终止,所以最好在发送字符串之前发送准确的长度,这样您的客户就可以知道会发生什么。

3) 你使用什么编译器,允许 char buffer[rbytes+1]; ?标准的 C++ 需要 char buffer = new char[rbytes+1];并相应删除以避免内存泄漏。

4) 在您的代码中,第二个读取函数调用使用相同的缓冲区而不调整长度,因此您实际上覆盖了已经接收到的数据,并且只有在第一个函数调用中接收到所有数据时,该函数才会起作用.写入功能也是如此

我会建议这样的事情:

void data_read(unsigned char * buffer, int size) {
int readed, total = 0;

do {
readed = read(sd, buffer + total, size - total);
if (-1 == writted) {
perror("Error on read call");
exit(1);
}

total += readed;
} while (total < size);
}

string attempt_read() {
int size = 0;
data_read((unsigned char *) &size, sizeof(int));

string output(size, (char) 0x0);

data_read((unsigned char *) output.c_str(), size);

return output;
}

void data_write(unsigned char * buffer, int size) {
int writted, total = 0;

do {
writted = write(sd, buffer + total, size - total);
if (-1 == writted) {
perror("Error on write call");
exit(1);
}

total += writted;
} while (total < size);
}

void attempt_write(string input) {
int size = input.size();
data_write((unsigned char *) &size, sizeof(int));
data_write((unsigned char *) input.c_str(), size);
}

关于c++ - 通过套接字发送和接收字符串的子函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27329884/

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