客户端
- #include <stdio.h>
- #include <string.h>
- #include <winsock.h>
- #pragma comment(lib,"ws2_32.lib")
- void main()
- {
- // 存放版本
- WORD wversion;
- // 指针, 存放网络执行信息
- WSADATA wsadata;
- // 管理错误, 标号
- int err;
- // 客户端套接字, 用于连接
- SOCKET sockclient;
- // 服务器地址
- SOCKADDR_IN addrserver;
- // 客户端地址
- SOCKADDR_IN addrclienet;
- // 长度
- int length = 0;
- // 接收
- char recvstr[256] = { 0 };
- // 标示
- BOOL bflags=1;
- // 设定版本
- wversion = MAKEWORD(2, 2);
- err = WSAStartup(wversion, &wsadata);
- if (err!=0)
- {
- printf("获取版本失败");
- return;
- }
- if (LOBYTE(wsadata.wVersion)!=2 || HIBYTE(wsadata.wVersion)!=2)
- {
- printf("版本对比失败, 不一致");
- return;
- }
- //UDP 报文传输
- sockclient = socket(AF_INET, SOCK_DGRAM, 0);
- //setsockopt() 函数, 用于任意类型任意状态套接口的设置选项值
- // 尽管在不同协议层上存在选项, 但本函数仅定义了最高的套接口层次上的选项
- // 多播必须指定的参数
- //flags 设定, 1 代表广播, 0 禁止广播
- setsockopt(sockclient, SOL_SOCKET, SO_REUSEADDR, &bflags, sizeof(bflags));
- // 存放客户端 ip 地址
- addrclienet.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
- addrclienet.sin_family = AF_INET;
- addrclienet.sin_port = htons(9999);// 端口
- // 客户端套接字与客户端信息绑定
- bind(sockclient, (SOCKADDR*)&addrclienet, sizeof(SOCKADDR));
- // 等于地址长度
- length = sizeof(SOCKADDR);
- while (1)
- {
- printf("wait-----------------\n");
- // 从客户端接收消息, 地址信息存放在 addrserver 中
- recvfrom(sockclient, recvstr, 256, 0, (SOCKADDR*)&addrserver, &length);
- if (WSAGetLastError()!=0)
- {
- puts("收取失败");
- }
- // 哪个服务器发送的
- printf("%s speak %s\n", inet_ntoa(addrserver.sin_addr), recvstr);
- }
- closesocket(sockclient);
- WSACleanup();
- system("pause");
- }
服务器端
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
- #include <string.h>
- #include <winsock.h>
- #pragma comment(lib,"ws2_32.lib")
- void main()
- {
- WORD wversion;// 存放版本
- WSADATA wsadata;// 指针, 存放网络执行信息
- int err;// 管理错误, 标号
- SOCKET socksever;// 服务器套接字
- // 记录服务器信息
- SOCKADDR_IN addrserver;
- // 记录客户端信息
- SOCKADDR_IN addrclienet;
- int length = 0;
- char sendstr[256] = { 0 };
- BOOL bflags = 1;// 标示
- wversion = MAKEWORD(2, 2);// 设定版本
- err = WSAStartup(wversion, &wsadata);
- if (err != 0)
- {
- printf("获取版本失败");
- return;
- }
- if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wVersion) != 2)
- {
- printf("版本对比失败, 不一致");
- return;
- }
- socksever = socket(AF_INET, SOCK_DGRAM, 0);// 报文
- // SO_BROADCAST 多播必须指定的参数
- //flags 设定, 1 代表广播, 0 禁止广播
- setsockopt(socksever, SOL_SOCKET, SO_BROADCAST, &bflags, sizeof(bflags));// 绑定
- addrserver.sin_addr.S_un.S_addr = htonl(INADDR_ANY);// 任意主机
- addrserver.sin_family = AF_INET;
- addrserver.sin_port = htons(7888);// 端口
- // 服务器信息与套接字绑定
- bind(socksever, (SOCKADDR*)&addrserver, sizeof(SOCKADDR));// 绑定
- // 填写广播, 255.255.255.255, 广播
- addrclienet.sin_addr.S_un.S_addr = inet_addr("255.255.255.255");
- addrclienet.sin_family = AF_INET;
- addrclienet.sin_port = htons(9999);// 端口
- length = sizeof(SOCKADDR);// 保存地址长度
- while (1)
- {
- memset(sendstr, 0, 256);
- scanf("%s", sendstr);// 获取读取
- // 发送消息到客户端 (广播)
- sendto(socksever, sendstr, strlen(sendstr), 0, (SOCKADDR*)&addrclienet, length);
- }
- closesocket(socksever);
- WSACleanup();
- system("pause");
- }
来源: http://www.bubuko.com/infodetail-2513138.html