📄 networkdlg.cpp
字号:
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 + -