关于 WinSock 的几个疑问,大家一定遇到过。那位高手能给我正确答案?
研究WinSock两天了,有一点收获,也有几个疑问,希望和大家讨论。
1、关于ConnectionRequest事件:
我的理解是,仅当客户端计算机请求连接(也就是执行了Connect方法)时才发生。
可是此时客户端的State是6(sckConnecting),如果因为某种原因客户端没有达到State 7(sckConnected),服务器端应该怎样判断客户端到底有没有成功连接?
客户端成功连接之后 SendData 一个信息,服务器端收到之后,就可以判断“已经成功连接”了吧?
2、关于WinSock控件数组的加载
我的服务器端把myWinSock(0)作为侦听用,LocalPort设定为“1001”。当客户端成功连接之后,动态加载WinSock控件。(myWinSock(0)只作为侦听)
动态加载的新的WinSock控件的 LocalPort 应该怎么设定?
有的例程将实际通信的WinSock控件的 LocalPort 与侦听用设定的相同。那么所有的客户端都使用服务器端的一个共同的端口对外通信,难道不会相互干扰吗?
我的方法是,每一个新加载的控件数组的 LocalPort 都加1,也就是:
myWinSock(0).LocalPort = 1001 '侦听用
Load myWinSock(N)
myWinSock(N).LocalPort = myWinSock(0).LocalPort + N '实际通信用
可是,如果我指定的端口刚好被其他程序使用,会出现什么状况?
3、将数据发送给远程计算机的 SendData 方法
每次使用服务器端和客户端任何一方的 SendData 方法,我都判断是否状态为7:
If myWinSock.State = sckConnected Then
SendData Data:= "Hello "
DoEvents
End If
我到底需不需要每次都判断状态?如果状态不是7,执行 SendData 方法会不会出错?
DoEvents是不是必需的?
4、关于 DataArrival 事件:
服务器端和客户端任何一方,是不是激活了 DataArrival 事件就意味着两方的连接没有问题?
执行 GetData 时我需不需要判断状态是不是7,需不需要执行之后加上 DoEvents?
[解决办法]
1. 通过stste判断,能send且不出错说明已经连接
2. 不需要设定,或者说,设定为0,windows会自动分配
3. 这个随便,如果没连接就send,会有错误发生
4. 除非有特别要求(winsock有bug,有时候state为6的时候就可以触发data_arrival事件,几率取决于人品,我人品还好,暂时没碰到过),否则不需要
[解决办法]
楼上的搞笑!
对WinSock控件做任何操作之前检查状态是个好习惯,用错误处理也可,不过还是觉得能够自己处理的就自己处理。
[解决办法]
1.是否连接成功有一个事件有一个事件 Connect 客户端连接成功会触发这个事件
2。不需要设置 设置有时候会出错
3。2个都是必须 你不知道 服务器是否把你的连接断开 因此 加上此判断 2各作用 1避免错误 2断线重连,doevents是处理消息并发的一个方法,只是解决暂时问题 但是解决不了根本
4。DataArrival 这个事件 是当一个数据包 senddate以后发生 因此有可能 在状态为6的时候触发 我想不是bug 这个事件 我 一般不用 一般用在需要分包处理的时候 如文件 的分包 我还见到有人用这个事件作发送的缓存 解决有时候 加上了doevents还会出现并发的情况