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

📄 serverbysocketdlg.cpp

📁 自己编写的SOCKET程序 源码有详尽的注释 可以用来学习C/S程序的编写方法
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		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 + -