首先必須初始化網絡,可以在app的InitInstance()中用AfxSocketInit()或者直接用
WSAStartup( MAKEWORD(1,1),&wsaData)
WORD wVersionRequested WSADATA 初始化 winsock
WSACleanUp
然後是初始化套接字的方法,有tcp和udp兩種tcp下:
SOCKET(AF_INET,SOCK_STREAM,0)
bind(m_socket,(SOCKADDR*)&addrSock,sizeof(SOCKADDR));//同下面的代碼初始化SOCKADD_IN
服務器 listen (socket s, 超時時間)
socket new=accept(m_socket,(SOCKADDR*)&addrSock,sizeof(SOCKADDR)) 通過返回的新socket進行數據交換
send/recv(new,Buf,len,0)
inet_ntoa()把網絡字節序轉會主機字節序客戶端
SOCKADD_IN.sin_addr.s_un.s_addr=htonl(連接的ip)
sin_family=AF_INET
sin_port=htons(6000)
connect ( socket s,(SOCKADDR*)&SOCKADD_IN,sizeof(SOCKADDR))
send/recv (new,Buf,len,0)
udp下:
SOCKET(AF_INET, SOCK_DGRAM,0)
SOCK_DGRAM
SOCKADD_IN.sin_addr.s_un.s_addr=htonl(INADDR_ANY)
sin_family=AF_INET
sin_port=htons(6000)
bind(m_socket,(SOCKADDR*)&addrSock,sizeof(SOCKADDR));
recvfrom 接收(socket s,Buf,len,0,[in][out](sockaddr*),&len)
sendto 發送 [in]
以上的方法,需要派子線程進行循環處理,如果采用異步網絡通訊,則利用消息機制處理異步網絡通訊模式
s=WSASocket(AF_INET,SOCK_DGRAM,0,null,0,0)
bind(socket s,(SOCKADDR*)&addrSock,sizeof(SOCKADDR))//綁定函數沒有提供更多強大的方法注冊異步網絡事件 WSAAsyncSelect(s ,m_hWnd,接受信息的窗口句柄UM_SOCK, FD_READ))自定義的消息事件 產生時間的原由 //現在是網絡讀取事件
同樣地,如正常自定義消息方法
1#define UM_SOCK WM_USER+100
2在 .h中相應afx_msg void OnSock(WPARAM,LPARAM)
3.cpp ON_MESSAGE(UM_SOCK,OnSock)
4編寫void OnSock(WPARAM wParam,LPARAM lParam)
{
swich(LOWORD(lParam))//低字繼續保持消息內容
{
case FD_READ:
WSARecvFrom...
...
}
}