广播基本与写udp代码一致;
唯一需要加的代码在发送方:
DWORD bBoard = 1; 是否开启广播
setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char*)&bBoard, sizeof(bBoard));
其余的代码与udp一样
sender.c
WSADATA data;
WSAStartup(MAKEWORD(2, 2), &data);
SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);
SOCKADDR_IN brd_addr;
memset(&brd_addr, 0, sizeof(brd_addr));
char ip[16];
DWORD port = 0;
puts("input board addr and port"); //广播地址 , 接收方的端口
scanf(" %s %d", ip, &port);
brd_addr.sin_addr.s_addr = inet_addr(ip);
brd_addr.sin_family = AF_INET;
brd_addr.sin_port = htons(port);
DWORD bBoard = 1;
//开启广播
setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char*)&bBoard, sizeof(bBoard));
char buf[20] = "im board data";
for (int i = 0; i < 3; ++i)
{
sendto(sock, buf, strlen(buf), 0, (SOCKADDR*)&brd_addr, sizeof(brd_addr));
Sleep(1000);
}
closesocket(sock);
WSACleanup();
recver,c
WSADATA data;
WSAStartup(MAKEWORD(2, 2), &data);
SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);
unsigned short port = 0;
puts("input port");
scanf(" %d", &port); // udp 端口
SOCKADDR_IN self_addr , from_addr;
memset(&self_addr, 0, sizeof(self_addr));
memset(&from_addr, 0, sizeof(from_addr));
self_addr.sin_addr.s_addr = INADDR_ANY;
self_addr.sin_family = AF_INET;
self_addr.sin_port = htons(port);
if (bind(sock, (SOCKADDR*)&self_addr, sizeof(self_addr) )== SOCKET_ERROR){
print_error(WSAGetLastError());
return 0;
}
int socklen = sizeof(from_addr);
char buf[100];
int n = 0;
while (1){
socklen = sizeof(from_addr);
n = recvfrom(sock, buf, 100, 0, (SOCKADDR*)&from_addr, &socklen);
if (n < 0){
print_error(WSAGetLastError());
break;
}
else if (n == 0){
puts("peer closed");
break;
}
else {
buf[n] = 0;
printf("buf:%s , from ip :%s, port:%d\n", buf,
inet_ntoa(from_addr.sin_addr), ntohs(from_addr.sin_port));
}
}