window网口通讯搭建udp的client和server概略流程及代码

来源:互联网 发布:淘宝产品组合策略案例 编辑:程序博客网 时间:2024/05/23 01:13

window网口通讯搭建udp的client和server概略流程及代码

备注:①关于创建客户端发送线程、服务器端接收线程,可参见本博客的线程创建文档:http://blog.csdn.net/i_likechard/article/details/51544120

 ②本文归纳的udp通讯,参照的源代码下载地址:http://download.csdn.net/download/i_likechard/9536412

一、建立srv

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


二、建立client

1、建立工程时选择window socket;


2、.h文件中添加:

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端口。

②创建一个发送线程()

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通信只能够实现客户端向服务端发送数据。想要实现基于udp的双向通讯,只需要在客户端和服务端中建立套接字的逻辑互换。网口可以不变,重新绑定一个新端口、在各自程序中重新新建一个线程用于发送或者接收数据就可以了。相当于在客户端新建了一个服务端套接字,在服务端新建了一个客户端套接字。