接收端:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#include <ws2tcpip.h>
void sockerr(const char* message)
{
wchar_t* s = NULL;
FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, WSAGetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPWSTR)&s, 0, NULL);
fprintf(stderr, "%s: (%d) %S\n", message, WSAGetLastError(), s);
}
int main(int argc, char* argv[])
{
int addr_len;
struct sockaddr_in sin, sin_recv, * sreq;
struct ip_mreq multi;
struct group_req req;
char mes[1500], name[100];
int c, option, len;
struct addrinfo* m_ai, * i_ai;
struct WSAData data;
SOCKET sock;
if (WSAStartup(2, &data)) {
sockerr("Error in WSAStartup");
exit(1);
}
memset(&multi, 0, sizeof(multi));
inet_pton(AF_INET, "224.0.22.1", &multi.imr_multiaddr);
//multi.imr_interface = 11;
char hostname[128];
struct hostent* pHost;
if (gethostname(hostname, 128) == 0)
{
printf("%s\n", hostname);//计算机名字
}
pHost = gethostbyname(hostname);
struct ip_mreq imr;
int sm;
memset(&imr, 0, sizeof(struct ip_mreq));
imr.imr_multiaddr.S_un.S_addr = inet_addr("224.0.22.1");
imr.imr_interface.S_un.S_addr = inet_addr(inet_ntoa(*(struct in_addr*)pHost->h_addr_list[1]));
memset(&req, 0, sizeof(req));
sreq = (struct sockaddr_in*)&req.gr_group;
sreq->sin_family = AF_INET;
inet_pton(AF_INET, "224.0.22.1", &sreq->sin_addr);
req.gr_interface = 0;
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
//inet_pton(AF_INET, "::", &sin.sin_addr);
sin.sin_addr.s_addr = inet_addr("192.168.0.15");
sin.sin_port = htons(9210);
if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
sockerr("Error creating socket");
exit(1);
}
if (bind(sock, (struct sockaddr*)&sin, sizeof(sin)) == -1) {
sockerr("Error binding socket");
closesocket(sock);
exit(1);
}
//if (setsockopt(sock,IPPROTO_IPV6,IPV6_JOIN_GROUP,(char *)&multi,sizeof(multi))== -1) {
if (setsockopt(sock, IPPROTO_IP, MCAST_JOIN_GROUP, (char*)&req, sizeof(req)) == -1) {
sockerr("Error joining multicast group");
closesocket(sock);
exit(1);
}
while (1) {
memset(mes, 0, sizeof(mes));
memset(&sin_recv, 0, sizeof(sin_recv));
addr_len = sizeof(sin_recv);
printf("%d: Waiting for packet...\n", getpid());
if ((len = recvfrom(sock, mes, sizeof(mes), 0, (struct sockaddr*)&sin_recv, &addr_len)) == -1) {
sockerr("error recving socket");
closesocket(sock);
exit(1);
}
if (inet_ntop(AF_INET6, &sin_recv.sin_addr, name, sizeof(name)) == NULL) {
sockerr("inet_ntop failed");
continue;
}
printf("%d: Got packet\n", getpid());
printf("%d: Origin: %s port %d\n", getpid(), name, sin_recv.sin_port);
printf("%d: Len: %d, Message: %s\n", getpid(), len, mes);
}
}