windows TCP socket在C++下的编程入门 6

来源:互联网 发布:win10双系统删除linux 编辑:程序博客网 时间:2024/05/23 19:15

异步 sockets

    因为使用类似 listen() 的阻塞函数是很不切实际的和如此痛苦的(这里我也不知道是什么意思),让我们继续并且开始讨论异步sockets,我在早期就提到了。我保证我将给你们讲解它是怎么工作的。

   C++给了我们很多高级编程语言所没有的优点,也就是说,我们在进行异步sockets之前不得不在进行些额外的子课程学习,它全部为我们做好了,所以我们不得不添加处理代码到信息处理程序,这是因为你如你所看到的异步sockets,取决于连接要求发生时能够发送你的程序信息,能够接收信息等等。这使得它能够安静的在后台等待并且不会打断你的父母进程或者阻碍效率。因为它只在需要的时候交流,所以有一个相对较小的代价,因为他没有花很多额外的编码,所以理解它是怎么工作的可能会花一点时间,但是你在花时间理解异步sockets的时候肯定会很愉快的,因为它会为你省掉很多麻烦的。

     为了不重做以及改变我们写的所有的代码,异步编程只是简单的在 listen() 函数之后加上一个额外的代码行。当然,你的信息处理程序需要准备接收下面的信息:

      FD_ACCEPT:如果你的应用程序是作为用户活动的(比如,你正尝试使用connect()连接一个远程主机)你在连接请求被发生时接收到这个信息,你应该选择这么做。下面的信息将被发送

    FD_CONNECT:标志着连接被成功的执行

    FD_READ 我们从远程电脑上得到了输入数据,我们将在后面学习它。

这些值将会传递给你处理程序的参数 IParam ,我将马上告诉你这里数据该放在哪,但是首先,我们得理解把我们的socket编程编程异步模式的调用的API的参数

  //把socket变为一个非阻塞的异步

  int PASCAL WSAAsyncSelect( SOCKET,HWND,u_int ,long);

第一个参数。显然的,需要我们socket的句柄,第二个需要我们父母窗口的句柄,这是传递消息给正确的窗口所必须的,第三个参数,正如你所看见的,接收一个你指定的唯一的整型值,当任何信息发送给你的程序的消息处理程序,不管你指定的是任何数也将被发送,因此,你将编译你的消息处理程序等待那个识别数字,然后决定哪种通知类型被发送了,我知道这很迷惑人。所以希望看完以下的代码以后能够更好的理解。

    #define MY_MESSAGE_NOTIFICATION       1048// 用户通知消息

  //这是我们信息的句柄/窗口程序

 LRESULTT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam)

 {

    switch(message)//处理消息

     {

      case MY_MESSAGE_NOTIFICATION: //这个消息被发送了吗?

           {

              switch(iparam) //如果发送了,是下面哪个?

                  {

                     case FD_ACCEPT:

                              //连接要求被执行

                                      break;

                         case FD_CONNECT:

                                        //连接成功

                                     break;

                           case FD_READ:

                                       //输入数据,准备接收

                                    break;

                             case   FD_CLOSE::

                                     //失去连接

                                     break;

               }

             }

              break;

          //其他标准 窗口消息

         default : //这消息我们不管

             return DefWindowProc(hand,message,wparam,lparam);

}

   break;

 }

这并不是很坏,对吗?现在我们的处理程序都被设定了,我们应该附加下面行的代码给函数 ListenOnPort() 在函数 listen() 之后;

  //socket被创建了

 // IP地址被绑定了

 //Listen()函数刚被调用了

// 把socket编程非阻塞异步模式

 // hwnd是一个纸箱程序父母窗口的有效句柄

//确保你所需要的所有元素

  WSAAsyncSelect(s,hwnd,MY_MESSAGE_NOTIFICATION,(FD_ACCEPT | FD_CONNECT | FD_READ | FD_CLOSE);

//等等

C:\Documents and Settings\Cam>netstat-an

  Active Connections

  Proto                                       Local Address                    Foreign Address                 State

 TCP                                           0.0.0.0:135                        0.0.0.0                                LISTENING

  TCP                                           0.0.0.0:445                        0.0.0.0                                 LISTENING\

  TCP                                           0.0.0.0:5225                       0.0.0.0                               LISTENING

 TCP                                            127.0.0.1:1025                  0.0.0.0:                               LISTENING

  TCP                                           127.0.0.1:1035                  127.0.0.1:5226                  ESTALISHED\

 TCP                                              127.0.0.1:8005                0.0.0.0                              LISTENING

 UDP                                          0.0.0.0:455                             *:*

UDP                                             127.0.0.1:1031                     *:*

  UDP                                            127.0.0.1:1032                    *:*

C:\Documents and Settings\Cam>

 如果你的服务运行正常,你应该看在 Local Address 下的像 “0.0.0.0:端口#"的东西  端口#指的是端口你所监听的 ,在 LISTENING 状态下 ,顺便说下如果你忘记使用 htons()来转变端口数字,那么你也许会发现一些新的端口被打开了,但这个端口和你所期望的完全不一样。

  让所有的东西正常运行并并不容易,这是正常的不用担心,我们都是这样过来的。你在尝试多次之后自然会克服.(当然,如果你尝试了几个星期还是没有效果,那还忘记我们学的并别在看这个教材了)

0 0
原创粉丝点击