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