⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 组播通讯发送程序.cpp

📁 一个很不错的基于winsock的控制台组播程序, 已经调试没有错误,xp系统下运行无误
💻 CPP
字号:
#include <winsock2.h>  
#define BUFSIZE 1024  
#define MAXADDRSTR 16  
#define LOOPMAX 10  
#include "stdio.h"


int main() {  

	
int nRet, i;  
int nIP_TTL = 2;  
BOOL bFlag;  
DWORD dFlag;  
DWORD cbRet;  
int iLen = MAXADDRSTR;  
char strDestMulti[ MAXADDRSTR] = "234.1.1.1";  //组播地址
SOCKADDR_IN stSrcAddr, stDestAddr;//原地址,目的地址  

SOCKET hSock, hNewSock; 
 
u_short nDestPort = 3456; //组播端口
WSABUF stWSABuf;  
char achInBuf [BUFSIZE];  
char achOutBuf[] = "Message number:   ";  
WSADATA stWSAData;  
/*初始化 WinSock,加载ws2_32.dll */  
WSAStartup(0x0202, &stWSAData);  
/* convert address string to value */  
stDestAddr.sin_family = AF_INET;  

nRet = WSAStringToAddress (strDestMulti, AF_INET, NULL, (LPSOCKADDR)&stDestAddr, &iLen);  
//主要就是用于填充Ip结构体?
  
/* 创建socket */  
hSock = WSASocket(AF_INET, SOCK_DGRAM, 0,(LPWSAPROTOCOL_INFO)NULL, 0, WSA_FLAG_MULTIPOINT_C_LEAF| WSA_FLAG_MULTIPOINT_D_LEAF);  
/* 允许端口重用 */  
bFlag = TRUE;  
nRet = setsockopt(hSock, SOL_SOCKET, SO_REUSEADDR,(char *)&bFlag, sizeof  
(bFlag));  
 
stSrcAddr.sin_family = PF_INET;     //数据发送源地址
stSrcAddr.sin_port = htons ( nDestPort);  
stSrcAddr.sin_addr.s_addr = inet_addr("234.1.1.1");  

nRet = bind (hSock,(struct sockaddr FAR *)&stSrcAddr,sizeof(struct  sockaddr));  
 
/* byte swap host to network order */  
stDestAddr.sin_family = PF_INET;  
nRet = WSAHtons(hSock, nDestPort, &(stDestAddr.sin_port));   
/* set the IP TTL */  
nRet = WSAIoctl (hSock, SIO_MULTICAST_SCOPE, &nIP_TTL, sizeof (nIP_TTL),  NULL, 0,    &cbRet,   NULL,   NULL);   
/* 禁止loopback */  
bFlag = FALSE;  
nRet = WSAIoctl (hSock, SIO_MULTIPOINT_LOOPBACK,  &bFlag,  sizeof (bFlag),  NULL,   0,  &cbRet,   NULL,   NULL);   
/* 加入multicast 组*/  
hNewSock = WSAJoinLeaf (hSock,(PSOCKADDR)&stDestAddr, sizeof (stDestAddr), NULL,   NULL,    NULL,   NULL,   JL_BOTH);  
/* 发送和接收*/  
 
 static iCounter = 1;  
 stWSABuf.buf = achOutBuf;  
 stWSABuf.len = lstrlen(achOutBuf);  
 cbRet = 0;  
 itoa(iCounter++, &achOutBuf[ 16], 10);  

 
	 nRet = WSASendTo (hSock,   &stWSABuf,    1,   &cbRet,   0,   (struct sockaddr*)&stDestAddr,  sizeof(struct sockaddr),   NULL,  NULL);   
	
	 if (nRet == SOCKET_ERROR)   
	printf("WSASendTo() failed, Err: % d\ n",WSAGetLastError()); 

 


  
/*结束Socket */  
WSACleanup();  
return (0);  
}   










































⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -