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

📄 udp.txt

📁 模拟网络通讯中的UDP通讯
💻 TXT
字号:
#include <iostream>
#include <WinSock2.h>
#include <stdio.h>
#include <IPHlpApi.h>


#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib, "Iphlpapi.lib")

using namespace std;

int error=0;


u_char g_ucLocalMac[6];   //本地MAC地址

DWORD  g_dwGetwayIP;      //网关地址

DWORD g_dwLocalIP;        //本机地址

DWORD g_dwMask;           //子网掩码



void GetLocalNetInfo()

{	
	PIP_ADAPTER_INFO pAdapterInfo = NULL;//该结构只针对IPV4 替代结构体为PIP_ADAPTER_ADDRESSES
	ULONG ulLen = 0;

	// 为适配器结构申请内存
	::GetAdaptersInfo(pAdapterInfo,&ulLen);

	cout<<ulLen<<":"<<sizeof(IP_ADAPTER_INFO)<<endl;
	//pAdapterInfo = (PIP_ADAPTER_INFO)::GlobalAlloc(GPTR, ulLen);

	pAdapterInfo=(PIP_ADAPTER_INFO)malloc(sizeof(IP_ADAPTER_INFO));
	// 取得本地适配器结构信息
	if(::GetAdaptersInfo(pAdapterInfo,&ulLen) ==  ERROR_SUCCESS)
	{
		if(pAdapterInfo != NULL)
		{
			memcpy(g_ucLocalMac, pAdapterInfo->Address, 6);
			g_dwGetwayIP = ::inet_addr(pAdapterInfo->GatewayList.IpAddress.String);
			g_dwLocalIP = ::inet_addr(pAdapterInfo->IpAddressList.IpAddress.String);
			g_dwMask = ::inet_addr(pAdapterInfo->IpAddressList.IpMask.String);
		}
	}

	free(pAdapterInfo);

	printf(" \n -------------------- 本地主机信息 -----------------------\n\n");
	in_addr in;
	in.S_un.S_addr = g_dwLocalIP;
	printf("      IP Address : %s \n", ::inet_ntoa(in));

	in.S_un.S_addr = g_dwMask;
	printf("     Subnet Mask : %s \n", ::inet_ntoa(in));

	in.S_un.S_addr = g_dwGetwayIP;
	printf(" Default Gateway : %s \n", ::inet_ntoa(in));

	u_char *p = g_ucLocalMac;
	printf("     MAC Address : %02X-%02X-%02X-%02X-%02X-%02X \n", p[0], p[1], p[2], p[3], p[4], p[5]);

	printf(" \n \n ");
	//PIP_ADAPTER_ADDRESSES pAddresses;
	//ULONG outBufLen = 0;
	//DWORD dwRetVal = 0;

	////为适配器申请内存

	//// 为适配器结构申请内存
	//pAddresses=(PIP_ADAPTER_ADDRESSES)malloc(sizeof(IP_ADAPTER_ADDRESSES));
	//if (::GetAdaptersAddresses(AF_INET, 0, NULL, pAddresses, &outBufLen) 
	//	== ERROR_BUFFER_OVERFLOW) {
	//		free(pAddresses);
	//		pAddresses = (IP_ADAPTER_ADDRESSES*) malloc(outBufLen);
	//}

	//if ((dwRetVal = ::GetAdaptersAddresses(AF_INET, 
	//	0, 
	//	NULL, 
	//	pAddresses, 
	//	&outBufLen)) == NO_ERROR) {
	//		// If successful, output some information from the data we received
	//		PIP_ADAPTER_ADDRESSES pCurrAddresses = pAddresses;
	//		while (pCurrAddresses) {
	//			printf("\tFriendly name: %S\n", pCurrAddresses->FriendlyName);
	//			printf("\tDescription: %S\n", pCurrAddresses->Description);
	//			pCurrAddresses = pCurrAddresses->Next;
	//		}
	//}
	//else { 
	//	printf("Call to GetAdaptersAddresses failed.\n");
	//	LPVOID lpMsgBuf;
	//	if (FormatMessage( 
	//		FORMAT_MESSAGE_ALLOCATE_BUFFER | 
	//		FORMAT_MESSAGE_FROM_SYSTEM | 
	//		FORMAT_MESSAGE_IGNORE_INSERTS,
	//		NULL,
	//		dwRetVal,
	//		MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
	//		(LPTSTR) &lpMsgBuf,
	//		0,
	//		NULL )) {
	//			printf("\tError: %s", lpMsgBuf);
	//	}
	//	LocalFree( lpMsgBuf );
	//}


 //   free(pAddresses);


}


void GetDNSInfo()

{
	FIXED_INFO * FixedInfo;
	ULONG    ulOutBufLen;
	DWORD    dwRetVal;
	IP_ADDR_STRING * pIPAddr;

	FixedInfo = (FIXED_INFO *) malloc(sizeof( FIXED_INFO ));
	ulOutBufLen = sizeof( FIXED_INFO );

	if( ERROR_BUFFER_OVERFLOW == GetNetworkParams( FixedInfo, &ulOutBufLen ) ) 
	{
		free( FixedInfo );
	}

	if ( dwRetVal = GetNetworkParams( FixedInfo, &ulOutBufLen ) ) {
		printf( "GetNetworkParams failed with error: %08x\n", dwRetVal );
	}
	else {
		printf( "Host Name: %s\n", FixedInfo -> HostName );
		printf( "Domain Name: %s\n", FixedInfo -> DomainName );

		printf( "DNS Servers:\n" );
		printf( "\t%s\n", FixedInfo -> DnsServerList.IpAddress.String );
		pIPAddr = FixedInfo -> DnsServerList.Next;
		while ( pIPAddr ) {
			printf( "\t%s\n", pIPAddr ->IpAddress.String );
			pIPAddr = pIPAddr ->Next;
		}
	}

}

HANDLE  threadHandle;     //工作线程的句柄

DWORD WINAPI WorkThread(LPVOID parame);
sockaddr_in  serverAddr;

CRITICAL_SECTION criticalSection;

void main()

{
	WSAData wsaData;

	error=WSAStartup(MAKEWORD(10,2),&wsaData);

	::InitializeCriticalSection(&criticalSection);

	if (error!=0)
	{
		cout<<"加载网络库失败!"<<error<<endl;
	}

	//得到本机的所有网络信息
	GetLocalNetInfo();
    

	GetDNSInfo();

	serverAddr.sin_addr.S_un.S_addr=g_dwLocalIP;
	serverAddr.sin_family=AF_INET;
    serverAddr.sin_port=htons(6060);
    
	SOCKET s=socket(AF_INET,SOCK_DGRAM,0);

	bind(s,(sockaddr*)&serverAddr,sizeof(sockaddr_in));
  
	DWORD threadID=0;

	threadHandle=CreateThread(0,0,WorkThread,(LPVOID)&s,NULL,&threadID);

	char sendBuff[10]="";

	char recvBuff[10]="";


	
	while (true)
	{
		EnterCriticalSection(&criticalSection);

		cout<<"请输入信息"<<endl;
		cin>>sendBuff;

		int sendLen= sendto(s,sendBuff,strlen(sendBuff)+1,0,(sockaddr*)&serverAddr,sizeof(sockaddr));

		if (sendLen!=-1)
		{
			cout<<"发送成功,发送字节数为:"<<sendLen<<endl;

			cout<<"发送内容为:"<<sendBuff<<endl;

			LeaveCriticalSection(&criticalSection);
		}

		else

		{
			cout<<"发送失败!"<<endl;

		}

	}	
	
}

DWORD WINAPI WorkThread(LPVOID parame)

{
	char recvBuff[10]="";

	int  recvLen=sizeof(SOCKADDR);

	SOCKET s=*(SOCKET*)parame;

	

	int Len=0;
	while (true)
	{
		EnterCriticalSection(&criticalSection);

		recvfrom(s,recvBuff,sizeof(recvBuff),0,(sockaddr*)&serverAddr,&recvLen);//若发送方数据过大要接收多次

		cout<<"----------------------------------------------------------"<<endl;
		cout<<"收到网络信息"<<endl;

		cout<<"打印网络信息"<<Len<<endl;

		cout<<"收到的信息是:"<<recvBuff<<endl;

		LeaveCriticalSection(&criticalSection);


	}
	return 0;

}

⌨️ 快捷键说明

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