
楼主可能没搞清楚,当每个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条就不发了等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)