首先必须初始化网络,可以在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)
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)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...
...
}
}