📄 serverbysocketdlg.cpp
字号:
SendMessage(NETWORK_LOG, LOG_conn_suc, CurConn);
return;
}
//若已满,则先连(其实不得不连,因为在listen队列里已经连了,有助于将队列清空),再gracfull地关闭20061123
SOCKET abandon = accept(ServerSock, (LPSOCKADDR)&(ClientSock_Abandon.addr), &(ClientSock_Abandon.addr_len));//UDP的回送远端结构体每次用都会改变值,在此值鸡下蛋(习惯不好)200611123
SendMessage(NETWORK_LOG, LOG_conn_ing, 0);
closesocket(abandon);
}
void CServerBySocketDlg::OnLogDisp(WPARAM wParam, LPARAM lParam) //日志书写函数
{
UpdateData(TRUE);
int iEvent = int(wParam);
string catlogAdd = "";
char port[BUFFER_SIZE];
char* getITM = (char*)lParam;
switch(iEvent)
{
case LOG_conn_ing: //尝试连接
if (lParam) {
_strtime(timestr);
catlogAdd += "-*-*-*-*-*-TCP自:";
catlogAdd += timestr;
catlogAdd += " 开始服务-*-*-*-*-*-";
}
else {
catlogAdd += "建立来自<-*-";
//catlogAdd += ipTostr(ulint(lParam));
catlogAdd += ipTostr(ClientSock_Abandon.addr.sin_addr.S_un.S_addr);
catlogAdd += ":";
itoa(ntohs(ClientSock_Abandon.addr.sin_port), port, 10);
catlogAdd += port;
catlogAdd += "-*->的连接失败!超过最大连接数!";
//OnResum();
}
break;
case LOG_conn_suc: //连接成功
catlogAdd += "接受来自<-*-";
//catlogAdd += ipTostr(ulint(lParam));
catlogAdd += ipTostr(ClientSock[lParam].addr.sin_addr.S_un.S_addr);
catlogAdd += ":";
itoa(ntohs(ClientSock[lParam].addr.sin_port), port, 10);
catlogAdd += port;
catlogAdd += "-*->的连接请求!";
break;
case LOG_reqe_tim: //时间请求
catlogAdd += "收到来自<-*-";
catlogAdd += ipTostr(ClientSock[lParam].addr.sin_addr.S_un.S_addr);
catlogAdd += ":";
itoa(ntohs(ClientSock[lParam].addr.sin_port), port, 10);
catlogAdd += port;
catlogAdd += "-*->的服务器时间同步请求!";
break;
case LOG_send_str: //发送计算结果
catlogAdd += "回送计算结果到<-*-";
//catlogAdd += ipTostr(ulint(lParam));
catlogAdd += ipTostr(ClientSock[lParam].addr.sin_addr.S_un.S_addr);
catlogAdd += ":";
itoa(ntohs(ClientSock[lParam].addr.sin_port), port, 10);
catlogAdd += port;
catlogAdd += "-*->:";
catlogAdd += sCal_expression;
break;
break;
case LOG_stop_svr://停止服务
_strtime(timestr);
catlogAdd += "-*-*-*-*-*-TCP于:";
catlogAdd += timestr;
catlogAdd += " 停止服务-*-*-*-*-*-";
break;
case LOG_recv_str://接收字符串
catlogAdd += "收到来自<-*-";
//catlogAdd += ipTostr(ulint(lParam));
catlogAdd += ipTostr(ClientSock[lParam].addr.sin_addr.S_un.S_addr);
catlogAdd += ":";
itoa(ntohs(ClientSock[lParam].addr.sin_port), port, 10);
catlogAdd += port;
catlogAdd += "-*->的TCP消息";
//tlogAdd += getITM;
break;
case LOG_conn_cls: //关闭连接
catlogAdd += "客户端:<-*-";
catlogAdd += ipTostr(ClientSock[lParam].addr.sin_addr.S_un.S_addr);
catlogAdd += ":";
itoa(ntohs(ClientSock[lParam].addr.sin_port), port, 10);
catlogAdd += port;
catlogAdd += "-*->的连接已断开!";
break;
case LOG_send_tim: //同步时间
catlogAdd += "向客户端<-*-";
catlogAdd += ipTostr(ClientSock[lParam].addr.sin_addr.S_un.S_addr);
catlogAdd += ":";
itoa(ntohs(ClientSock[lParam].addr.sin_port), port, 10);
catlogAdd += port;
catlogAdd += "-*->发送同意断开连接消息:";
catlogAdd += okCut;
break;
case LOG_send_udp: //发送UDP端口
catlogAdd += "向客户端<-*-";
catlogAdd += ipTostr(ClientSock[lParam].addr.sin_addr.S_un.S_addr);
catlogAdd += ":";
itoa(ntohs(ClientSock[lParam].addr.sin_port), port, 10);
catlogAdd += port;
itoa(UDP_PORT, port, 10);
catlogAdd += "-*->发送UDP服务端口号:";
catlogAdd += port;
break;
case LOG_reqe_udp: //请求UDP回送
catlogAdd += "收到来自<-*-";
catlogAdd += ipTostr(ClientSock[lParam].addr.sin_addr.S_un.S_addr);
catlogAdd += ":";
itoa(ntohs(ClientSock[lParam].addr.sin_port), port, 10);
catlogAdd += port;
catlogAdd += "-*->的UDP服务端口号获知请求!";
break;
case LOG_disc_tcp: //请求UDP回送
catlogAdd += "收到来自<-*-";
catlogAdd += ipTostr(ClientSock[lParam].addr.sin_addr.S_un.S_addr);
catlogAdd += ":";
itoa(ntohs(ClientSock[lParam].addr.sin_port), port, 10);
catlogAdd += port;
catlogAdd += "-*->的连接断开请求!";
break;
case LOG_reqe_cal://计算请求
catlogAdd += "收到来自<-*-";
//catlogAdd += ipTostr(ulint(lParam));
catlogAdd += ipTostr(ClientSock[lParam].addr.sin_addr.S_un.S_addr);
catlogAdd += ":";
itoa(ntohs(ClientSock[lParam].addr.sin_port), port, 10);
catlogAdd += port;
catlogAdd += "-*->的计算请求:";
catlogAdd += sCal_expression;
default: break;
}
m_curlog = catlogAdd.c_str();
UpdateData(FALSE);
catlogAdd += "\r\n";
m_catlog.SetSel(m_catlog_txt.GetLength(), m_catlog_txt.GetLength(), 0);//光标选择最尾
m_catlog.ReplaceSel(catlogAdd.c_str());
UpdateData(TRUE);
m_catlog.PostMessage(WM_VSCROLL, SB_BOTTOM, 0);//自动滚动到日志最后
}
void CServerBySocketDlg::On_Stopserv() //停止服务的处理
{
// TODO: Add your control notification handler code here
if (ClientSock_U.addr.sin_port) {
strcpy(recvbuff, "我要停止服务了:)\0");
closesocket(ServerSock_U);//立即关闭ServerSock_U,以防止在本机运行时收到自已发的消息20061126
sendto(ClientSock_U.Sock, recvbuff, sizeof(recvbuff), 0, (LPSOCKADDR)&(ClientSock_U.addr), ClientSock_U.addr_len);//送中止消息20051123
Sleep(SLP_TIK);
}
shutdown(ServerSock, 2);//优雅中止连接?
SendMessage(NETWORK_EVENT, ServerSock, FD_CLOSE);
}
void CServerBySocketDlg::OnResum()//中断恢复
{
GetDlgItem(IDC_STOPSERV)->EnableWindow(FALSE);
GetDlgItem(IDC_IPlist)->EnableWindow(TRUE);
GetDlgItem(IDC_PORT)->EnableWindow(TRUE);
GetDlgItem(IDC_STARTSERV)->EnableWindow(FALSE);
GetDlgItem(IDC_STARTSERV2)->EnableWindow(TRUE);
GetDlgItem(IDC_STARTSERV_UDP)->EnableWindow(FALSE);
GetDlgItem(IDC_STOPSERV_UDP)->EnableWindow(FALSE);
}
void CServerBySocketDlg::On_Startserv()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE); //取界面数据回变量
GetDlgItem(IDC_STARTSERV)->EnableWindow(FALSE);
ClientSock_U.addr_len = sizeof(ClientSock_U.addr);
ClientSock_U.addr = addr_in_udp;
ClientSock_U.addr.sin_port = 0;
ClientSock_Abandon = ClientSock_U;
//准备工作做完了,下面注册TCP的异步响应事件
if(WSAAsyncSelect(ServerSock, m_hWnd, NETWORK_EVENT, FD_ACCEPT | FD_CLOSE) == SOCKET_ERROR){
MessageBox("注册网络异步事件失败!");
closesocket(ServerSock);
//closesocket(ServerSock_U);
OnResum();
return;
}
//开始在TCP上进行侦听
if (listen(ServerSock, MAX_QUEUE) == SOCKET_ERROR) {
MessageBox("无法初始化TCP侦听!");
closesocket(ServerSock);
//closesocket(ServerSock_U);
OnResum();
return;
}
//m_connstat = char(total_conn + 48);
m_connstat = "正在侦听.....";
UpdateData(FALSE);
GetDlgItem(IDC_STOPSERV)->EnableWindow(TRUE);//连接成功,则允许中止20061123
GetDlgItem(IDC_STARTSERV2)->EnableWindow(FALSE);
GetDlgItem(IDC_STARTSERV_UDP)->EnableWindow(TRUE);
SendMessage(NETWORK_LOG, LOG_conn_ing, 5);
//ShowWindow(SW_MINIMIZE);//最小化到任务栏20061123
//ShowWindow(SW_HIDE);//释放界面内存,最小化内存点用,后台运行,可是咋关啊?
}
int CServerBySocketDlg::FindFirstEmpty(client_sock* in)
{
for (int i = 0; i < CLNT_MAX_NUM; i++) {
if (!in[i].inuse) return i;
}
return CLNT_MAX_NUM;
}
int CServerBySocketDlg::FindSockNo(client_sock* in, SOCKET s)
{
for (int i = 0; i < CLNT_MAX_NUM; i++) {
if (in[i].Sock == s) return i;
}
return CLNT_MAX_NUM;//如果在tcp连接里都没有,则根据.h文件里类型的定义,最后一个就是udp的sock连接Abel.20081203
}
void CServerBySocketDlg::CloseClientSocket(client_sock* in)
{
for (int i = 0; i < CLNT_MAX_NUM; i++) {
if (in[i].inuse) {
closesocket(in[i].Sock);
in[i].inuse = 0;
}
}
}
void CServerBySocketDlg::OnBindTcpPort()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE); //取界面数据回变量
if ((m_port < 1024) || (m_port > 65535)) return; //端口不合法则返回20061123
GetDlgItem(IDC_STARTSERV)->EnableWindow(FALSE);
GetDlgItem(IDC_IPlist)->EnableWindow(FALSE);
GetDlgItem(IDC_PORT)->EnableWindow(FALSE);
//建立TCP socket
ServerSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
nSele = m_iplist.GetCurSel();
addr_in.sin_addr = *(in_addr*)pHost->h_addr_list[nSele]; //IP
ulSeleIP = *(ulint*)(pHost->h_addr_list[nSele]);
addr_in.sin_family = AF_INET;
addr_in.sin_port = htons(m_port); //服务器端,端口必须手动指定,否则对方点知?20061123
for (int i = 0; i < CLNT_MAX_NUM; i++) {
ClientSock[i].addr_len = sizeof(ClientSock[i].addr);
ClientSock[i].addr = addr_in;
}
total_conn = 0;
if (bind(ServerSock, (PSOCKADDR)&addr_in, sizeof(addr_in)) == SOCKET_ERROR){
MessageBox("绑定网卡出错!", "SOCKET", MB_OK);
closesocket(ServerSock);
OnResum();
return;
}
if ((WSAGetLastError()) == 10013) {
MessageBox("SOCKET建立失败!", "SOCKET_TCP", MB_OK);
closesocket(ServerSock);
//WSACleanup();
//SendMessage(WM_CLOSE);
return;
}
GetDlgItem(IDC_STARTSERV2)->EnableWindow(FALSE);
GetDlgItem(IDC_STARTSERV)->EnableWindow(TRUE);
}
void CServerBySocketDlg::OnStartservUdp()
{
// TODO: Add your control notification handler code here
//建立UDP socket
GetDlgItem(IDC_STARTSERV_UDP)->EnableWindow(FALSE);
addr_in_udp = addr_in; //地址都是本机,所以可以直接继承过来20061123
addr_in_udp.sin_port = htons(UDP_PORT);//端口是宏定义的,要更改
ServerSock_U = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (bind(ServerSock_U, (PSOCKADDR)&addr_in_udp, sizeof(addr_in_udp)) == SOCKET_ERROR){
MessageBox("绑定网卡出错!", "SOCKET_UDP", MB_OK);
//closesocket(ServerSock);
closesocket(ServerSock_U);
OnResum();
return;
}
//下面注册UDP的异步响应事件
if(WSAAsyncSelect(ServerSock_U, m_hWnd, NETWORK_EVENT, FD_READ | FD_WRITE) == SOCKET_ERROR){
MessageBox("注册网络异步事件失败!");
//closesocket(ServerSock);
closesocket(ServerSock_U);
OnResum();
return;
}
SendMessage(NETWORK_LOG_UDP, LOG_conn_ing, 5);
ClientSock_U.Sock = ServerSock_U;
GetDlgItem(IDC_STOPSERV_UDP)->EnableWindow(TRUE);
}
void CServerBySocketDlg::OnStopservUdp()
{
// TODO: Add your control notification handler code here
GetDlgItem(IDC_STOPSERV_UDP)->EnableWindow(FALSE);
closesocket(ServerSock_U);//立即关闭ServerSock_U,以防止在本机运行时收到自已发的消息20061126
ServerSock_U = NULL;
GetDlgItem(IDC_STARTSERV_UDP)->EnableWindow(TRUE);
SendMessage(NETWORK_LOG_UDP, LOG_stop_svr, 5);
}
void CServerBySocketDlg::OnLogDisp_UDP(WPARAM wParam, LPARAM lParam) //日志书写函数
{
UpdateData(TRUE);
int iEvent = int(wParam);
string catlogAdd = "";
char port[BUFFER_SIZE];
char* getITM = (char*)lParam;
switch(iEvent)
{
case LOG_conn_ing: //尝试连接
if (lParam) {
_strtime(timestr);
catlogAdd += "-*-*-*-*-*-UDP自:";
catlogAdd += timestr;
catlogAdd += " 开始服务-*-*-*-*-*-";
}
else {
catlogAdd += "建立来自<-*-";
//catlogAdd += ipTostr(ulint(lParam));
catlogAdd += ipTostr(ClientSock_Abandon.addr.sin_addr.S_un.S_addr);
catlogAdd += ":";
itoa(ntohs(ClientSock_Abandon.addr.sin_port), port, 10);
catlogAdd += port;
catlogAdd += "-*->的连接失败!超过最大连接数!";
//OnResum();
}
break;
case LOG_conn_suc: //连接成功
catlogAdd += "接受来自<-*-";
//catlogAdd += ipTostr(ulint(lParam));
catlogAdd += ipTostr(ClientSock[lParam].addr.sin_addr.S_un.S_addr);
catlogAdd += ":";
itoa(ntohs(ClientSock[lParam].addr.sin_port), port, 10);
catlogAdd += port;
catlogAdd += "-*->的连接请求!";
break;
case LOG_reqe_tim: //时间请求
catlogAdd += "收到来自<-*-";
catlogAdd += ipTostr(ClientSock[lParam].addr.sin_addr.S_un.S_addr);
catlogAdd += ":";
itoa(ntohs(ClientSock[lParam].addr.sin_port), port, 10);
catlogAdd += port;
catlogAdd += "-*->的服务器时间同步请求!";
break;
case LOG_send_str: //发送字符串
catlogAdd += "回送消息<-*-";
//catlogAdd += ipTostr(ulint(lParam));
catlogAdd += ipTostr(ClientSock_U.addr.sin_addr.S_un.S_addr);
catlogAdd += ":";
itoa(ntohs(ClientSock_U.addr.sin_port), port, 10);
catlogAdd += port;
catlogAdd += "-*->(UDP):";
catlogAdd += getITM;
break;
break;
case LOG_stop_svr://停止服务
_strtime(timestr);
catlogAdd += "-*-*-*-*-*-UDP于:";
catlogAdd += timestr;
catlogAdd += " 停止服务-*-*-*-*-*-";
break;
case LOG_recv_str://接收字符串
catlogAdd += "收到来自<-*-";
//catlogAdd += ipTostr(ulint(lParam));
catlogAdd += ipTostr(ClientSock_U.addr.sin_addr.S_un.S_addr);
catlogAdd += ":";
itoa(ntohs(ClientSock_U.addr.sin_port), port, 10);
catlogAdd += port;
catlogAdd += "-*->的UDP消息:";
catlogAdd += getITM;
break;
case LOG_conn_cls: //关闭连接
catlogAdd += "客户端:<-*-";
catlogAdd += ipTostr(ClientSock[lParam].addr.sin_addr.S_un.S_addr);
catlogAdd += ":";
itoa(ntohs(ClientSock[lParam].addr.sin_port), port, 10);
catlogAdd += port;
catlogAdd += "-*->的连接已断开!";
break;
case LOG_send_tim: //同步时间
catlogAdd += "向客户端<-*-";
catlogAdd += ipTostr(ClientSock[lParam].addr.sin_addr.S_un.S_addr);
catlogAdd += ":";
itoa(ntohs(ClientSock[lParam].addr.sin_port), port, 10);
catlogAdd += port;
catlogAdd += "-*->发送当前时间:";
catlogAdd += timestr;
break;
case LOG_send_udp: //发送UDP端口
catlogAdd += "向客户端<-*-";
catlogAdd += ipTostr(ClientSock[lParam].addr.sin_addr.S_un.S_addr);
catlogAdd += ":";
itoa(ntohs(ClientSock[lParam].addr.sin_port), port, 10);
catlogAdd += port;
itoa(UDP_PORT, port, 10);
catlogAdd += "-*->发送UDP服务端口号:";
catlogAdd += port;
break;
case LOG_reqe_udp: //请求UDP回送
catlogAdd += "收到来自<-*-";
catlogAdd += ipTostr(ClientSock[lParam].addr.sin_addr.S_un.S_addr);
catlogAdd += ":";
itoa(ntohs(ClientSock[lParam].addr.sin_port), port, 10);
catlogAdd += port;
catlogAdd += "-*->的UDP服务端口号获知请求!";
break;
default: break;
}
m_curlog = catlogAdd.c_str();
UpdateData(FALSE);
catlogAdd += "\r\n";
m_catlog_udp.SetSel(m_catlog_udp_txt.GetLength(), m_catlog_udp_txt.GetLength(), 0);//光标选择最尾
m_catlog_udp.ReplaceSel(catlogAdd.c_str());
UpdateData(TRUE);
m_catlog_udp.PostMessage(WM_VSCROLL, SB_BOTTOM, 0);//自动滚动到日志最后
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -