当前位置:  技术问答>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做....

|
lz最好去了解一下虚拟内存技术,会解决你关于线程的问题。

|
关注中...

|
看样子问题解决了.... 学习

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 麻烦帮我看一下这个socket编程为什么结果不正确
  • 一个很普通的问题,关于C/S的一个socket,编译可通过,就是连不上,麻烦各位看一下,急!!!
  • java命名空间java.net类socket的类成员方法: socket定义及介绍
  • re socket编程中 ACCEPT返回的socket与原socket(他参数中的)端口号一样吗?
  • java命名空间java.nio.channels类socketchannel的类成员方法: socket定义及介绍
  • libevent2需要从socket读一段数据写入一个socket中,同时发送给另一个socket
  • java命名空间java.nio.channels类serversocketchannel的类成员方法: socket定义及介绍
  • socket 通讯开发包 Simple Sockets
  • java命名空间java.nio.channels类datagramchannel的类成员方法: socket定义及介绍
  • C++ Socket 库 C++ Sockets
  • java命名空间java.net类socket的类成员方法: getsendbuffersize定义及介绍
  • vc做的的socket应用和unix下socket?
  • java命名空间java.net类socket的类成员方法: getreceivebuffersize定义及介绍
  • QSocketDevice ( int socket, Type type )中那个 int socket 是哪里来得?
  • java命名空间java.net类socket的类成员方法: gettrafficclass定义及介绍
  • socket编程 通过man socket, 没有找到socket函数的第一参数该填什么 怎样利用man手册
  • java命名空间java.net类socket的类成员方法: getport定义及介绍
  • 线程间可否通过管道传递SOCKET句柄?还有其他方式传递SOCKET么?
  • java命名空间java.net类socket的类成员方法: getlocalport定义及介绍
  • [FreeBSD] 大神,求解,control socket : can‘t to any socket
  • java命名空间java.net类socket的类成员方法: getinetaddress定义及介绍
  • 两个 Socket 互相通信,其中一个如何判断另一个 Socket 是否已经意外断开了连接?
  • java命名空间java.net类socket的类成员方法: isconnected定义及介绍
  • 大家帮忙推荐一本linux socket编程的入门书,我刚接触socket,谢谢!!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3