如何实现udp传输?源代码、实例

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;

如何实现udp传输?源代码、实例_第1张图片

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;

如何实现udp传输?源代码、实例_第2张图片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端口。

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

 

你可能感兴趣的:(如何实现udp传输?源代码、实例)