真正高手才看(100分)

  • 主题发起人 主题发起人 我不自由
  • 开始时间 开始时间

我不自由

Unregistered / Unconfirmed
GUEST, unregistred user!
如果在无连结的情况下,采用异步方式接受数据,利用WSAAsyncSelect函数
获取网络数据的到达消息,如何可以做到不丢失数据。现在的情况,如果客户端
连续发送1000个数据包,服务端只能相应不到150个消息,而采用同步方式则一个包也不会丢:
如:

Rvalue:=1;
ioctlsocket(lsSocket,FIONBIO,Rvalue);

repeat
i:=recv(scoket,RecvBuf, sizeof(RecvBuf), 0);
if i<>socket_error then inc(j);
until j>=1000;
但是采用这种方式的话,cpu的负荷太重,不能够接受,有谁可以帮我想想办法
无论是降低cpu负荷也好,或者是减少丢包也好,我都给分
附:丢包原因局我分析,连续的数据因为发送的速度比较的快,很快就溢出接受缓冲区了
谁可以告诉我如何清除接受缓冲区呢,是不是使用recv就可以了呢
 
把你的循环放到一个单独的线程里面,每循环一次,就 Sleep(50)
~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~
CPU 占用率不会有明显变化(经我测试)
 
可是数据包丢了,必须保证可以接收到线上所有的数据包啊
你sleep(50),在sleep期间,已经丢了n个数据了
 
再次请教,实在是苦恼,我已经尝试了太多种的解决手段,
 
嗯,这个应该学学
 
问题不是出在Async接受,错在用Message而没有用Event
参考WSACreateEvent,WSACloseEvent,WSAWaitForMultipleEvents
用个Thread做,应该可以满足你的要求
 
我做的发送200M的大文件,中间没有SLEEP一样没有任何问题,(我是用阻塞式)
 
如果是异步要想不丢数据就比较困难,我劝你用重叠I/O处理或者用select来做,
这样就可以避免阻塞式的一些问题,放到一个专门的线程里,
 
同意张无忌的方法,用select。
其实当你调用select并设置了超时时间后,如果此时没有数据到达,程序将进入
内核方式,这和waitforxxxxx之类的函数一样基本不消耗cpu时间。
 
TO 我不自由
你的发送部分是不是有问题?
能把代码给我看看吗?
 
后退
顶部