Visual C++设计UDP协议通讯示例

 一、绪言

  UDP是一种面向非连接,不可靠的通讯协议,相对于TCP来说,虽然可靠性不及,但传输效率较高。所以在网络上仍有很大的用途。这几日需要了解下udp通讯的过程,上网发现这方面的资料还挺少。于是仔细的翻找了下msdn,基本上搞清楚了udp通讯的过程。做了一个测试的例子。希望对大家有帮助。

二、UDP的通讯过程


server端: open a socket(socket)--->name the socket(bind)--->send and receive data(sendto recvfrom)--->close socket(closesocket)
client端: open a socket(socket)---------------------------->send and receive data(sendto recvfrom)--->close socket(closesocket)

  server端无需listen,client端无需connect,因此udp中server和client的区别相对较模糊。只要调用sendto和recvfrom就可以给指定的地址收发数据,但并不保证收发的数据的完整性和可靠性。

三、示例

udpserver主要代码:

#include <Winsock2.h>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")

void main() 
{ 
    WORD wVersionRequested; 
    WSADATA wsaData; 
    int err; 

    wVersionRequested=MAKEWORD(1,1); 

    err = WSAStartup(wVersionRequested, &wsaData); 
    if (err != 0) 
    { 

        return; 
    } 

    if (LOBYTE(wsaData.wVersion)!=1 || 
        HIBYTE(wsaData.wVersion)!=1) 
    { 
        WSACleanup(); 
        return; 
    } 

    SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);
    SOCKADDR_IN addrSrv;
    addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
    addrSrv.sin_family=AF_INET;
    addrSrv.sin_port=htons(6000);

    bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

    SOCKADDR_IN addrClient;
    int len=sizeof(SOCKADDR);
    char recvBuf[100];

    recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);
    printf("%s\n",recvBuf);
    closesocket(sockSrv);
    WSACleanup();
}

client端代码:

#include <Winsock2.h>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")

void main() 
{ 
    WORD wVersionRequested; 
    WSADATA wsaData; 
    int err; 

    wVersionRequested=MAKEWORD(1,1); 

    err = WSAStartup(wVersionRequested, &wsaData); 
    if (err != 0) 
    { 

        return; 
    } 

    if (LOBYTE(wsaData.wVersion)!=1 || 
        HIBYTE(wsaData.wVersion)!=1) 
    { 
        WSACleanup(); 
        return; 
    }
    SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);
    SOCKADDR_IN addrSrv;
    addrSrv.sin_addr.S_un.S_addr=inet_addr("192.168.58.169");
    addrSrv.sin_family=AF_INET;
    addrSrv.sin_port=htons(6000);

    sendto(sockClient,"Hello",strlen("Hello")+1,0,
        (SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
    closesocket(sockClient);
    WSACleanup();
}

  四、结束语

   UDP通讯比TCP简单了很多,在数据可靠性不是很高的情况下,有使用的价值

源地址:http://www.7880.com/info/Article-816b68a0.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值