急!急!急!winsock server 问题,用win api函数 两个请求同时到达,accept有问题,送500分(200分)

  • 主题发起人 主题发起人 alongxu
  • 开始时间 开始时间
A

alongxu

Unregistered / Unconfirmed
GUEST, unregistred user!
本人现在做了一个winsock server ,起了一个非阻塞socket,liston(s,1)
WSAAsyncSelect(S_SOCKzx,form1.Handle,WM_ASYNCIONOTIFYzx,FD_ACCEPT);
WM_ASYNCIONOTIFYzx:为自定义消息,在自定义消息函数中ACCEPT(),发现两个客户端请求同时到达,ACCEPT()只接收socket队列中第一个socket,而丢失另一个。请各高手指点,我的email为xuolong@163.com,最好今天能解决。
 
看你的处理周期有多久了。
从理论上来分析,每次得到接收消息后,需要对缓冲池里的数据进行处理,但是此处理不能局限于一条,如果仅处理一条就会出现你所描述的问题。
两个消息来得太接近,就会被处理成一个消息,但需要处理的内容却是两条。

非阻塞式的会有这样的问题。

还有一个需要注意的地方就是通讯的功能模块里要尽可能的减少处理环节。
 
请问如何处理多条?
 
不好意思,在具体的处理上我可能无法为你提供太多有益的帮助。我对于socket的经验主要来源于unix系统下,因此理论还算可以,但是实际通过delphi和windows api的这一套我不是很熟悉。

以前我的做法:一个server,多个client,server处于listen状态,若有一个client连接,则server派生出一子进程来面对该client,直到该client断开,则子进程结束。对于server来说,它还是一个顺序的处理过程,而对于它所派生的多个子进程来说,相互之间倒都是并发的。一个端口上的连续两个请求,可能消息会被合并处理,但是队列中的两个请求还是存在的。在accept的过程中,数据结构应该会记录下是对应于两个请求的。
如果你的设计思路没有问题的话,应该不会出现你所描述的现象。
 
原因我已找到,因为我在Tsocketthread中又创建了一个非阻塞SOCKET,用于与第三方通讯,在CONNECT后,用select来判断是否连接成功,只要执行select就会出现数据乱发现象。不知如何解决?
 
用select的效率是比较低的,建议用事件通知的模式。
 
请问superatom,在线程中用事件来判断socket状态,是否以消息驱动事件,而DELPHI中消息都是基于窗体的,在线程中如何定义消息,捕获指定socket的网络事件。另外我现在暂时把程序作了修改,不再起线程来与第三方通信,而是另开一个FORM来代替,测试下来同时有六个CLIENT并发连续发收信息没有问题,开到7-10个并发连续发收client端就有connect失败的现象,10*100中有30个左右connect失败,是否受delphi中 winsock中Maximum queue length specifiable by listen影响,delphi中默认为5,如何改得大一点.
 
后退
顶部