WSAAsyncSelect 模型

// C++中网络编成,主函数
//
#include  < winsock.h >
int  WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst,
                   LPSTR lpsCmdLine, 
int  nCmdShow)
{
    WSADATA wsaData;
    
    hInst 
= hCurInst;

    
if (WSAStartup(MAKEWORD(22), &wsaData) != 0{
        MessageBox(NULL, 
"WSAStartup Error" , szAppName, MB_OK);
    }

    DialogBox(hCurInst, 
"MONITOR", NULL, (DLGPROC)MyServerProc);

    
if (WSACleanup() != 0{
        MessageBox(NULL, 
"WSACleanup Error", szAppName, MB_OK);
    }

    
return 0;
}

 

结构体

 

typedef  struct  ConnectCtrl_t  {
    SOCKET Socket; 
    
int Port;
    
int Exist_Flag;
    
void (* SendData)(ConnectCtrl_t * );
    
int  (* Connect)(ConnectCtrl_t * );
    
void  (* Close)(ConnectCtrl_t * );
}
 ConnectCtrl;

 

 

BOOL CALLBACK MyServerProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
{  
  
switch (msg) {
    
case WM_INITDIALOG:
      
/* 受信ポート指定*/
      s 
= socket(AF_INET, SOCK_DGRAM, 0);
      memset(
&saddr, 0sizeof(saddr));
      saddr.sin_family 
= AF_INET;
      saddr.sin_port 
= htons(port);
      saddr.sin_addr.s_addr 
= htonl(INADDR_ANY);
      
//绑顶地址
      nRtn = bind(s, (LPSOCKADDR)&saddr, (int)sizeof(saddr));
      
//将socket消息发送到hWnd窗口上,然后在那里  
      
// 处理相应的FD_READ,FD_WRITE等等消息  
      
//提供异步数据传送
     nRtn = WSAAsyncSelect(s, hDlg, MY_MSG, FD_READ);
     
//出力的套接字生成
    ..................................................
   
case MY_MSG:
        nEvent 
= WSAGETSELECTEVENT(lp);
        
switch (nEvent) {
          
case FD_READ:
              clientlen 
= (int)sizeof(client);
              
//读本アプリ的套接字的消息
              nRtn = recvfrom(s, szBuf, (int)sizeof(szBuf) - 10, (SOCKADDR *)&client, &clientlen);
              
//对消息进行处理,然后发送
              .................................................................................

        }

   
case WM_DESTROY:
         closesocket(pCtrl
->Socket);                      

}

 

连接SLAVE

 

int  Connect2Slave(ConnectCtrl  *  pCtrl)
{
    
char* szServer = SERVER_IP;
    SOCKADDR_IN saddr;
    HOSTENT 
*lpHost;
    unsigned 
int addr;
    u_short uport;

    
if ( (pCtrl->Exist_Flag == 0|| (pCtrl->Socket != INVALID_SOCKET) ){
        
return 0;
    }


    pCtrl
->Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    
if (pCtrl->Socket == INVALID_SOCKET) {
        
return -1;
    }


// 自分のアドレス設定
    lpHost = gethostbyname(szServer);
    
if (lpHost == NULL) {
        addr 
= inet_addr(szServer);
        lpHost 
= gethostbyaddr((char *)&addr, 4, AF_INET);
    }


    uport 
= TCPUDP_PORT + pCtrl->Port ;
    memset(
&saddr, 0sizeof(SOCKADDR_IN));
    saddr.sin_family 
= AF_INET;
    saddr.sin_port 
= htons(uport);
    saddr.sin_addr.s_addr 
= *((u_long *)lpHost->h_addr);

    
// コネクション
    if (connect(pCtrl->Socket, (SOCKADDR *)&saddr, sizeof(SOCKADDR_IN)) == SOCKET_ERROR) {
        
if (WSAGetLastError() != WSAEWOULDBLOCK) {
            closesocket(pCtrl
->Socket );
            pCtrl
->Socket  = INVALID_SOCKET;
            
return -1;
        }
 else {
            closesocket(pCtrl
->Socket );
            pCtrl
->Socket  = INVALID_SOCKET;
            
return -1;
        }

    }
  else {
        
return 0;
    }

}

 

发送数据

nRet = send(pCtrl->Socket, szSendBuf, size, 0);

 

客户端的接收

 

Private   Sub wsckTCPServerOfButtons_ConnectionRequest(index As IntegerByVal requestID As Long)
    
    
If wsckTCPServerOfButtons(index).State <> sckClosed Then
        
'ソケットの連続をチャックし、クローズではないなら、クローズしておく
        wsckTCPServerOfButtons(index).Close
    
End If
    wsckTCPServerOfButtons(index).Accept requestID
 
' Text1.Text = "hello"
End Sub


Private   Sub wsckTCPServerOfButtons_DataArrival(index As IntegerByVal bytesTotal As Long)
   
Dim chHexData() As Byte '直接のHEXデータ受信用
   '接收
   wsckTCPServerOfButtons(index).getdata chHexData
   
'变换
   '解析
End Sub

 

你可能感兴趣的:(C语言,socket,integer,null,stream,struct,server)