#include <stdio.h> #include <Ws2tcpip.h> #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") #define PORT 6060 #define IP "ff02::2" #define BUF_LEN 256 int main(int argc, char* argv[]) { WSADATA wsaData; WORD wVersionRequested; // 版本 wVersionRequested = MAKEWORD(1, 1); //版本信息 WSAStartup(wVersionRequested, &wsaData); //初始化Windows套接字庫 //使用此結構來指定將套接字鏈接到的本地或遠程端點地址 struct sockaddr_in6 addr = { AF_INET6, htons(PORT) }; //建立一個UDP套接字 int l_nServer; if ((l_nServer = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) { perror("建立失敗"); return -1; } bind(l_nServer, (struct sockaddr*)&addr, sizeof(addr)); //ipv6_mreq結構提供了用於IPv6地址的多播組的信息。 struct ipv6_mreq group; //將接口索引指定爲0,則使用默認的多播接口。 group.ipv6mr_interface = 0; //IPv6組播組的地址。 inet_pton(AF_INET6, IP, &group.ipv6mr_multiaddr); //將套接字加入到指定接口上提供的多播組。此選項僅對數據報和原始套接字有效(套接字類>型必須爲SOCK_DGRAM或SOCK_RAW)。 setsockopt(l_nServer, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, (char*)&group, sizeof(group)); int l_naddLen = sizeof(addr); int l_nReadLen = 0; char msgbuf[BUF_LEN]; printf("等待接收\n"); while (1) { l_nReadLen = recvfrom(l_nServer, msgbuf, BUF_LEN, 0, (struct sockaddr*)&addr, &l_naddLen); if (l_nReadLen < 0) { perror("接收失敗"); exit(1); } msgbuf[l_nReadLen] = '\0'; printf("%s\n", msgbuf); strcpy_s(msgbuf, "world"); int l_nLen = sendto(l_nServer, msgbuf, strlen(msgbuf), 0, (struct sockaddr*)&addr, sizeof(addr)); if (l_nLen < 0) { perror("發送失敗"); exit(1); } printf("Send %s\n", msgbuf); } return 0; }
#include <stdio.h> #include <Ws2tcpip.h> #include <winsock2.h> #define HELLO_PORT 7905 #define HELLO_GROUP "224.0.0.1" #pragma comment(lib,"ws2_32.lib") int main(int argc, char* argv[]) { WSADATA wsaData; WORD wVersionRequested; wVersionRequested = MAKEWORD(1, 1); // Initialize Windows socket library WSAStartup(0x0202, &wsaData); int l_nCilect; struct sockaddr_in6 addr = { AF_INET6, htons(6060) }; /* 建立一個UDP套接字 */ if ((l_nCilect = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) { perror("建立失敗"); exit(1); } inet_pton(AF_INET6, "ff02::2", &addr.sin6_addr); char message[128]; int l_naddLen = sizeof(addr); while (1) { strcpy_s(message, "hello"); int l_nLen = sendto(l_nCilect, message, strlen(message), 0, (struct sockaddr*)&addr, sizeof(addr)); if (l_nLen < 0) { perror("發送失敗"); exit(1); } printf("Send %s\n", message); Sleep(1000); int l_nReadLen = recvfrom(l_nCilect, message, strlen(message), 0, (struct sockaddr*)&addr, &l_naddLen); if (l_nReadLen < 0) { perror("接收失敗"); exit(1); } message[l_nReadLen] = '\0'; printf("%s\n", message); } return 0; }