首先加载套接字库
#include <winsock2.h> //套接字库头文件
还需要为工程添加连接ws2_32.lib
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2,2);
err = WSAStartup(wVersionRequested,&wsaData);
if(err != 0)
{
return FALSE;
}
if(LOBYTE(wsaData.wVersion) != 2 ||
HIBYTE(wsaData.wVersion) !=2)
{
WSACleanup();
return FALSE;
}
创建并初始化套接字
BOOL ::InitSocket
{
m_socket = WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,0); //m_scoket为SCOKET类型在头文件中定义
if(INVALID_SOCKET == m_socket)
{
AfxMessagebox("创建套接字失败!");
return;
}
SOCKADDR_IN addrSock;
addrSock.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //htonl 将u_long从主机字节顺序转换为TCP/IP网络字节顺序
addrSock.sin_family = AF_INET;
addrSock.sin_port = htons(6000); //htons 将u_short从主机字节顺序转换为TCP/IP网络字节顺序
if(SOCKET_ERROR == bind(m_socket,(SOCKADDR*)&addrSock,sizeof(SOCKADDR)))
{
AfxMessageBox("绑定失败! ");
return FALSE;
}
if(SOCKET_ERROR == WSAAsyncSelect(m_socket,m_hWnd,UM_SOCK,FD_READ)) //UM_SOCK自定义消息,m_hWnd对话框窗口句柄
{
AfxMessageBox("注册网络读取时间失败!");
return FALSE;
}
return TRUE;
}
实现接收端功能
添加消息响应函数
#define UM_SOCK WM_USER+1
afx_msg void OnSock(WPARAM,LPARAM);
ON_MESSAGE(UM_SOCK,OnSock)
void ::OnSock(WPARAM wParam,LPARAM lParam)
{
switch(LOWORD(lParam))
{
case FD_READ:
WSABUF wsabuf;
wsabuf.buf = new char[200];
wsabuf.len = 200;
DWORD dwRead;
DWORD dwFlag = 0;
SOCKADDR_IN = addrFrom;
int len = sizeof(SOCKADDR);
CString strl;
CString strTemp;
if(SOCKET_ERROR == WSARecvFrom(m_socket,&wsabuf,1,&dwRead,&dwFlag,
(SOCKADDR*)&addrFrom,&len,NULL,NULL)
{
AfxMessageBox("接收数据失败!");
delete[] wsabuf.buf;
return;
}
}
}
实现发送端功能
void ::OnBtnSend()
{
DWORD dwIP;
CString strSend;
WSABUF wsabuf;
DWORD dwSend;
int len;
SOCKADDR_IN addrTo;
((CIPAddressCtrl*)GetDlgItem(IDC_IPASSRESS1))->GetAddress(dwIP); //IDC_IPASSRESS1 ,IP控件的ID
addrTo.sin_addr.S_un.S_addr = htonl(dwIP);
addrTo.sin_family = AF_INET;
addrTo.sin_port = htons(6000);
GetDlgItemText(IDC_EDIT_SEND,strSend); //发送数据EDIT的ID
len = strSend.GetLength();
wsabuf.buf = strSend.GetBuffer(len);
wsabuf.len = len + 1;
if(SOCKET_ERROR == WSASendTo(m_socket,&wsabuf,1,&dwSend,0,
SetDlgItemText(IDC_EDIT_SEND,""); //清空发送编辑框
(SOCKADDR*)&addrTo,sizeof(SOCKADDR),NULL,NULL))
{
AfxMessageBox("是、发送数据失败!");
return;
}
}
终止套接字库的使用
WSACleanup();
关闭套接字
closesocket(m_socket);