备注:①关于创建客户端发送线程、服务器端接收线程,可参见本博客的线程创建文档:http://blog.csdn.net/i_likechard/article/details/51544120
②本文归纳的udp通讯,参照的源代码下载地址:http://download.csdn.net/download/i_likechard/9536412
1、建立工程时选择window socket;
2、.h文件中添加:
SOCKET SockSrv;
SOCKADDR_IN addrSrv;
3、.cpp文件中添加按钮事件:(线程的创建可以参见这篇我的文章:http://blog.csdn.net/i_likechard/article/details/51544120)
UINT __cdecl CudpDlg::ReceThread( LPVOID lparam )//线程2函数定义
{
CudpDlg *pDlg = (CudpDlg*)lparam;
SOCKADDR_IN addrClient;
int i=0;
int len=sizeof(SOCKADDR);
while(pDlg->tflag)
{
while (1)
{
int rcv = recvfrom(pDlg->SockSrv,pDlg->Buffer,2048,0, (SOCKADDR*)&addrClient,&len);
if(rcv==-1)
{
pDlg->MessageBox("接受错误");
}
for(i;pDlg->Buffer!='\0';i++)
{
pDlg->temp[i]=pDlg->Buffer[i];
}
}
}
return 0;
}
void CudpDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
int rel;
SockSrv=socket(AF_INET,SOCK_DGRAM,0);
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(7001);
rel=bind(SockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
if(SOCKET_ERROR==rel)
{
MessageBox("绑定失败");
}
m_SendThread = AfxBeginThread(SendThread,this,THREAD_PRIORITY_NORMAL,0,0);
m_ReceThread = AfxBeginThread(ReceThread,this,THREAD_PRIORITY_NORMAL,0,0);
m_button1.EnableWindow(FALSE);
}
//服务器需要bind,对于网口可设置为单一网口,也可设置为INADDR_ANY
1、建立工程时选择window socket;
SOCKET SockClient;
SOCKADDR_IN addrClient;
3、.cpp文件中添加按钮事件:
①创建套接字
CString strIP;
BYTE IP0,IP1,IP2,IP3;
DWORD dwIP;
m_strIP.GetAddress(IP0,IP1,IP2,IP3);
strIP.Format(_T("%d.%d.%d.%d"),IP0,IP1,IP2,IP3);
// TODO: Add your control notification handler code here
sockClient=socket(AF_INET,SOCK_DGRAM,0);
addrClient.sin_addr.S_un.S_addr=inet_addr(strIP);
addrClient.sin_family=AF_INET;
addrClient.sin_port=htons(7001);
//bind(sockClient,(SOCKADDR*)&addrClient,sizeof(SOCKADDR));
//client 无需bind端口。
②创建一个发送线程()线程的创建参见:https://mp.csdn.net/postedit/51544120
while(1)
{
int iEnd=sendto(pDlg->sockClient,temp,ilen,0,(SOCKADDR*)&(pDlg->addrSrv),sizeof(SOCKADDR));
if (iEnd==SOCKET_ERROR)
{
strError.Format("发送文件数据失败:%d",error=WSAGetLastError());
pDlg->MessageBox(strError,"错误",MB_ICONSTOP);
break;
}
}
一般而言,udp通信只能够实现客户端向服务端发送数据。想要实现基于udp的双向通讯,只需要在客户端和服务端中建立套接字的逻辑互换。网口可以不变,重新绑定一个新端口、在各自程序中重新新建一个线程用于发送或者接收数据就可以了。相当于在客户端新建了一个服务端套接字,在服务端新建了一个客户端套接字。