首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

socket收发出现乱码的有关问题,麻烦大家看看

2012-02-14 
socket收发出现乱码的问题,麻烦大家看看 这个程序主要是实现通过两台机子聊天的功能接收程序:void*process

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最好去了解一下虚拟内存技术,会解决你关于线程的问题。

热点排行