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

📄 networkdlg.cpp

📁 Visual C++_ 600 编程学习捷径
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		case FD_READ:
		{					
			if((len = recv(sock_connect, (char *)buf, 2048, 0)) == SOCKET_ERROR)
				break;
			DealWithNetComm(6, connect_host, buf, len);

		}
			break;
		case FD_WRITE:
			break;
		case FD_CONNECT:
			if(WSAGETSELECTERROR(lParam) == 0)
				DealWithNetComm(7, connect_host, buf, 0);
			else
				DealWithNetComm(8, connect_host, buf, 0);
			break;
		case FD_CLOSE:
			WSAAsyncSelect(sock_connect, m_hWnd, 0, 0);
			closesocket(sock_connect);
			sock_connect = 0;
			DealWithNetComm(3, connect_host, buf, 0);
			break;
		default:
			break;
	}
}

BOOL CNetworkDlg::Connect(char *ip)
{
	unsigned long IP = inet_addr(ip);
	if(IP == INADDR_NONE)
	{
		MessageBox("IP address error", "ERROR", MB_OK);
		return FALSE;
	}

	struct sockaddr_in server;
	if(sock_connect != 0)
	{
	//	WSAAsyncSelect(sock_connect, hWnd, 0, 0);
		closesocket(sock_connect);
		sock_connect = 0;
	}
	strcpy(connect_host, ip);

	sock_connect = socket(AF_INET, SOCK_STREAM, 0);
	if(sock_connect == INVALID_SOCKET)
	{
		sock_connect = 0;
		MessageBox("can not create connect socket!", "ERROR", MB_OK);
		return FALSE;
	}

	server.sin_family = AF_INET;
	server.sin_port = htons(0);
	server.sin_addr.s_addr = INADDR_ANY;

	if(bind(sock_connect, (struct sockaddr *)&server, sizeof(server)) == SOCKET_ERROR)
	{
		MessageBox("connect socket bind error!\n", "ERROR", MB_OK);
		closesocket(sock_connect);
		sock_connect = 0;
		return FALSE;
	}  
	if(WSAAsyncSelect(sock_connect, m_hWnd, US_CONNECT_SOCK, FD_READ | FD_WRITE | FD_CLOSE | FD_CONNECT) == SOCKET_ERROR)
	{
		MessageBox("connect socket select event error!", "ERROR", MB_OK);
		closesocket(sock_connect);
		sock_connect = 0;
		return FALSE;
	}
	server.sin_port = htons((u_short)5000);
	server.sin_addr.s_addr = IP;
	int nRet = connect(sock_connect, (struct sockaddr *)&server, sizeof(server));
    if (nRet == SOCKET_ERROR)
	{
	    int WSAErr = WSAGetLastError();
		               
	    /* Anything but "would block" error is bad */
	    if (WSAErr != WSAEWOULDBLOCK) 
		{
	      MessageBox("connect center SERVER failed!", "ERROR", MB_OK);
	      closesocket(sock_connect);
	      sock_connect = 0;
		  return FALSE;
	    }
    }
	Sleep(500);//waiting for connect success

	return TRUE;
}

BOOL CNetworkDlg::Disconnect(void)
{
	if(sock_connect)
	{
		WSAAsyncSelect(sock_connect, m_hWnd, 0, 0);
		closesocket(sock_connect);
		sock_connect = 0;
	}
	return TRUE;
}

int CNetworkDlg::Send(BYTE *buf, int len)
{
	if(sock_connect == 0)
	{
		MessageBox("Please Call Connect() first!", "ERROR", MB_OK);
		return -1;
	}
	if(buf == NULL)
	{
		MessageBox("buffer pointer nul", "ERROR", MB_OK);
		return -1;
	}
	int num = 0;
	if((num = send(sock_connect, (const char *)buf, len, 0)) == SOCKET_ERROR)
	{
		MessageBox("send faild", "ERROR", MB_OK);
		return -1;
	}

	return num;
}

int CNetworkDlg::Reply(char *ip, BYTE *buf, int len)
{
	if(buf == NULL)
	{
		MessageBox("buffer pointer nul", "ERROR", MB_OK);
		return -1;
	}
	int num = 0;
	SOCKLOG * psock = sock_client;
	while(psock)
	{
		if(strcmp(ip, psock->ip) == 0)
		{
			if((num = send(psock->socket, (const char *)buf, len, 0)) == SOCKET_ERROR)
			{
				MessageBox("send faild", "ERROR", MB_OK);
				return -1;
			}
			break;
		}
		else
		{
			psock = psock->next;
		}
	}

	return num;
}

int CNetworkDlg::Broadcast(BYTE *buf, int len)
{
	if(sock_udp == 0)
	{
		MessageBox("Please Call InitSocket() first", "ERROR", MB_OK);
		return -1;
	}
	if(buf == NULL)
	{
		MessageBox("buffer pointer nul!", "ERROR", MB_OK);
		return -1;
	}

	struct sockaddr_in to;
	to.sin_family = AF_INET;
	to.sin_port = htons((u_short)6000);
	to.sin_addr.s_addr = INADDR_BROADCAST;

	int num = 0;
	if((num = sendto(sock_udp, (const char *)buf, len, 0, (struct sockaddr *)&to, sizeof(to))) == SOCKET_ERROR)
	{
		MessageBox("Broadcast failed", "ERROR", MB_OK);
		return -1;
	}

	return num;
}

int CNetworkDlg::SendTo(char *ip, BYTE *buf, int len)
{
	unsigned long IP = inet_addr(ip);
	if(IP == INADDR_NONE)
	{
		MessageBox("IP address error!", "ERROR", MB_OK);
		return -1;
	}
	if(sock_udp == 0)
	{
		MessageBox("Please Call InitSocket() first", "ERROR", MB_OK);
		return -1;
	}
	if(buf == NULL)
	{
		MessageBox("buffer pointer nul!", "ERROR", MB_OK);
		return -1;
	}

	struct sockaddr_in to;
	to.sin_family = AF_INET;
	to.sin_port = htons((u_short)6000);
	to.sin_addr.s_addr = IP;

	int num;
	if((num = sendto(sock_udp, (const char *)buf, len, 0, (struct sockaddr *)&to, sizeof(to))) == SOCKET_ERROR)
	{
		MessageBox("send failed!", "ERROR", MB_OK);
		return -1;
	}

	return num;
}

void CNetworkDlg::UninitSocket(void)
{
	if(sock_connect != 0)
	{
		WSAAsyncSelect(sock_connect, m_hWnd, 0, 0);
		closesocket(sock_connect);	
		sock_connect = 0;
	}
	SOCKLOG * psock = sock_client;
	while(psock)
	{
		closesocket(psock->socket);
		sock_client = psock->next;
		delete psock;
		psock = sock_client;
	}
	if(sock_listen != 0)
	{
		WSAAsyncSelect(sock_listen, m_hWnd, 0, 0);
		closesocket(sock_listen);
		sock_listen = 0;
	}
	if(sock_udp != 0)
	{
		WSAAsyncSelect(sock_udp, m_hWnd, 0, 0);
		closesocket(sock_udp);
		sock_udp = 0;
	}

	WSACleanup();
}

/*
函数 DealWithNetComm()

参数:
UINT uId = 1 用户登录
         = 2 用户登录断开
		 = 3 服务器登录被断开
		 = 4 收到广播数据或UDP数据
		 = 5 收到客户发来的数据
		 = 6 收到服务器发来的数据
		 = 7 服务器登录已连接成功
		 = 8 服务器登录失败

char * ip   IP地址
BYTE * buf  数据缓冲区
DWORD  len  缓冲区数据长度
*/
void CNetworkDlg::DealWithNetComm(UINT uId, char *ip, BYTE *buf, DWORD len)
{
	CString   strBuffer;    
	char info[100];

	switch(uId)
	{
	case 1:
		m_RecvInfo.GetWindowText(strBuffer);
		if (!strBuffer.IsEmpty())
			strBuffer += "\r\n";
		sprintf(info, "用户(IP:%s)登录", ip);
		strBuffer += info;
		m_RecvInfo.SetWindowText(strBuffer);
		m_RecvInfo.LineScroll(m_RecvInfo.GetLineCount(), 0);
		break;

	case 2:
		m_RecvInfo.GetWindowText(strBuffer);
		if (!strBuffer.IsEmpty())
			strBuffer += "\r\n";
		sprintf(info, "用户(IP:%s)登录断开", ip);
		strBuffer += info;
		m_RecvInfo.SetWindowText(strBuffer);
		m_RecvInfo.LineScroll(m_RecvInfo.GetLineCount(), 0);
		break;

	case 3:
		m_RecvInfo.GetWindowText(strBuffer);
		if (!strBuffer.IsEmpty())
			strBuffer += "\r\n";
		sprintf(info, "登录IP:%s 断开", ip);
		strBuffer += info;
		m_RecvInfo.SetWindowText(strBuffer);
		m_RecvInfo.LineScroll(m_RecvInfo.GetLineCount(), 0);
		break;

	case 4:
		buf[len] = '\0';
		m_RecvInfo.GetWindowText(strBuffer);
		if (!strBuffer.IsEmpty())
			strBuffer += "\r\n";
		sprintf(info, "收到IP:%s 的UDP或广播数据:%s", ip, (char *)buf);
		strBuffer += info;
		m_RecvInfo.SetWindowText(strBuffer);
		m_RecvInfo.LineScroll(m_RecvInfo.GetLineCount(), 0);
		break;

	case 5:
		buf[len] = '\0';
		m_RecvInfo.GetWindowText(strBuffer);
		if (!strBuffer.IsEmpty())
			strBuffer += "\r\n";
		sprintf(info, "收到客户IP:%s 的TCP数据:%s", ip, (char *)buf);
		strBuffer += info;
		m_RecvInfo.SetWindowText(strBuffer);
		m_RecvInfo.LineScroll(m_RecvInfo.GetLineCount(), 0);
		sprintf(info, "回应:收到数据%s", (char *)buf);
		Reply(ip, (BYTE *)info, strlen(info));
		break;

	case 6:
		buf[len] = '\0';
		m_RecvInfo.GetWindowText(strBuffer);
		if (!strBuffer.IsEmpty())
			strBuffer += "\r\n";
		sprintf(info, "收到连接的服务器IP:%s 的TCP数据:%s", ip, (char *)buf);
		strBuffer += info;
		m_RecvInfo.SetWindowText(strBuffer);
		m_RecvInfo.LineScroll(m_RecvInfo.GetLineCount(), 0);
		break;

	case 7:
		m_RecvInfo.GetWindowText(strBuffer);
		if (!strBuffer.IsEmpty())
			strBuffer += "\r\n";
		sprintf(info, "登录IP:%s 成功", ip);
		strBuffer += info;
		m_RecvInfo.SetWindowText(strBuffer);
		m_RecvInfo.LineScroll(m_RecvInfo.GetLineCount(), 0);
		break;

	default:
		break;
	}
}

void CNetworkDlg::OnBroadcast() 
{
	BYTE buf[2048];
	GetDlgItemText(IDC_BRODCAST_INFO, (char *)buf, 2048);
	if(strlen((char *)buf) == 0) return;
	Broadcast(buf, strlen((char *)buf));	
}

void CNetworkDlg::OnUdpSend() 
{
	BYTE buf[2048];
	char ip[20];
	GetDlgItemText(IDC_UDP_INFO, (char *)buf, 2048);
	if(strlen((char *)buf) == 0) return;
	DWORD hIp;
	in_addr addr;
	if(m_UdpIp.GetAddress(hIp) < 4)
	{
		::MessageBox(NULL, "IP域填写不完整", "提示", MB_OK);
		return;
	}
	addr.s_addr = htonl(hIp);
	strcpy(ip, inet_ntoa(addr));
	SendTo(ip, buf, strlen((char *)buf));
}

void CNetworkDlg::OnTcpLink() 
{
	char IP[20];
	DWORD hIp;
	in_addr addr;
	if(m_TcpIp.GetAddress(hIp) < 4)
	{
		::MessageBox(NULL, "IP域填写不完整", "提示", MB_OK);
		return;
	}
	addr.s_addr = htonl(hIp);
	strcpy(IP, inet_ntoa(addr));
	Connect(IP);
}

void CNetworkDlg::OnTcpDisconnect() 
{
	Disconnect();
}

void CNetworkDlg::OnTcpSend() 
{
	BYTE buf[2048];
	GetDlgItemText(IDC_TCP_INFO, (char *)buf, 2048);
	if(strlen((char *)buf) == 0) return;
	Send(buf, strlen((char *)buf));
}

BOOL CNetworkDlg::DestroyWindow() 
{
	UninitSocket();

	return CDialog::DestroyWindow();
}

⌨️ 快捷键说明

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