实现网络广播,开启了收发两个线程,具有收、发两个功能

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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <iostream>
#include <process.h>
#include <WinSock2.h>//windows API
#pragma comment(lib,"ws2_32.lib")
#define IP "127.0.0.1"
#define SENDPORT 0
#define RECVPORT 3781
#define BROADCAST "255.255.255.255"
using namespace std;
struct ARGLIST{
    SOCKET  sock;
    sockaddr_in addr;
};
void send_process(void *p)
{
    ARGLIST send_process;
    send_process = *((ARGLIST *)p);
    char sendbuffer[4096];
    while (true)
    {
        gets_s(sendbuffer);
        if (0 == strcmp(sendbuffer, "#"))
        {
            _endthread();
        }
        if (SOCKET_ERROR == sendto(send_process.sock, sendbuffer, strlen(sendbuffer), 0, (sockaddr *)&send_process.addr, sizeof(send_process.addr)))
        {
            cout << "发送失败" << GetLastError() << endl;
            _endthread();
        }
        else
        {
            cout << "发送成功" << endl;
        }
    }
}
void recv_process(void *p)
{
    ARGLIST recv_process;
    recv_process = *((ARGLIST *)p);
    char recvbuffer[4096];
    int nLen = sizeof(recv_process.addr);
    while (true)
    {
        int n = recvfrom(recv_process.sock, recvbuffer, sizeof(recvbuffer), 0, (sockaddr *)&recv_process.addr, &nLen);
        if (SOCKET_ERROR == n)
        {
            cout << "接收失败" << GetLastError() << endl;
            _endthread();
        }
        recvbuffer[n] = 0;
        cout << "发送者IP:" << inet_ntoa(recv_process.addr.sin_addr) << " 端口:" << htons(recv_process.addr.sin_port) << endl;
        cout << "接收:" << recvbuffer << endl;
    }
}
int GetSendList(ARGLIST &sendlist)
{
    WSADATA wd;
    WSAStartup(0x0202, &wd);
     
    SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (INVALID_SOCKET == sock)
    {
        cout << "创建套接字错误" << GetLastError() << endl;
    }
    sockaddr_in sin = { AF_INET };
    //sin.sin_addr.s_addr = INADDR_BROADCAST;  
    sin.sin_addr.S_un.S_addr = inet_addr(IP);
    sin.sin_port = htons(SENDPORT);
    if (SOCKET_ERROR == bind(sock, (sockaddr *)&sinsizeof(sin)))
    {
        cout << "Send绑定套接字错误" << GetLastError() << endl;
        return 0;
    }
    bool bOpt = true;
    //设置该套接字为广播类型  
    if (SOCKET_ERROR == setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char*)&bOpt, sizeof(bOpt)))
    {
        cout << "Send设置套接字错误" << GetLastError() << endl;
    }
    sendlist.sock = sock;
    sockaddr_in sin_from = { AF_INET };
    //sin.sin_addr.s_addr = INADDR_BROADCAST;  
    sin_from.sin_addr.S_un.S_addr = inet_addr(BROADCAST);
    sin_from.sin_port = htons(RECVPORT);
    sendlist.addr = sin_from;
    return 1;
}
int GetRecvList(ARGLIST &recvlist)
{
    WSADATA wd;
    WSAStartup(0x0202, &wd);
    SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (sock == INVALID_SOCKET)
    {
        cout << "创建套接字错误" << GetLastError() << endl;
    }
    sockaddr_in sin = { AF_INET };
    //sin.sin_addr.s_addr = INADDR_BROADCAST;
    sin.sin_addr.S_un.S_addr = inet_addr(IP);
    sin.sin_port = htons(RECVPORT);
    if (SOCKET_ERROR == bind(sock, (sockaddr *)&sinsizeof(sin)))
    {
        cout << "Recv绑定套接字错误" << GetLastError() << endl;
        return 0;
    }
    bool bOpt = true;
    //设置该套接字为广播类型  
    if (SOCKET_ERROR == setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char*)&bOpt, sizeof(bOpt)))
    {
        cout << "Recv设置套接字错误" << GetLastError() << endl;
    }
    recvlist.sock = sock;
    sockaddr_in sin_from = { AF_INET };
    sin_from.sin_addr.s_addr = INADDR_BROADCAST;
    //sa.sin_addr.S_un.S_addr = inet_addr(IP);
    sin_from.sin_port = htons(SENDPORT);
    recvlist.addr = sin;
    return 1;
}
int main()
{
    ARGLIST sendlist,recvlist;
    if (0 == GetSendList(sendlist))
    {
        return 0;
    }
    if (0 == GetRecvList(recvlist))
    {
        return 0;
    }
    char *hello = "Hello";
    if (SOCKET_ERROR == sendto(sendlist.sock, hello, strlen(hello), 0, (sockaddr *)&sendlist.addr, sizeof(sendlist.addr)))
    {
        cout << "发送失败" << GetLastError() << endl;
        return 0;
    }
    _beginthread(send_process, 0, &sendlist);
    _beginthread(recv_process, 0, &recvlist);
    while(true)
    {
    }
    return 0;
}

转载于:https://www.cnblogs.com/amu-long/p/7467340.html

UDP网络编程-广播相关推荐

  1. JAVA UDP网络编程学习笔记

    一.UDP网络编程概述 采用TCP协议通信时,客户端的Socket必须先与服务器建立连接,连接建立成功后,服务器端也会持有客户端连接的Socket,客户端的Socket与服务器端的Socket是对应的 ...

  2. python交互式编程客户端_【python】UDP网络编程:实现服务端与客户端的交互、简单的AI智能模式...

    关于UDP网络编程 UDP(user datagram protocol)的中文叫用户数据报协议,属于传输层.UDP是面向非连接的协议,它不与对方建立连接,而是直接把要发的数据发给对方. [UDP网络 ...

  3. <UDP网络编程>——《计算机网络》

    目录 1. 网络基础知识 1.1 理解源IP地址和目的IP地址 1.2 认识端口号 1.3 理解 "端口号" 和 "进程ID" 1.3.1 理解源端口号和目的端 ...

  4. C语言笔记-26-网络-UDP网络编程

    C语言笔记-26-网络-UDP网络编程 文章目录 C语言笔记-26-网络-UDP网络编程 前言 一.UDP编程模型概括 三.UDP编程模型代码 UDP服务端 UDP客户端 总结 前言 自学笔记,没有历 ...

  5. 【Java】UDP网络编程

    文章目录 前言 DatagramSocket DatagramPacket 注意事项与区别 代码演示 前言 UDP(user datagram protocol)的中文叫用户数据报协议,属于传输层. ...

  6. udp java_Java实现Udp网络编程

    在看到本文之前,如果读者没看过笔者的上一个系列 Java实现Socket网络编程,建议先翻阅. 笔者将在上期Demo的基础上,进一步修改和扩展,达到本次Demo的运行效果. 首先展示Demo的演示效果 ...

  7. TCP、UDP网络编程面试题

    TCP.UDP.Socket.HTTP网络编程面试题 什么是网络编程 网络编程的本质是多台计算机之间的数据交换.数据传递本身没有多大的难度,不就是把一个设备中的数据发送给其他设备,然后接受另外一个设备 ...

  8. 【linux高级程序设计】(第十五章)UDP网络编程应用 2

    UDP广播通信 单播:一对一,TCP和UDP均可完成 广播:只能UDP完成.广播时发送方只发送一个数据包,但是网络上的交换机默认转发广播数据包到所有端口.路由器默认不转发任何广播数据包.故广播在局域网 ...

  9. 7、linux网络编程--广播

    同一个子网的所有主机网卡都会接受所在网段广播地址的数据包.广播地址应用于局域网内的所有主机. 广播地址是专门用于同时向网络中所有工作站发送的一个地址. 广播地址主要分为两类: (1)受限广播:路由器从 ...

  10. Java的TCP/UDP网络编程+多线程实现服务器端与客户端间的通信

    写在前面: Java为网络编程提供了丰富的库,我们能通过调用Socket套接字的方法实现服务器与客户端的双通信. 注意点: 需要注意的是端口的对应,端口可以理解为窗户,服务器只能通过某个端口(窗户)与 ...

最新文章

  1. C#尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
  2. tar命令使用方法以及.tar.gz文件和.zip文件
  3. 【管理】舍KPI取OKR,Google的管理方法
  4. laravel mysql增删改查_Laravel框架数据库操作的增删改三种方式 阿星小栈
  5. mysql操作数据库
  6. java代码如何删除文件_Java如何删除文件和目录代码? 爱问知识人
  7. 【跃迁之路】【712天】程序员高效学习方法论探索系列(实验阶段469-2019.2.2)...
  8. Struts2配置国际化文件
  9. ie7下scroll不触发,滚动位置不对的问题
  10. android开机动画多长时间_Android开机动画及黑屏
  11. 代码整洁之道-读书笔记
  12. Java 山上有一口缸可以装50升水,现在有15升。老和尚叫小和尚下山挑水,每次挑5升,要挑几次。
  13. java ant和maven_JAVA构建工具:Maven与Ant的区别
  14. KDD2020|字节联合密歇根州立大学提出推荐广告联合训练框架RAM(已开源)
  15. 【数学模拟卷总结】2022李林四套卷数学二第二套
  16. 红帽子企业Linux 5安装序列号
  17. gitlab 生成ssh密匙
  18. HTML代码via浏览器logo,Via浏览器怎么定制首页 几步轻松完成
  19. 【mysql】dump
  20. 19种分布式系统设计模式

热门文章

  1. [转] SQL Server中各个系统表的作用
  2. 当知识图谱遇上预训练语言模型 -- 留言送书
  3. 关于开学,我的心路历程~我已不想开学了
  4. 【NLP入门】手把手带你CNN文本分类(附代码)
  5. 为什么要使用向量化?
  6. 百面机器学习—模型复杂度与模型的方差、偏差的关系
  7. numpy - np.where
  8. python基础4-序列
  9. linux--kubectl命令和docker命令
  10. LeetCode—Python版数组简单题(一)