SOCKET学习 1

  原本在想象中简单的SOCKET,在看过Window网络编程以后变的形式多样。迷惑的我再一次想起了那句很熟很熟的话:没有一开始认为的那么简单。套接字的I/O模型有五种,在未全面了解之前我已经初步建立了一个小的客户服务模型,现在看来是属于WSAAsyncSelect,可以接收Windows消息为基础的网络事件,这可能会在以后的设计中显示出它的优越性,不过如何接收Windows消息的网络事件,我暂时还不得而知。

  暂时先放下其他的四种模型,先来看下WSAAsyncSocket,毕竟有个现成的,先来一个函数的原型

int WSAAsyncSelect(
  SOCKET s,          
  HWND hWnd,         
  unsigned int wMsg, 
  long lEvent        
);
 

s:你所发送事件的套接字;hWnd:所要发送消息的窗口句柄;wMsg:当事件发生时所接受的消息;lEvent:网络事件的掩码.当函数成功执行时,函数会返回零,反之会返回错误。可以用WSAGetLastError来获得。

  因为我的模型是在MFC下,所以有一个直接的m_hWnd可以用,而Window网络编程是Win32控制台的,那么要自己写一个窗口了,wMsg一般是自己定义的消息,但是不能将不同的事件发给不同的消息。例如:

rc = WSAAsyncSelect(s, hWnd, wMsg1, FD_READ);
rc = WSAAsyncSelect(s, hWnd, wMsg2, FD_WRITE);

此时只有第二句会被执行,因此当我们想忽略消息的时候,后面的连个参数设置成零就可以了。至于lEvent选择自己需要的事件就行了。

  在调用中定义的消息,wParam返回一个网络事件的套接字,而lParam的低字节指定了网络事件,高字节则包含了可能出现的错误代码,当一个事件到达后可以用 WSAGETSELECTERROR(lParam)来检查是否出错,WSAGETSELECTERROR(lParam)来判断网络事件。

   在最后作者好像特意提了FD_WRITE这个事件需要注意,不过目前我还不知道为什么,他说在下面三种情况下

(1) 在使用accept或WSAaccept,套接字被接受后。

(2) 使用connect或WSAconnect,一个套接字首次建立后。

(3) 当send、WSAsend、sendto、WSAsendTo操作失败后,返回了WSAEWOULELOCK,并且缓冲区空间可使用。

 作为一个应用程序,自收到FD_WRITE消息开始,便应该认为自己必然能在一个套接字上发送数据,直到send、WSAsend、sendto、WSAsendTo操作失败后,返回了WSAEWOULELOCK,经过这样的失败,要用另一套FD_WRITE来发送数据。

 

后记:在发表时,第一次发表不成功,文章从第一段以后全无。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值