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

📄 network.cpp

📁 TCP/IP and Windows 95. Sources from DDJ article
💻 CPP
字号:
#include "stdafx.h"
#include "string.h"
#include "network.h"

BOOL CNet::InitNet(void)
{
	if(WSAStartup(WS_VERSION_REQD, &m_wsaData))
		{
		TRACE("Couldn't find the winsock.dll\n");
		return FALSE;
		}        
		
	if((LOBYTE(m_wsaData.wVersion) < WS_VERSION_MAJOR))
	    {
	    TRACE("Winsock too old a rev\n");
	    return FALSE;
	    }        
	    
	if(m_wsaData.iMaxSockets < MIN_SOCKETS_REQD)
		{
		TRACE("Not enough sockets available\n");
		return FALSE;
		}                         
       
    
return TRUE;		
	
}

BOOL CNet::CloseNet(void)
{     
	closesocket(m_Socket);
return TRUE;
}

BOOL CNet::SetProtocol(HWND hWnd)
{   


	m_Socket=socket(PF_INET,SOCK_DGRAM,0);
	if(m_Socket == INVALID_SOCKET)
		{
		TRACE("Cannot snag socket\n");
		return FALSE;
		}

	m_srvinfo = getservbyname("tftp","udp"); 
	m_srvinfo->s_port = htons(SERVICEPORT);  
	if(m_srvinfo == NULL)
		{
		TRACE("Can't get service port address\n");
		return FALSE;
		}		
			
	source_addr.sin_family = AF_INET;
	source_addr.sin_addr.s_addr = INADDR_ANY;
	source_addr.sin_port = m_srvinfo->s_port;
	
	if(bind(m_Socket, (LPSOCKADDR) &source_addr, sizeof(source_addr)) == SOCKET_ERROR)
		{
		TRACE("Cannot bind to socket\n");
		return FALSE;
		} 
		
	if((WSAAsyncSelect(m_Socket,hWnd,SOCKET_MESSAGE, FD_READ | FD_WRITE | FD_CLOSE)) ==
		SOCKET_ERROR)
		{
		TRACE("Unable to set wsaasync\n");
		return FALSE;
		}
    

	return TRUE;
	 
}                         

UINT CNet::SendPacket(LPCSTR lpstrDestination, LPCSTR lpstrMessage)
{   
	SOCKADDR_IN	dest_addr;
	
	dest_addr.sin_family = AF_INET;
	dest_addr.sin_addr.s_addr = inet_addr(lpstrDestination);
	dest_addr.sin_port = m_srvinfo->s_port;
	
	return sendto(m_Socket, lpstrMessage, MessageLen(),0,
				  (PSOCKADDR) &dest_addr,sizeof(dest_addr)); 
}

UINT CNet::SendChatPacket(LPCSTR lpstrDestination, CHATPACKET* Message)
{   
	SOCKADDR_IN	dest_addr;
	
	dest_addr.sin_family = AF_INET;
	dest_addr.sin_addr.s_addr = inet_addr(lpstrDestination);
	dest_addr.sin_port = m_srvinfo->s_port;
	
	return sendto(m_Socket, (char *) Message,MessageLen(),0,
				  (PSOCKADDR) &dest_addr,sizeof(dest_addr));
}

UINT CNet::MessageLen(void)
{                         
	return sizeof CHATPACKET;
}	


UINT CNet::RecChatPacket(LPSTR *lpstrSourceAddress,CHATPACKET *Message)
{
	int incoming;                                      
	SOCKADDR_IN	inaddr;                                                      
	int addrlen = sizeof(inaddr);
	incoming = recvfrom(m_Socket,(char *) Message, MessageLen(),
						0, (PSOCKADDR) &inaddr,&addrlen); 
  	
  	*lpstrSourceAddress = inet_ntoa(inaddr.sin_addr);  
    
	if(incoming == -1)
		{
		incoming = 0;
		incoming = WSAGetLastError() + 2000;
		}
		
	return incoming;
}

WORD CNet::NetEvent(LPARAM lParam)
{
return WSAGETSELECTEVENT(lParam);
} 

BOOL CNet::SendBroadCast(LPSTR UserName)
{ 
	CHATPACKET CP;
    strcpy(CP.Name, UserName);
	CP.Channel = 0;
	CP.Color = 0;  
	CP.PacketSeq = 0;
	CP.Mode = BROADCAST;
	strcpy(CP.Message,"Entering Chat");
	CP.MessageLen = strlen(CP.Message);
	CP.CRC = 0;

	int buflen;
    LPHOSTENT spud;
    char *buf = new char[100];
	if (gethostname(buf,buflen) == 0)
  		spud = gethostbyname(buf);
 	if (spud==NULL)
  		return FALSE;		   
    struct in_addr *ptr;
    ptr = (struct in_addr *) spud->h_addr_list[0];
	sprintf(buf,"%s",inet_ntoa(*ptr));
	int octet[4];
	char *location, point = '.';           
	char *temp = new char[5];
	int place= 0;
	int counter = 0;
	for(counter = 0; counter < 3; counter++)
		{
		if((location = strchr(buf,point)) == NULL)
			return FALSE;
		place = location - buf;
		strncpy(temp,buf,place);
		temp[place] = NULL;
		octet[counter] = atoi(temp);
		buf += place+1;
		}
			           
	if(octet[0] < 191)
		octet[2] = 255;
	if(octet[0] < 127)
		octet[1] = 255;			           
    octet[3] = 255;    

	sprintf(buf,"%d.%d.%d.%d",octet[0],octet[1],octet[2],octet[3]);
	if((SendChatPacket(buf,&CP)) > 12000)
		{ 
	
		return FALSE;
		}            

return TRUE;			

}

⌨️ 快捷键说明

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