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