在线程之间发送和读取字符串

时间:2011-11-20 05:51:27

标签: c++ string sockets buffer

这一直在扼杀我,我缺乏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终止的意思是什么...我也正确地读入缓冲区了吗?

3 个答案:

答案 0 :(得分:1)

这里有一些指示

你需要在写和读

时做同样的步骤

e.g。首先在套接字上写入字符串的长度(字节数),我想在你的情况下,单个字节应该足以描述长度,之后将字符串写成一系列字节。如果你想要更大的字符串使用数据类型的长度是明确定义的而不是int,例如做你自己的类型并记住,如果你在平台之间进行通信,你可能需要考虑{{3 }}

你在写作方面到目前为止看起来没问题(我猜你遗漏了套接字的开放/绑定等):

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。

答案 1 :(得分:0)

以null结尾的字符串是标准c字符串...一系列字符,后跟空字节

作为简单的ascii字符串“Hello”看起来像

0x48(H)
0x65(e)
0x6c(l)
0x6c(l)
0x6f(o)
0x00(NULL)

如您所见,您需要一个字符串长度为+ 1字节的缓冲区(空终止符)

答案 2 :(得分:0)

一些评论:

cout << "Enter in an operation and number: \n ";
int x;
char str[20];
int len = strlen(str);
int result;

我不了解C ++,但C不会自动为你归零。您的char str[20] ; int len = strlen(str);正在随机内存上运行strlen(3)。它可能包含一个字符串。它可能包含来自前一个调用堆栈的函数指针。它当然包含垃圾,并且在其上调用strlen()也会产生垃圾 - 甚至可能违反分段。

char str;
/* ... */
char buf[sizeof(len)];
sscanf(buf, "%s", &str);

同样,您已经分配了一个字符缓冲区,并立即将其初始化为sscanf(3)sscanf(3)将会读取垃圾,它所做的一切都可能是正确的。

此外,您尝试将字符串存储到单个字节(char str)中。您需要(a)将char str更改为char *str(b)实际为其分配一些内存。但也许strdup(3)函数会更有用,因为这看起来就像你只是想复制字符串一样。