GetData与PeekData都是用来读取对方发送过来的数据,唯一的区别是在TCP模式下GetData会去除已经读取的那部分数据。最后一个参数是要读取数据的长度,通过设置这个参数可以对读取进行精确控制。
TCP模式:
Winsock_Close事件只有在已经连接的状态下对方关闭连接才会触发。在这个事件处理中不可以弹出对话框,否则会陷入死循环。
UDP模式:
收到数据包触发DataArrival事件时,RemoteHostIP和RemotePort不可以立即使用,只有在调用了GetData之后才可以使用。(不知道为何要这么设计,也许有某种目的。)
在某些情况下,点对点互发数据包时,如果一方重启程序(或者其他原因)可能会导致另一方发送的数据包无法接受到。这是因为重启可能会导致IP地址和端口号的改变(没有给控件绑定具体端口时,每次启动端口号都是随机的),而对方的Winsock控件并没有更新默认发送的地址信息。所调用SendData发送的目的主机还是上次的。解决这个问题很简单,只要在DataArrival事件中先调用GetData读取数据(只有调用了GetData后RemoteHostIP才会有效。),然后把Winsock的RemoteHostIP赋值给RemoteHost就可以了。
在进行网络通信时,随着功能的增加,发送的参数也越来越复杂。如果仅用字符串拼接参数来发送会很麻烦,而且解析起来也费力。使用二进制按结构开保存参数也许是个不错的选择。但是VB操纵二进制数据有点力不从心。不过可以使用PropertyBag来简化二进制操作,使用这个对象你可以完全不用碰二进制操作,只需调用 WriteProperty 参数名,参数值 写入参数,然后用Winsock发送它的contents属性,收到数据后,反过来,把数据赋值给它的contents属性。然后就可以调用 ReadProperty(参数名) 读取传递过来的参数了。
爪机不给力,有补充或者错误留言呗,不明白的也可以留言,,,
最近在研究P2P通信,以及NAT打洞,有兴趣的一起交流下,,,
欢迎访问:www.u2nn.com
TCP模式:
Winsock_Close事件只有在已经连接的状态下对方关闭连接才会触发。在这个事件处理中不可以弹出对话框,否则会陷入死循环。
UDP模式:
收到数据包触发DataArrival事件时,RemoteHostIP和RemotePort不可以立即使用,只有在调用了GetData之后才可以使用。(不知道为何要这么设计,也许有某种目的。)
在某些情况下,点对点互发数据包时,如果一方重启程序(或者其他原因)可能会导致另一方发送的数据包无法接受到。这是因为重启可能会导致IP地址和端口号的改变(没有给控件绑定具体端口时,每次启动端口号都是随机的),而对方的Winsock控件并没有更新默认发送的地址信息。所调用SendData发送的目的主机还是上次的。解决这个问题很简单,只要在DataArrival事件中先调用GetData读取数据(只有调用了GetData后RemoteHostIP才会有效。),然后把Winsock的RemoteHostIP赋值给RemoteHost就可以了。
在进行网络通信时,随着功能的增加,发送的参数也越来越复杂。如果仅用字符串拼接参数来发送会很麻烦,而且解析起来也费力。使用二进制按结构开保存参数也许是个不错的选择。但是VB操纵二进制数据有点力不从心。不过可以使用PropertyBag来简化二进制操作,使用这个对象你可以完全不用碰二进制操作,只需调用 WriteProperty 参数名,参数值 写入参数,然后用Winsock发送它的contents属性,收到数据后,反过来,把数据赋值给它的contents属性。然后就可以调用 ReadProperty(参数名) 读取传递过来的参数了。
爪机不给力,有补充或者错误留言呗,不明白的也可以留言,,,
最近在研究P2P通信,以及NAT打洞,有兴趣的一起交流下,,,
欢迎访问:www.u2nn.com