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

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;

}

时间: 2024-10-10 09:02:48

UDP网络编程-广播的相关文章

UDP网络编程

IP地址和端口 IP地址:是计算机在网络中的唯一标示,我们在进行网络编程时一定要定位到远程计算机,而IP地址就是解决这个问题的. 端口:除了计算机外我们还要定位到具体的应用程序进程,而端口就是给应用程序分配的身份标示. UDP和TCP UDP:1,每个数据报中都给出了完整的地址信息,因此无需要建立发送方和接收方的连接.            2,UDP传输数据时是有大小限制的,每个被传输的数据报必须限定在64kB之内.             3,UDP是一个不可靠的协议,发送方所发送的数据报并

unix域套接字的UDP网络编程

unix域套接字的UDP网络编程,服务端如下: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <sys/types.h> #include <sys/un.h> #define SA struct sockaddr #define PATHNAME

黑马程序员_JAVA UDP网络编程学习笔记

一.UDP网络编程概述 采用TCP协议通信时,客户端的Socket必须先与服务器建立连接,连接建立成功后,服务器端也会持有客户端连接的Socket,客户端的Socket与服务器端的Socket是对应的,它们构成了两个端点之间的虚拟通信链路.与TCP通信不同,UDP是面向无连接的.不可靠的基于数据包的传输协议.即应用进程(或程序)在使用UDP协议之前,不必先建立连接.自然,发送数据结束时也没有连接需要释放.因此,减少了开销和发送数据之前的延时.UDP也采用端口来区分进程. 在java中,java.

TCP 、UDP网络编程作业代写、代写C 语言 TCP程序 Network Programming using C

TCP .UDP网络编程作业代写.代写C 语言 TCP程序Network Programming using COverview? This homework is due by 11:59:59 PM on Thursday, April 26, 2018.? This homework will count as 8% of your final course grade.? This homework is to be completed individually. Do not shar

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

UDP广播通信 单播:一对一,TCP和UDP均可完成 广播:只能UDP完成.广播时发送方只发送一个数据包,但是网络上的交换机默认转发广播数据包到所有端口.路由器默认不转发任何广播数据包.故广播在局域网范围内. 组播:只有UDP可以完成.发送消息到同一个组播组的主机.视频电话.视频会议多采用. 广播IP地址:主机号全1.网络号正常 广播MAC地址:全1,即FF:FF:FF:FF:FF:FF 广播数据帧格式 处理过程: 网卡驱动程序对比自己的MAC地址与目的MAC地址,发现是广播MAC地址,统一接收

TCP/UDP网络编程的基础知识与基本示例(windows和Linux)

一.TCP编程的一般步骤 服务器端: 1.创建一个socket,用函数socket() 2.绑定IP地址.端口等信息到socket上,用函数bind() 3.开启监听,用函数listen() 4.接收客户端上来的连接,用函数accept() 5.收发数据,用函数send()和recv(),或者read()和write() 6.关闭网络连接 7.关闭监听 客户端: 1.创建一个socket,用函数socket() 2.设置要连接的对方IP地址和端口等属性 3.连接服务器,用函数connect()

TCP与UDP网络编程总结(一)

(1):TCP网络编程 我们注意到服务端与客户端通信时是通过客户端的套接字相互通信的,那么服务端的套接字主要是干什么用的呢? TCP服务端设置监听套接字时 int listen(int sock,int backlog); 会一直阻塞在此函数,等待客户端的连接请求.其中 backlog 是设置等待连接请求的队列大小: 当有多个客户端连接一个服务端时,在某个客户端请求连接,直到服务端受理连接时,服务端处于等待连接请求的状态. 客户端请求连接的状态,本身也是一种往网络中发送数据,所以此时服务端想要接

Linux网络编程——广播

概述 在生活中广播无处不在,像平时在大街上卖物品的商人,在进行推广产品的时候往往都是使用一个喇叭来进行吆喝:"十块钱买不了吃亏,十块钱买不了上当,走过路过千万不要错过",这就是广播. 那么在网络中的广播又是什么样子的呢? 网络上的广播指:由一台主机向该主机所在子网内(同一个局域网)的所有主机发送数据的方式.如下图的 1 号主机广播给 2.3.4.5 号主机发送数据: 实现广播,离不开广播地址,同一个子网(局域网)的所有主机网卡都会接收所在网段广播地址的数据包.广播地址应用于局域网内的所

UNIX网络编程笔记(6)—UDP网络编程

基本UDP套接字编程 1. 概述 TCP和UDP的本质区别就在于:UDP是无连接不可靠的数据报协议,TCP是面向连接的可靠字节流.因此使用TCP和UDP编写的应用程序存在一些差异.使用UDP编写的一些常见的应用程序有:DNS(域名解析系统).NFS(网络文件系统)和SNMP(简单网络管理协议). 2. sendto和recvfrom函数 类似与标准的read和write函数: #include <sys/socket.h> ssize_t recvfrom (int sockfd,void *