?? 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 + -