CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  网络编程

CSocket 如何设置接收超时?在线等待

楼主grgz(尼采)2004-09-02 13:43:12 在 VC/MFC / 网络编程 提问

CSocket   如何设置接收超时?用了setsockopt(SO_REVTIME,...)也不行,各位请帮帮忙。急急急。。。。。。 问题点数:0、回复次数:3Top

1 楼DentistryDoctor(不在无聊中无奈,就在沉默中变态)回复于 2004-09-02 13:49:02 得分 0

WHY?Top

2 楼gloriajie()回复于 2004-09-11 09:57:38 得分 0

用MFC向导做一个基于对话框的应用程序SocketSever,注意第三步中不要选上Windwos   Sockets选项。在做好工程后,创建一个SeverSock,将它设置为异步非阻塞模式,并为它注册各种网络异步事件,然后与自定义的网络异步事件联系上,最后还要将它设置为监听模式。在自定义的网络异步事件的回调函数中,你可以得到各种网络异步事件,根据它们的类型,做不同的处理。下面将详细介绍如何编写相关代码。  
          在SocketSeverDlg.h文件的类定义之前增加如下定义:  
              #define     NETWORK_EVENT     WM_USER+166     file://定义网络事件  
         
                SOCKET   ServerSock;   file://服务器端Socket  
              在类定义中增加如下定义:  
              class   CSocketSeverDlg   :   CDialog  
            {  
                                    …  
              public:  
                    SOCKET   ClientSock[CLNT_MAX_NUM];   file://存储与客户端通信的Socket的数组  
   
                    /*各种网络异步事件的处理函数*/  
                void   OnClose(SOCKET   CurSock);       file://对端Socket断开  
                  void   OnSend(SOCKET   CurSock);       file://发送网络数据包  
                void   OnReceive(SOCKET   CurSock);   file://网络数据包到达  
                void   OnAccept(SOCKET   CurSock);     file://客户端连接请求  
   
                  BOOL   InitNetwork();     file://初始化网络函数  
                    void   OnNetEvent(WPARAM   wParam,   LPARAM   lParam);   file://异步事件回调函数  
                                  …  
            };  
                   
              在SocketSeverDlg.cpp文件中增加消息映射,其中OnNetEvent是异步事件回调函数名:  
                                ON_MESSAGE(NETWORK_EVENT,OnNetEvent)  
              定义初始化网络函数,在SocketSeverDlg.cpp文件的OnInitDialog()中调此函数即可。  
              BOOL   CSocketSeverDlg::InitNetwork()  
              {  
                        WSADATA   wsaData;  
   
                      file://初始化TCP协议  
                      BOOL   ret   =   WSAStartup(MAKEWORD(2,2),   &wsaData);  
                    if(ret   !=   0)  
                      {  
                                  MessageBox("初始化网络协议失败!");  
                                return   FALSE;  
                      }  
   
                      file://创建服务器端套接字  
                      ServerSock   =   socket(AF_INET,   SOCK_STREAM,   IPPROTO_TCP);  
                        if(ServerSock   ==   INVALID_SOCKET)  
                      {  
                                MessageBox("创建套接字失败!");  
                              closesocket(ServerSock);  
                              WSACleanup();  
                                return   FALSE;  
                      }  
   
                      file://绑定到本地一个端口上  
                      sockaddr_in   localaddr;  
                      localaddr.sin_family   =   AF_INET;  
                      localaddr.sin_port   =   htons(8888);     file://端口号不要与其他应用程序冲突  
                      localaddr.sin_addr.s_addr   =   0;  
                    if(bind(ServerSock   ,(struct   sockaddr*)&localaddr,sizeof(sockaddr))  
                                                                                      =   =   SOCKET_ERROR)  
                    {  
                                MessageBox("绑定地址失败!");  
                                closesocket(ServerSock);  
                                WSACleanup();  
                                return   FALSE;  
                    }  
     
                    file://将SeverSock设置为异步非阻塞模式,并为它注册各种网络异步事件,其   中       m_hWnd              
                    file://为应用程序的主对话框或主窗口的句柄  
                  if(WSAAsyncSelect(ServerSock,   m_hWnd,   NETWORK_EVENT,  
                              FD_ACCEPT   |   FD_CLOSE   |   FD_READ   |   FD_WRITE)   ==   SOCKET_ERROR)  
                    {  
                                MessageBox("注册网络异步事件失败!");  
                                WSACleanup();  
                                return   FALSE;  
                    }  
                    listen(ServerSock,   5);   file://设置侦听模式  
                  return   TRUE;  
            }  
   
            下面定义网络异步事件的回调函数  
            void   CSocketSeverDlg::OnNetEvent(WPARAM   wParam,   LPARAM   lParam)  
            {  
                  file://调用Winsock   API函数,得到网络事件类型  
                  int   iEvent   =   WSAGETSELECTEVENT(lParam);  
                     
                  file://调用Winsock   API函数,得到发生此事件的客户端套接字  
                  SOCKET   CurSock=   (SOCKET)wParam;  
   
                  switch(iEvent)  
                  {  
                  case   FD_ACCEPT:             file://客户端连接请求事件  
                                  OnAccept(CurSock);  
                                  break;  
                  case   FD_CLOSE:               file://客户端断开事件:  
                                  OnClose(CurSock);  
                                  break;  
                  case   FD_READ:                 file://网络数据包到达事件  
                                  OnReceive(CurSock);  
                                  break;  
                    case   FD_WRITE:             file://发送网络数据事件  
                                  OnSend(CurSock);  
                                  break;  
                    default:   break;  
                    }  
            }  
         
              以下是发生在相应Socket上的各种网络异步事件的处理函数,其中OnAccept传进来的参数是服务器端创建的套接字,OnClose()、OnReceive()和OnSend()传进来的参数均是服务器端在接受客户端连接时新创建的用与此客户端通信的Socket。  
          void   CSocketSeverDlg::OnAccept(SOCKET   CurSock)  
          {  
                    file://接受连接请求,并保存与发起连接请求的客户端进行通信Socket  
            file://为新的socket注册异步事件,注意没有Accept事件  
          }  
     
          void   CSocketSeverDlg::OnClose(SOCET   CurSock)  
          {  
                  file://结束与相应的客户端的通信,释放相应资源  
          }  
   
          void   CSocketSeverDlg::OnSend(SOCET   CurSock)  
          {  
                  file://在给客户端发数据时做相关预处理  
          }  
   
          void   CSocketSeverDlg::OnReceive(SOCET   CurSock)  
          {  
                  file://读出网络缓冲区中的数据包  
          }                
                 
                用同样的方法建立一个客户端应用程序。初始化网络部分,不需要将套接字设置为监听模式。注册异步事件时,没有FD_ACCEPT,但增加了FD_CONNECT事件,因此没有OnAccept()函数,但增加了OnConnect()函数。向服务器发出连接请求时,使用connect()函数,连接成功后,会响应到OnConnect()函数中。下面是OnConnect()函数的定义,传进来的参数是客户端Socket和服务器端发回来的连接是否成功的标志。  
  void   CSocketClntDlg::OnConnect(SOCKET   CurSock,   int   error)  
  {  
          if(0   =   =   error)  
          {  
          if(CurSock   =   =   ClntSock)  
            MessageBox("连接服务器成功!");  
        }  
    }  
          定义OnReceive()函数,处理网络数据到达事件;  
          定义OnSend()函数,处理发送网络数据事件;  
          定义OnClose()函数,处理服务器的关闭事件。  
                           
               
  Top

3 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2004-09-11 11:47:07 得分 0

用SetSockOpt设置的超时一般用在阻塞型套接字上的Top

相关问题

  • 为什么CSocket接收INT数据会错误..在线等待...
  • 设了接收超时后,怎样再把这socket设回不要超时呢?
  • 精确(不到1ms)的超时等待
  • 如何对Csocket类设置超时?
  • CSocket怎么设连接超时呀?
  • CSocket如何设置连接超时?
  • 串口接收线程"受扰"超时,影响接收数据的问题?
  • 急!!! Win Socket发送与接收的超时?
  • 如何在接收里知道是否超时?
  • 完成端口中如何设置接收超时??????????

关键词

  • 函数
  • 服务器
  • 应用程序
  • 客户
  • 连接
  • socket
  • 网络
  • 模式
  • cursock
  • serversock

得分解答快速导航

  • 帖主:grgz

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo