socket收发出现乱码的问题,麻烦大家看看
这个程序主要是实现通过两台机子聊天的功能
接收程序:
void *process_r(void* a)
{
assert(NULL != a);
MSG msg;
int sockfd = static_cast <multi_data *> (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 <char*> (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 <multi_data *> (a)-> mutex);
cout < < "收到: " < <words_recv < <endl;
pthread_mutex_unlock(&static_cast <multi_data *> (a)-> mutex);
}
words_recv.erase();
// pthread_mutex_unlock(reinterpret_cast <pthread_mutex_t*> (&static_cast <multi_data *> (a)-> mutex));
delete []msg.data;
msg.data = NULL;
}
return(NULL);
}
发送程序:
void * process_s(void* a)
{
assert(NULL != a);
int sockfd = static_cast <multi_data *> (a)-> fd;
for(;;)
{
string writechar;
MSG msg;
// pthread_mutex_lock(&static_cast <multi_data *> (a)-> mutex);
cin> > writechar;
// pthread_mutex_unlock(&static_cast <multi_data *> (a)-> mutex);
msg.data =const_cast <char*> (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用互斥锁实现原子过程,我定义了个全局变量的互斥锁,用了后只能服务端向客户端发,,客户端发的服务端收不到,请问是怎么回事?
[解决办法]
这种问题一般属于同步没有做好....
可能是接收端的数据没有显示就被下一组数据覆盖了...
网络间的同步最好还是用select做....
[解决办法]
关注中...
[解决办法]
如果你的线程都是相同的功能,分配的内存都是一样大,一般一个进程能获得的系统内存为4G,按照这个大小算出你的最大线程数,超过则禁止创建线程
[解决办法]
看样子问题解决了.... 学习
[解决办法]
lz最好去了解一下虚拟内存技术,会解决你关于线程的问题。