C++Socket编程—UDP通信

一.socket编程-套接字编程——UDP通信

    UDP,用户数据报协议(UDP,User Datagram Protocol),UDP是面向无连接协议,面向无连接的意思是只有“传送数据”的过程,提供面向事务的简单不可靠信息传送服务。
    即使是在网络拥堵的过程中,UDP也无法进行流量控制等避免网络拥塞,传输过程种丢包,UDP也不负责重发,甚至出现包的到达顺序乱掉的情况也无法纠正。
    UDP往往可以用于以下情况:
    • 包总量较少的通信(DNS,SNMP)
    • 视频,音频多媒体通信(即时通讯)
    • 广播通信

UDP编程模型:

 

 

 

 

 二、UDP编程步骤:

1.初始化WASD

2.创建socket,指明使用的协议

3.收发数据

 

三、代码示例——使用UDP进行通信:

发数据端:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
    //初始化
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;
    wVersionRequested = MAKEWORD(2, 2);
    err = WSAStartup(wVersionRequested, &wsaData);
    if (err != 0) {
        return 1;
    }
 
    if (LOBYTE(wsaData.wVersion) != 2 ||
        HIBYTE(wsaData.wVersion) != 2) {
        WSACleanup();
        return 1;
    }
 
    //1. 创建socket, 指明要使用的协议什么
    SOCKET sock = socket(
        AF_INET,    //ipv4协议族
        SOCK_DGRAM, //数据报
        IPPROTO_UDP);//udp协议
    if (sock == INVALID_SOCKET)
    {
        printf("创建socket失败 \r\n");
        return 0;
    }
 
 
    //3. 发数据
    sockaddr_in siTo;
    siTo.sin_family = AF_INET;
    siTo.sin_port = htons(9527);
    siTo.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
 
    char szBuff[0x1000] = {"hello socket" };
    int nBytesSend = sendto(sock,
        szBuff,
        sizeof(szBuff),
        0,
        (sockaddr*)&siTo, //客户端的的目标地址和端口
        sizeof(siTo));
 
    if (nBytesSend == SOCKET_ERROR)
    {
        closesocket(sock);
        printf("接受数据失败 \r\n");
        return 0;
    }
 
 
    //接收数据
    sockaddr_in siRecv;
    int nSizeOfSiRecv = sizeof(siRecv);
    char szBuff0[MAXWORD + 1] = { 0 };
    int nBytesRecv = recvfrom(sock,
        szBuff0,
        sizeof(szBuff0),
        0,
        (sockaddr*)&siRecv,
        &nSizeOfSiRecv);
    if (nBytesRecv == SOCKET_ERROR)
    {
        closesocket(sock);
        printf("接受数据失败 \r\n");
        return 0;
    }
 
 
    //清理
    WSACleanup();
 
return 0;

 

 收数据端:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
//初始化
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) {
    return 1;
}
 
if (LOBYTE(wsaData.wVersion) != 2 ||
    HIBYTE(wsaData.wVersion) != 2) {
    WSACleanup();
    return 1;
}
 
//1. 创建socket, 指明要使用的协议什么
SOCKET sock = socket(
    AF_INET,    //ipv4协议族
    SOCK_DGRAM, //数据报
    IPPROTO_UDP);//udp协议
 
if (sock == INVALID_SOCKET)
{
    printf("创建socket失败 \r\n");
    return 0;
}
 
//2.绑定端口,指明本进程端口是什么
sockaddr_in si;
si.sin_family = AF_INET;
si.sin_port = htons(9527);//0x3725;
 
si.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//0x0100007f; //127.0.0.1
 
int nRet = bind(sock, (sockaddr*)&si, sizeof(si));
if (nRet == SOCKET_ERROR)
{
    printf("端口绑定失败\r\n");
    closesocket(sock);
    return 0;
}
//3.收数据
    sockaddr_in siRecv;
    int nSizeOfSiRecv = sizeof(siRecv);
 
    char szBuff[MAXWORD] = { 0 };
    int nBytesRecv = recvfrom(sock,
        szBuff,
        sizeof(szBuff),
        0,
        (sockaddr*)&siRecv,
        &nSizeOfSiRecv
    );
 
    if (nBytesRecv == SOCKET_ERROR)
    {
        closesocket(sock);
        printf("接受数据失败\r\n");
    }
 
 
    //清理
WSACleanup();

 

posted @   Wings_shadow  阅读(4742)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示