为什么CSOcket接收信息会卡住

为什么CSOcket接收信息会卡住,第1张

楼主可能没搞清楚,当每个socket建立后会有一个发送缓冲区和一个接收缓冲区,windows系统默认是8KB,send调用成功以后数据并没有立即发出去,而只是把发送的数据复制到发送缓冲区,由 *** 作系统底层实现发送功能,发送到接受端的接收缓冲区。为了减轻网络负担,一般的TCP链接用了nagle算法,并不是发送缓冲区有数据就会发送的。

对于接收端来说,receive(char buf,num)只是从接收缓冲区里面取数据,返回的值就是取得的数据大小。你多次send,如果数据量不大,而num的值超过了发送的总值,那么就会一次取完接受缓冲区的数据。

不知道这样解释楼主清楚了没有。

C语言dup2()函数:复制文件描述词

头文件:

#include <unistdh>

定义函数:int dup2(int odlfd, int newfd);

函数说明:dup2()用来复制参数oldfd 所指的文件描述词, 并将它拷贝至参数newfd 后一块返回 若参数newfd为一已打开的文件描述词,

则newfd 所指的文件会先被关闭 dup2()所复制的文件描述词, 与原来的文件描述词共享各种文件状态, 详情可参考dup()

返回值:当复制成功时, 则返回最小及尚未使用的文件描述词 若有错误则返回-1, errno 会存放错误代码

附加说明:dup2()相当于调用fcntl(oldfd, F_DUPFD, newfd)

错误代码:EBADF 参数fd 非有效的文件描述词, 或该文件已关闭

你说的应该是tcp吧(udp请自己做流控)

send后要判断返回值,有可能缓冲区满了.或者对方处理不过来.

总之一句话,肯定不能循环发,而不管结果的.

还不明白的话,把问题描述清楚点.或贴代码.

receiveFrom 方法 读取数据的时候 如果缓冲区不够大 则会分好几次读取。

通过判断socketAvailable  来判断上次读取的数据还有多少未读取。如果Available ==0则本次读取完毕

可以将接收方法封装在一个类中(SocketClient),实例化类后在单个线程中运行。

  int recv;

  byte[] data;

 string receiveStr="";

 while (true)

      {

          //如果发送的字节已经完毕。则重置接收字符串,休眠线程重新等待数据

        if (mySocketAvailable == 0)

        {

           //重置前首先尝试写个事件或委托将这次接收的receiveStr传递出去

        OnDataReceived(receiveStr);//这个事件可以自己去补充

        

          receiveStr="";

          SystemThreadingThreadSleep(1);

          continue;

        }

        int bufferSize =1024;

        data = new byte[1024];

//接收数据到

        int recv = mySocketReceiveFrom((data,ref Remote));//Remote 为EndPoint对象 

        将该批次数据保存在receiveStr中

        receiveStr+=EncodingASCIIGetString(data,0,recv);

      }

    }

    

    

    //接收的类中 实例化上面的类并订阅

    SocketClient xxx=new SocketClient();

    //订阅接收事件

    xxxOnDataReceived+=new Hander(thisDataReceived);

    void DataReceived(string receive)

    {

       ConsoleWriteLine("接收到了收据:"+receive)

    }

建议你这样试试看:

加上异常捕捉:try{}catch{}finally{}

开个线程去发送

这样做的好处:

当send出现错误时,可以捕捉到错误信息,然后显示出来也不会卡死

以上就是关于为什么CSOcket接收信息会卡住全部的内容,包括:为什么CSOcket接收信息会卡住、c语言运行dup2(socket,1)卡住了是怎么回事、socket循环发送请求,如发送100条,发送了一部分,如60条的时候就卡住了不动了,后面40条就不发了等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9815745.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存