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

📄 c_sockserver.cpp

📁 对日本KSG震动探测仪器编写的伴侣服务代码
💻 CPP
字号:

/*===================================================================
	Winsock2 Test Server
	---------------------------------------------------------
		TCP / UDP Server modeule
	---------------------------------------------------------
	Program Start       : 30-Jan-2003
	Program Completed   : 
===================================================================*/

#include	"stdafx.h"
#include	<process.h> 
#include	"C_SockServer.h"
#include	"C_Define.h"

S_SOCK_DAT	SkSvDat;			// 僜働僢僩僨乕僞
HWND	MsgHdl = NULL;
char	MsgBuff[2][128];

void	MsgOut(char *p1, char *p2)
{
	if (MsgHdl != NULL){
		//::Sleep(10);
		::PostMessage(MsgHdl, WM_MESS_OUT, (WPARAM) p1, (LPARAM) p2);
		//::Sleep(10);
//		OutputDebugString(p1);
//		OutputDebugString(p2);
//		OutputDebugString("\x0d\x0a");
	}
}

///////////////////////////////////////////////////////////////////////////////

/*=====================================
@p						m:2003.01.31
	<< Receive >>
=====================================*/
BOOL	SkReceive(PS_THREAD_DAT td)
{
	int ret, a;
	char *p;

	p = td->Rcw.TmpBuf;
	while (1){
		ret = recv(td->Sock, td->Rcw.TmpBuf, sizeof(td->Rcw.TmpBuf), 0);
		if (ret > 0){
			for (a=0;a<ret;a++){
				td->Rcw.Buffer[td->Rcw.WrtPoi ++] = *p ++;
				td->Rcw.RcvCnt ++;
				td->Rcw.WrtPoi &= RSB_MAX_LAN;
			}
		}
		else{
			break;
		}
	}
	return TRUE;
}

/*=====================================
@p						m:2003.01.31

	<< Send >>
=====================================*/
int		SkSend(PS_THREAD_DAT td, char *buff, int len)
{
	int		ret, err = 0;
	char	*p;

	p = buff;
	while (1){
		ret = send(td->Sock, p, len, 0);
		if (ret < 0){	
			err = WSAGetLastError();
			if (err != WSAEWOULDBLOCK){	
				err = -1;
				break;
			}
		}
		else if (ret == len){	
			break;
		}
		else{	
			if (ret < len){
				len -= ret;
				p += ret;
			}
			else{
				break;
			}
		}
	}
	return (err);
}

///////////////////////////////////////////////////////////////////////////////

/*-------------------------------------
@p						m:2003.01.30
	<< initialize >>
-------------------------------------*/
BOOL	SkSvInit(PS_SOCK_DAT sd)
{
	WSADATA	wsa_dat;
	int		ret, id;
	BOOL	rb = TRUE;

	// work init
	sd->Sev.Sock = NULL;
	for (id=0;id<MAX_CLIENT;id++){
		sd->Cli[id].Sock = NULL;
	}
	sprintf(sd->Sev.sIpAdr, "%s", SEV_IPAD);
	sprintf(sd->Sev.sPort,  "%s", SEV_PORT);

	// Initialize WinSock.dll
	ret = WSAStartup(WINSOCK_VERSION, &wsa_dat);
	if (ret){
		rb = FALSE;
	}

	if (rb != FALSE){
		// Check WinSock version
		if (wsa_dat.wVersion != WINSOCK_VERSION){
			rb = FALSE;
		}
	}

	if (rb == FALSE){
		WSACleanup();
	}
	return (rb);
}

/*-------------------------------------
@p						m:2003.01.30
	<< client accept >>
-------------------------------------*/
BOOL	SkSvAccept(PS_THREAD_DAT std)
{
	int		len, ret, id;
	PS_THREAD_DAT ctd;

	MsgOut("SkSvAccept", "");

	// 嬻偒僜働僢僩偺専弌
	for (id=0;id<MAX_CLIENT;id++){
		if (SkSvDat.Cli[id].Sock == NULL){
			break;
		}
	}
	if (id == MAX_CLIENT){
		return FALSE;
	}

	// 僋儔僀傾儞僩偺僜働僢僩偺庴偗擖傟
	ctd = &SkSvDat.Cli[id];
	len = sizeof(SOCKADDR_IN);
	ctd->Sock = accept(std->Sock, (LPSOCKADDR)&ctd->Sai, &len);
	if (ctd->Sock == INVALID_SOCKET){	
		ctd->Sock = NULL;
		return FALSE;
	}
	
	ctd->Event = WSACreateEvent();
	if (ctd->Event == (void *)INVALID_SOCKET){
		ctd->Sock = NULL;
		return FALSE;
	}
	ret = WSAEventSelect(ctd->Sock, ctd->Event, FD_READ | FD_WRITE | FD_CLOSE);
	if (ret == SOCKET_ERROR){	
		closesocket(ctd->Sock);
		return FALSE;
	}

	// Start a client thread to handle this request
	ctd->Keep = 1;
	ctd->Handle = _beginthreadex(NULL, 0, SkSvT_Server, (void*)ctd, 0, &ctd->Addr);
	return TRUE;	
}

/*-------------------------------------
@p						m:2003.01.30
	<< cleanup >>
-------------------------------------*/
BOOL	SkSvCleanup()
{
	WSACleanup();
	return (TRUE);
}

/*=====================================
@p						m:2003.01.30
	<< Client Thread >>
=====================================*/
unsigned __stdcall SkSvT_Server(void *pv)
{
	DWORD	ret;
	WSANETWORKEVENTS events;
	PS_THREAD_DAT ctd;

	MsgOut("Client Thread Start", "");

	ctd = (PS_THREAD_DAT) pv;
	ctd->Scw.RcvCnt = ctd->Rcw.RcvCnt = 0;
	ctd->Scw.WrtPoi = ctd->Rcw.WrtPoi = 0;
	ctd->Scw.RedPoi = ctd->Rcw.RedPoi = 0;
	ctd->Scw.RcvCnt = ctd->Rcw.RcvCnt = 0;
	while (ctd->Keep){
		ret = WSAWaitForMultipleEvents(1, &ctd->Event, FALSE, 10000, FALSE);
		if (ret == WSA_WAIT_TIMEOUT){
			::Sleep(100);
			continue;
		}
		ret = WSAEnumNetworkEvents(ctd->Sock, ctd->Event, &events);
		if (events.lNetworkEvents & FD_READ){		// Read event?
			ret = SkReceive(ctd);
			MsgOut("Receive Ev", "");
		}
		if (events.lNetworkEvents & FD_WRITE){		// Write event?
			//enumHostSendStatus = SEND_CMPLT;
		}
		if (events.lNetworkEvents & FD_CLOSE){		// Close event?
			ctd->Keep = 0;
			MsgOut("Close Ev", "");
		}
	}
	closesocket(ctd->Sock);
	ctd->Sock = NULL;
	WSACloseEvent(ctd->Event);

	MsgOut("Client Thread End", "");
	return (TRUE);
}

/*=====================================
@p						m:2003.01.30
	<< Server lesten thread >>
=====================================*/
unsigned __stdcall SkSvT_Lesten(void *pv)
{
	PS_THREAD_DAT td;
	DWORD	ret;
	WSANETWORKEVENTS events;

	td = (PS_THREAD_DAT) pv;
	td->Scw.RcvCnt = td->Rcw.RcvCnt = 0;
	td->Scw.WrtPoi = td->Rcw.WrtPoi = 0;
	td->Scw.RedPoi = td->Rcw.RedPoi = 0;
	td->Scw.RcvCnt = td->Rcw.RcvCnt = 0;
	while (td->Keep){
		ret = WSAWaitForMultipleEvents(1, &td->Event, FALSE, 10000, FALSE);
		if (ret == WSA_WAIT_TIMEOUT){
			::Sleep(100);
			continue;
		}
		ret = WSAEnumNetworkEvents(td->Sock, td->Event, &events);
		if (events.lNetworkEvents & FD_ACCEPT){		// Read event?
			SkSvAccept(td);
		}
		if (events.lNetworkEvents & FD_READ){		// Read event?
			ret = SkReceive(td);
		}
		if (events.lNetworkEvents & FD_CLOSE){		// Close event?
			ret = 0;
			//HostLanDisconnect(hHostMainDlg, (SOCKET)wParam);
		}
		if (events.lNetworkEvents & FD_WRITE){		// Write event?
			ret = 0;
			//enumHostSendStatus = SEND_CMPLT;
		}
	}
	closesocket(td->Sock);
	td->Sock = NULL;
	WSACloseEvent(td->Event);
	return (TRUE);
}

/*=====================================
@p						m:2003.01.30
	<< Create server >>
=====================================*/
BOOL	SkSvCreate()
{
	int ret, port;
	PS_THREAD_DAT td;
	
	td = &SkSvDat.Sev;
	SkSvInit(&SkSvDat);
	#if LAN_PROTO_TCP
		td->Sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	#else
		td->Sock = socket(AF_INET, SOCK_DGRAM,  IPPROTO_UDP);
	#endif
	if (td->Sock == INVALID_SOCKET){
		td->Sock = NULL;
		MsgOut("SkSvCreate", "INVALID_SOCKET");
		return FALSE;
	}
	td->Event = WSACreateEvent();
	if (td->Event == (void *)INVALID_SOCKET){
		td->Sock = NULL;
		MsgOut("SkSvCreate", "INVALID_SOCKET");
		return FALSE;
	}
	ret = WSAEventSelect(td->Sock, td->Event, FD_ACCEPT | FD_READ | FD_WRITE | FD_CLOSE);
	if (ret == SOCKET_ERROR){	
		td->Sock = NULL;
		closesocket(td->Sock);
		MsgOut("SkSvCreate", "SOCKET_ERROR");
		return FALSE;
	}
	// Start a client thread to handle this request
	td->Keep = 1;
	td->Handle = _beginthreadex(NULL, 0, SkSvT_Lesten, (void*)td, 0, &td->Addr);
	port = (WORD) atoi(td->sPort);
	td->Sai.sin_family		 = AF_INET;
	td->Sai.sin_port		 = htons(port);
	td->Sai.sin_addr.s_addr = INADDR_ANY;		// 愙懕偟偰偔傞IP傾僪儗僗傪惂尷偟側偄

	ret = bind(td->Sock, (LPSOCKADDR) &td->Sai, sizeof(SOCKADDR_IN));
	if (ret == SOCKET_ERROR){	
		closesocket(td->Sock);
	}

	#if LAN_PROTO_TCP
		// Socket傪懸婡忬懺偵偝偣傞
		ret = listen(td->Sock, SOMAXCONN);
		if (ret == SOCKET_ERROR){	
			closesocket(td->Sock);
			return FALSE;
		}
	#endif
	MsgOut("SkSvCreate", "OK!");
	return TRUE;
}

/*=====================================
@p						m:2003.01.30
	<< Stop server >>
=====================================*/
void	SkSvStop()
{
	PS_THREAD_DAT td;
	int id;

	// Signal the exit event
	td = &SkSvDat.Sev;
	if (td->Sock != NULL){
		td->Keep = 0;
		SetEvent(td->Event);
		CloseHandle((HANDLE) td->Handle);
	}
	for (id=0;id<MAX_CLIENT;id++){
		td = &SkSvDat.Cli[id];
		if (td->Sock != NULL){
			td->Keep = 0;
			SetEvent(td->Event);
			CloseHandle((HANDLE) td->Handle);
		}
	}
}

////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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