📄 c_sockclient.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 + -