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

📄 c_sockclient.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_SockClient.h"
#include	"C_Work.h"

extern	int		SkSend(PS_THREAD_DAT td, char *buff, int len);			// C_SocketServer
extern	BOOL	SkReceive(PS_THREAD_DAT td);							// C_SocketServer

S_SOCK_DAT	SkClDat;			// 僜働僢僩僨乕僞
extern	HWND	MsgHdl;
extern	char	MsgBuff[2][128];

extern	void	MsgOut(char *p1, char *p2);

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

	// work init
	sd->Sev.Sock = NULL;
	for (id=0;id<MAX_CLIENT;id++){
		sd->Cli[id].Sock = NULL;
	}
	//sprintf(td->sIpAdr, "%s", SEV_IPAD);
	//sprintf(td->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.31
	<< Client Thread >>
僋儔僀傾儞僩偑庴怣偡傞
=====================================*/
unsigned __stdcall SkClT_Client(void *pv)
{
	DWORD	ret;
	WSANETWORKEVENTS events;
	PS_THREAD_DAT ctd;

	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?
			MsgOut("cl Receive Ev", "");
			ret = SkReceive(ctd);
		}
		if (events.lNetworkEvents & FD_WRITE){		// Write event?
			//enumHostSendStatus = SEND_CMPLT;
		}
		if (events.lNetworkEvents & FD_CLOSE){		// Close event?
			ctd->Keep = 0;
		}
	}
	closesocket(ctd->Sock);
	ctd->Sock = NULL;
	WSACloseEvent(ctd->Event);
	return (TRUE);
}

/*=====================================
@p						m:2003.01.31
	<< connection >>
=====================================*/
int		SkClConnect(char *ip_adr, int port)
{
	int		ret, id, err;
	BOOL	rb = TRUE;
	LPHOSTENT	lp_he;	
	PS_THREAD_DAT ctd;

	// 嬻偒傪偝偑偡
	for (id=0;id<MAX_CLIENT;id++){
		if (SkClDat.Cli[id].Sock == NULL){
			break;
		}
	}
	if (id == MAX_CLIENT){
		return (-1);
	}
	ctd = &SkClDat.Cli[id];

	// 僜働僢僩嶌惉
	#if LAN_PROTO_TCP
		ctd->Sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	#else
		ctd->Sock = socket(AF_INET, SOCK_DGRAM,  IPPROTO_UDP);
	#endif
	if (ctd->Sock == INVALID_SOCKET){	
		err = WSAGetLastError();
		ctd->Sock = NULL;
		return (-1);
	}

	ctd->Event = WSACreateEvent();
	if (ctd->Event == (void *)INVALID_SOCKET){
		ctd->Sock = NULL;
		return (-1);
	}
	ret = WSAEventSelect(ctd->Sock, ctd->Event, FD_CONNECT | FD_READ | FD_WRITE | FD_CLOSE);
	if (ret == SOCKET_ERROR){	
		closesocket(ctd->Sock);
		ctd->Sock = NULL;
		return (-1);
	}

	lp_he = gethostbyname(ip_adr);
	ctd->Sai.sin_family	 = AF_INET;
	ctd->Sai.sin_port	 = htons(port);
	ctd->Sai.sin_addr	 = *((LPIN_ADDR) *lp_he->h_addr_list);

	ret = connect(ctd->Sock, (LPSOCKADDR) &ctd->Sai, sizeof(SOCKADDR_IN));
	if (ret == SOCKET_ERROR){	
		err = WSAGetLastError();
		if (err != WSAEWOULDBLOCK){
			closesocket(ctd->Sock);
			ctd->Sock = NULL;
			return (-1);
		}
	}

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

/*=====================================
@p						m:2003.01.31
	<< Stop client >>
=====================================*/
void	SkClStop()
{
	PS_THREAD_DAT td;
	int id, ret;

	// Signal the exit event
	for (id=0;id<MAX_CLIENT;id++){
		td = &SkClDat.Cli[id];
		if (td->Sock != NULL){
			ret = shutdown(td->Sock, 2);		// 2:send/recv嬛巭
			td->Keep = 0;
			SetEvent(td->Event);
			CloseHandle((HANDLE) td->Handle);
		}
	}
}

⌨️ 快捷键说明

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