请教各位大人:socket服务器端不断给客户端发送信息,客户端为何只 响应一次 FD_ACCEPT 事件呢?

时间:2022-11-30 17:00:35
socket服务器端不断给客户端发送信息,

服务端是异步的 为何客户端 只响应一次 FD_ACCEPT 连接事件呢?
其他接收事件 ,以后再也不响应了呢?

代码如下

客户端端

这里代码是连接不写了。 

while(1)
{
       char sendBuf[100];
                         sprintf(sendBuf,"Welcome  to Use this"); 
int ret = send(sockClient, sendBuf,  strlen(sendBuf) + 1, 0);
Sleep(9000); 每隔9秒发一次
                  }

服务器是
#define MY_MSG (WM_USER+1000)

ON_MESSAGE(NETWORK_EVENT,OnNetEvent) //这里注册消息

WSADATA wsaData;

          //初始化TCP协议
          BOOL ret = WSAStartup(MAKEWORD(2,2), &wsaData);
         if(ret != 0)
          {
                MessageBox(_T("初始化网络协议失败!"));
               return ;
          }

         //创建服务器端套接字
          ServerSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
           if(ServerSock == INVALID_SOCKET)
          {
               MessageBox(_T("创建套接字失败!"));
              closesocket(ServerSock);
              WSACleanup();
               return ;
          }

          //绑定到本地一个端口上
          sockaddr_in localaddr;
          localaddr.sin_family = AF_INET;
          localaddr.sin_port = htons(16000); //端口号不要与其他应用程序冲突
          /*localaddr.sin_addr.s_addr = 0;*/
  localaddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); //服务端的IP  127.0.0.1  
         if(bind(ServerSock ,(struct sockaddr*)&localaddr,sizeof(sockaddr)) == SOCKET_ERROR)
         {
               MessageBox(_T("绑定地址失败!"));
               closesocket(ServerSock);
               WSACleanup();
               return ;
         }

         if(WSAAsyncSelect(ServerSock, m_hWnd, NETWORK_EVENT, FD_ACCEPT | FD_CLOSE | FD_READ | FD_WRITE) == SOCKET_ERROR) 
         {
               MessageBox(_T("注册网络异步事件失败!"));
               WSACleanup();
               return;
         }

        listen(ServerSock, 5); 

LRESULT CIMServerDlg::OnNetEvent(WPARAM wParam, LPARAM lParam)

int iEvent = WSAGETSELECTEVENT(lParam);
    SOCKET CurSock= (SOCKET)wParam;

  switch(iEvent)
        {
        case FD_ACCEPT:      //客户端连接请求事件
                OnAccept(CurSock);

                break;
        case FD_CLOSE:     //客户端断开事件:
                OnClose(CurSock);
                break;
        case FD_READ:       //网络数据包到达 

                OnReceive(CurSock);
                break;
         case FD_WRITE:     //发送网络数据事件


        recv(CurSock, recvBuf, 100, 0); 

                OnSend(CurSock);
                break;
         default: break;
         }

  
      return 0;   

}

void CIMServerDlg::OnAccept(SOCKET CurSock)
    {
     //接受连接请求,并保存与发起连接请求的客户端进行通信Socket
     //为新的socket注册异步事件,注意没有Accept事件
      
char sendBuf[100];   
        sprintf(sendBuf, "Welcome to Use this");  //inet_ntoa(CurSock.sin_addr

//发送
        send(CurSock, sendBuf, strlen(sendBuf) + 1, 0);  
    }

。。。。。 下边函数省略了

9 个解决方案

#1


说的挺迷糊的

看代码应该是客户端不断的向服务器发送信息吧

只响应一次 FD_ACCEPT 连接事件呢? 难道要相应多次?

#2


你要问的是不是服务器只响应一次OnAccept啊?
OnAccept是在你客户端Connect时才触发调用的,你连接了一次,它当然只触发一次啦!
从你的代码可以看到的就是,服务器每隔9秒左右,响应一次OnReceive,因为客户端每隔9秒左右发一次数据

#3


一个套接字只需要Accept一次

#4


lz想说的应该是OnReceive吧

#5


while(1)
{
char sendBuf[100];
  sprintf(sendBuf,"Welcome to Use this");  
int ret = send(sockClient, sendBuf, strlen(sendBuf) + 1, 0);
Sleep(9000); 每隔9秒发一次
  }

你这里只是反复的发送而已,并没有反复的连接。反复的发送只会导致FD_READ,不会导致FD_ACCEPT,connect才会导致FD_ACCEPT。

#6


FD_READ

#7


 case FD_WRITE: //发送网络数据事件


  recv(CurSock, recvBuf, 100, 0);  

  OnSend(CurSock);
  break;
怎么这里也recv,然后send呀?

#8


消息处理,第一步应该是先判断消息参数,是否有错
  if(WSAGETSELECTERROR(lParam))
{
   closesocket(lParam); 
   break;
}
 , 没错的话才进入下一步处理
我估计你的socket第二次进来就在错误里去了, 

#9


楼上那么多人没看清楚楼主意思,楼主的意思只响应了一次 FD_Accept,其他操作没响应

还有种可能是楼主的代码在
case FD_WRITE: //发送网络数据事件
  recv(CurSock, recvBuf, 100, 0);  // 这里应该是发送 
  OnSend(CurSock);
  break;
这里发生了错误, 第一次Connect 或者accept 成功是会触发的 Fd_write的

#1


说的挺迷糊的

看代码应该是客户端不断的向服务器发送信息吧

只响应一次 FD_ACCEPT 连接事件呢? 难道要相应多次?

#2


你要问的是不是服务器只响应一次OnAccept啊?
OnAccept是在你客户端Connect时才触发调用的,你连接了一次,它当然只触发一次啦!
从你的代码可以看到的就是,服务器每隔9秒左右,响应一次OnReceive,因为客户端每隔9秒左右发一次数据

#3


一个套接字只需要Accept一次

#4


lz想说的应该是OnReceive吧

#5


while(1)
{
char sendBuf[100];
  sprintf(sendBuf,"Welcome to Use this");  
int ret = send(sockClient, sendBuf, strlen(sendBuf) + 1, 0);
Sleep(9000); 每隔9秒发一次
  }

你这里只是反复的发送而已,并没有反复的连接。反复的发送只会导致FD_READ,不会导致FD_ACCEPT,connect才会导致FD_ACCEPT。

#6


FD_READ

#7


 case FD_WRITE: //发送网络数据事件


  recv(CurSock, recvBuf, 100, 0);  

  OnSend(CurSock);
  break;
怎么这里也recv,然后send呀?

#8


消息处理,第一步应该是先判断消息参数,是否有错
  if(WSAGETSELECTERROR(lParam))
{
   closesocket(lParam); 
   break;
}
 , 没错的话才进入下一步处理
我估计你的socket第二次进来就在错误里去了, 

#9


楼上那么多人没看清楚楼主意思,楼主的意思只响应了一次 FD_Accept,其他操作没响应

还有种可能是楼主的代码在
case FD_WRITE: //发送网络数据事件
  recv(CurSock, recvBuf, 100, 0);  // 这里应该是发送 
  OnSend(CurSock);
  break;
这里发生了错误, 第一次Connect 或者accept 成功是会触发的 Fd_write的