关于winsock中异步通信的一个怪问题的解决。

昨天练习了一天异步式网络通讯编程,在一个使用WSAAsyncSelect模式的程序中出现了问题,问题出现的很蹊跷,客户端可以和服务端连上,但就是触发不了服务器的自定义事件,但是如果手动用SendMessage去触发事件的话,一切正常,最初怀疑是代码问题,检查了好多遍,换了很多种方法,都没用,最后网上查了好多资料,代码改了又改,还是有问题,最后监视网络、抓包、查内存,反汇编。。。全用上了,但就是解决不了问题,无论怎么看,代码都是没问题的,最后无奈之中开了虚拟机,在虚拟机里的Red Hat和Windows Xp里分别尝试,郁闷的是在这两个OS里,程序运行一切正常,如果是这样的话,那就可以排除代码本身的问题了,肯定是开发环境的问题。首先反应的就是网络防火墙,但是防火墙却是关闭状态,最后进入高级防火墙,发现只有4个程序处于block状态,但是和我写的程序完全无关。


最后去查系统服务,用最笨的方法,把虚拟机里的XP和我用的win7的服务逐项对比,发现了win7中一个服务似乎和程序相关,服务名叫System event notification,这个服务的作用是监视事件,并通知COM+事件订阅控件,而且在官方的说明文档里明确说了这个服务和Syncronized Message相关,但问题是这个服务在我机器上居然启动不了。最后上网查了下,发现要重置winsock目录才能重新启动,而重置的方法是用NETSH命令,这个命令我过去没接触过,查阅了下,发现这个命令真是个万能网络命令,可以用这个命令执行所有的网络配置操作。而如果要重置winsock的话,则需要执行netsh winsock reset,执行之后需要重启,然后打开服务。


到此为止,问题算是解决了,自己也算得到了一些经验。在涉及操作系统组件的程序中,由于用户操作系统环境五花八门,因此程序的错误未必一定是程序本身的逻辑错误,而很有可能是操作系统本身组件的缺失或者服务设置等原因造成的,因此面对这种情况,最好在虚拟机里干净的系统测试一下软件,以减少不同环境对程序的影响,也可以避免走弯路。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TCP(Transmission Control Protocol)是Internet协议族的一种传输层协议,用于在不可靠的网络环境提供可靠的、基于字节流的通信服务。在Windows系统,使用Winsock API进行TCP异步通信的控制台程序涉及以下几个关键步骤: 1. **初始化Winsock库**: 首先,你需要包含Winsock头文件,并调用`WSADATA wsaData;` 初始化结构和`WSAStartup()` 函数,以启动Winsock服务。 ```cpp #include <winsock2.h> #include <ws2tcpip.h> WSADATA wsaData; int result = WSAStartup(MAKEWORD(2, 2), &wsaData); if (result != 0) { // 处理错误,通常打印错误代码 } ``` 2. **定义套接字**: 使用`socket()`函数创建一个套接字,指定AF_INET(IPv4)和SOCK_STREAM(TCP流式)类型。 ```cpp SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sock == INVALID_SOCKET) { // 处理错误 } ``` 3. **设置服务器地址**: 对于客户端程序,这通常是获取远程服务器的地址;对于服务器程序,则需要设置监听地址。 4. **连接或接受连接**: 对于客户端,使用`connect()`连接到服务器;服务器则需要调用`bind()`和`listen()`后,使用`accept()`接收连接。 5. **发送和接收数据**: 使用`send()`发送数据,`recv()`接收数据。异步操作通常通过提供回调函数来处理完成事件,而不是阻塞主线程。 6. **错误处理**: 在整个通信过程,要检查返回值并处理可能出现的错误,如`WSAGetLastError()`。 7. **关闭连接和清理**: 一旦通信完成,调用`shutdown()`关闭套接字的部分或全部连接,然后使用`closesocket()`关闭套接字,最后调用`WSACleanup()`结束Winsock

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值