当前位置: 技术问答>linux和unix
socket收发出现乱码的问题,麻烦大家看看
来源: 互联网 发布时间:2016-01-24
本文导语: 这个程序主要是实现通过两台机子聊天的功能 接收程序: void *process_r(void* a) { assert(NULL != a); MSG msg; int sockfd = static_cast(a)->fd; for(;;) { A: if(r...
这个程序主要是实现通过两台机子聊天的功能
接收程序:
void *process_r(void* a)
{
assert(NULL != a);
MSG msg;
int sockfd = static_cast(a)->fd;
for(;;)
{
A: if(recv(sockfd,&msg.length,sizeof(msg.length),0) == -1)
{
perror("recv");
return(NULL);
}
if(0 == msg.length)
{
goto A;
}
pthread_testcancel();//设置线程安全取消点
msg.data = new char[ntohl(msg.length)];
if(recv(sockfd,const_cast(msg.data),sizeof(*msg.data)*ntohl(msg.length),0) == -1)
{
perror("recv");
return(NULL);
}
string words_recv(msg.data);
if(!words_recv.empty())
{
// pthread_mutex_lock(&static_cast(a)->mutex);
coutwritechar;
// pthread_mutex_unlock(&static_cast(a)->mutex);
msg.data =const_cast(writechar.c_str());
int len = htonl(strlen(msg.data));
pthread_testcancel();//设置线程安全取消点
D: if(-1 == send(sockfd,&len,sizeof(len),0))
{
goto D;
}
if(-1 == send(sockfd,(void*)msg.data,strlen(msg.data),0))
{
perror("send");
return(NULL);
}
writechar.erase();
}
return(NULL);
}
其中MSG为自定义结构体,包含了发送字符的长度int length和发送字符string data。先在发送端求出要发送字符长度length,发给接受端,接收端根据其大小new一个char数组,然后发送端发送字符数据,接收端受到后放在char数组中。在服务器和客户端都创建两根线程,每根线程分别执行上面两个函数。
问题:前几次没问题,通话到3—4次后就在末尾出现乱码或者是上次发过来的数据,到最后在客户端自己输入的都成乱码了,但是发过去后服务器端显示正常,只是末尾有乱码,请问大家问题在哪里?
还有我想对cin和cout用互斥锁实现原子过程,我定义了个全局变量的互斥锁,用了后只能服务端向客户端发,,客户端发的服务端收不到,请问是怎么回事?
|
如果你的线程都是相同的功能,分配的内存都是一样大,一般一个进程能获得的系统内存为4G,按照这个大小算出你的最大线程数,超过则禁止创建线程
|
这种问题一般属于同步没有做好....
可能是接收端的数据没有显示就被下一组数据覆盖了...
网络间的同步最好还是用select做....
可能是接收端的数据没有显示就被下一组数据覆盖了...
网络间的同步最好还是用select做....
|
lz最好去了解一下虚拟内存技术,会解决你关于线程的问题。
|
关注中...
|
看样子问题解决了.... 学习