#include <winsock2.h>
#include <ws2tcpip.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#pragma comment(lib,"ws2_32.lib") //包含必要的库
DWORD dwThreadId, dwThrdParam = 1;
HANDLE hThread;
WSADATA wsd;
struct sockaddr_in local,
remote,
from;
SOCKET sock,sockM;
TCHAR recvbuf[1000],
sendbuf[1000];
int len = sizeof(struct sockaddr_in),
optval,
ret;
DWORD i=0;
char ch;
DWORD WINAPI ThreadFunc( LPVOID lpParam ) ;
void main()
{
//初始化winsock2并创建套接字
WSAStartup(MAKEWORD(2,2),&wsd) ;
sock =WSASocket(AF_INET, SOCK_DGRAM,0,NULL,0,
WSA_FLAG_MULTIPOINT_C_LEAF|WSA_FLAG_MULTIPOINT_D_LEAF|WSA_FLAG_OVERLAPPED);
//绑定本地地址
local.sin_family = AF_INET;
local.sin_port = htons(25000);
local.sin_addr.s_addr = INADDR_ANY; //或者:inet_addr("192.168.0.100");
bind(sock,(struct sockaddr *)&local,sizeof(local));
//设置一个广播组
remote.sin_family = AF_INET;
remote.sin_port = htons(25000);
remote.sin_addr.s_addr =inet_addr("234.5.6.7");
//设置TTL,optval = 8大概为穿过路由器的个数
optval = 8;
setsockopt(sock,IPPROTO_IP,IP_MULTICAST_TTL,(char *)&optval,sizeof(int));
//关闭LOOPBACK,否则发送时自己也能收到
optval = 0;
setsockopt(sock,IPPROTO_IP,IP_MULTICAST_LOOP,(char *)&optval,sizeof(int));
//将创建的套接字加入到广播组
sockM = WSAJoinLeaf(sock,(SOCKADDR *)&remote,sizeof(remote),NULL,NULL,NULL,NULL,JL_BOTH);
//创建起一个线程,阻塞方式用来接收数据
hThread = CreateThread(
NULL, // no security attributes
0, // use default stack size
ThreadFunc, // thread function
&dwThrdParam, // argument to thread function
0, // use default creation flags 如果该参数为0,线程就会立即开始执行
&dwThreadId); // returns the thread identifier
//进入主线程
printf("Press space key to send,press ESC or 'q' to exit!/n");
while(1)
{
if(kbhit())
{
ch = getch();
//按‘q’键或ESC退出
if(ch == 'q' || ch == 27) break;
//按空格键发送
if(ch == ' ')
{
sprintf(sendbuf,"helloworld:%d/n",i++);
printf("string:%d send:/t%s/n",i,sendbuf);
sendto(sock,(char *)sendbuf,20,0,(struct sockaddr *)&remote,sizeof(remote));
}
}
}
closesocket(sock);
WSACleanup();
}
//线程函数
DWORD WINAPI ThreadFunc( LPVOID lpParam )
{
while(1)
{
ret = recvfrom(sock,recvbuf,20,0,(struct sockaddr *)&from,&len);
printf("%s from %s/n",recvbuf,inet_ntoa(from.sin_addr));
}
}