2011-11-20 48 views
0

这一直在杀死我,而我对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终止..也我正确地读入缓冲区?

回答

1

这里有一些指针

你需要做同样的步骤都当你写和读

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

你有这么远在写作方面有什么似乎确定(我猜你离开了开/结合的插座等):你先阅读长度的接收端

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。

+0

中读取的字符串的大小真棒,非常感谢您的帮助! – user975044

0

一个空结束的字符串是一个标准的C字符串......一连串字符,其次是作为一个普通的ASCII字符串“Hello”空字节

会是什么样子

0x48(H)
0x65(E)
0x6c(升)
0x6c(升)
0x6f(O)
0×00(NULL)

你可以看到,你需要的缓冲区您的字符串长度+ 1个字节(空终结)

+0

谢谢,但这几乎没有帮助..我只是将缓冲区大小设置为buf [sizeof(len)+1] ... len是在 – user975044

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)函数会更有用,因为这看起来像只是试图复制字符串。

相关问题