这一直困扰着我,原因是我缺乏使用 c/c++ 的经验。
我不知道如何从另一个线程读取字符串。在这种情况下,线程来自连接到服务器线程的客户端。我已经能够毫无问题地传递整数。似乎无法弄清楚如何传递字符串。
从控制台读取字符串并需要发送到服务器的客户端:
cout << "Enter in an operation and number: \n ";
int x;
char str[20];
int len = strlen(str);
int result;
cin>>str;
cin>>x;
write(client_sock, &len, sizeof(int));
write(client_sock, str, len);
write(client_sock, &x, sizeof(x));
read(client_sock, &result, sizeof(result));
cout<<result;
需要读取字符串的服务器端,为了测试,我正在尝试将其发回,但我需要将其读入并将其与其他条件进行比较,以对我读入的数字执行操作。
int result;
int input;
int len;
char str;
read(client_sock, &input, sizeof(input));
read(client_sock,&len,sizeof(len));
char buf[sizeof(len)];
sscanf(buf, "%s", &str);
cout<<str;
result= input*input;
write(client_sock,&result,sizeof(result));
write(client_sock, buf, strlen(buf));
当然这是一项作业,我的教授告诉我将字符读入缓冲区并用 null 终止它。我不确定他所说的空终止是什么意思。我是否也正确地读入了缓冲区?
最佳答案
这里有一些提示
写作和阅读都需要做同样的步骤
例如首先在套接字上写入字符串的长度(字节数),我想在你的情况下,一个字节应该足以描述长度,然后将字符串写入一系列字节。如果你想让更大的字符串使用定义明确的长度数据类型而不是 int
,例如做你自己的类型并记住,如果你在平台之间进行通信,你可能需要考虑endianness .
到目前为止,您在写作方面的内容似乎还不错(我猜您遗漏了套接字的打开/绑定(bind)等):
write(client_sock, &len, sizeof(unsigned char));
write(client_sock, str, len);
在接收方,您首先读取长度,然后读取后续字节数:
read(client_sock, &len, sizeof(unsigned char));
char* buffer = new char[len + 1]; // create a buffer
read(client_sock, buffer, len);
buffer[len]='\0'; // terminate the string
现在您在缓冲区中获得了字符串,只需将其转换为 std::string。
std::string s = buffer;
delete [] buffer;
[免责声明:无意编写完整或可编译的代码只是为了展示原理]
这些是不正确的陈述:
char buf[sizeof(len)];
sscanf(buf, "%s", &str);
buf 未初始化且太小,因为 sizeof(len)
将仅返回 int
的大小,您实际上是从未初始化的缓冲区读取到具有以下内容的字符串一个字节的空间。这里不需要sscanf。
关于c++ - 在线程之间发送和读取字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8199736/