📄 svr.cpp
字号:
// Svr.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <stdlib.h>
#include <winsock2.h>
#include <process.h>
#include <time.h>
#define RCV_DATA_LEN 1024
#define UDP_PORT 1888
class CHReceiveThreadParm
{
public:
CHReceiveThreadParm(){
m_skt=0;
m_dwHerIP=0;
m_wPort=0;
}
CHReceiveThreadParm(SOCKET skt,DWORD dwHerIP,WORD wPort){
m_skt=skt;
m_dwHerIP=dwHerIP;
m_wPort=wPort;
}
CHReceiveThreadParm(CHReceiveThreadParm& other){
(*this)=other;
};
~CHReceiveThreadParm(){};
CHReceiveThreadParm& operator=(CHReceiveThreadParm& other){
m_skt=other.m_skt;
m_dwHerIP=other.m_dwHerIP;
m_wPort=other.m_wPort;
return other;
}
public:
SOCKET m_skt;
DWORD m_dwHerIP;
WORD m_wPort;
};
struct SReceiveInfo
{
BYTE *m_bufRcv;
int m_nlenRcv;
DWORD m_dwHerIP;
WORD m_wPort;
int m_skt;
};
char* IPDW2Str(DWORD dwIP)
{
static char szIP[20];
sprintf(szIP,"%d.%d.%d.%d",
LOBYTE(LOWORD(dwIP)),HIBYTE(LOWORD(dwIP)),LOBYTE(HIWORD(dwIP)),HIBYTE(HIWORD(dwIP)));
return szIP;
}
char* GetErrorString(int nErr)
{
static char msgBuf[1024];
memset(msgBuf,0,1024);
FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM,
NULL,nErr, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
msgBuf, 1024, NULL );
return msgBuf;
}
char* GetLastErrorString(void)
{
return GetErrorString(GetLastError());
}
int GetDateTime(char *buf)
{
SYSTEMTIME st;
GetLocalTime(&st);
sprintf(buf, "%4.4d-%2.2d-%2.2d %2.2d:%2.2d:%2.2d.%3.3d",
st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond,st.wMilliseconds);
return strlen(buf);
}
void Dispatch(SReceiveInfo *pri)
{
char *szOrder=(char*)pri->m_bufRcv;
if(0==strcmp("PORT",szOrder)){
*((WORD*)(pri->m_bufRcv+256))=UDP_PORT;
int nSend=send(pri->m_skt,(const char*)pri->m_bufRcv,1024,0);
return;
}
if(0==strcmp("SEND MSG",szOrder)){
int nSend=send(pri->m_skt,(const char*)pri->m_bufRcv,1024,0);
return;
}
if(0==strcmp("GET CUR TIME",szOrder)){
GetDateTime((char*)(pri->m_bufRcv+256));
int nSend=send(pri->m_skt,(const char*)pri->m_bufRcv,1024,0);
return;
}
}
void ReceiveTread(LPVOID pRcvThreadInfo)
{
CHReceiveThreadParm rtp(*(CHReceiveThreadParm*)pRcvThreadInfo);
delete (CHReceiveThreadParm*)pRcvThreadInfo;
BYTE bufRcv[1024];
memset(bufRcv,0,1024);
while(1){
int n=recv(rtp.m_skt,(char*)bufRcv,RCV_DATA_LEN,0);
if(SOCKET_ERROR==n){
closesocket(rtp.m_skt);
printf("报文接收失败,与%s:%d断开连接。参考原因:(%d)%s\n",
IPDW2Str(rtp.m_dwHerIP),rtp.m_wPort,GetLastError(),GetLastErrorString());
_endthread();
return;
}
printf("接收%8.d字节的报文,源=%s:%d\n",
n,IPDW2Str(rtp.m_dwHerIP),rtp.m_wPort);
SReceiveInfo ri={bufRcv,n,rtp.m_dwHerIP,rtp.m_wPort,rtp.m_skt};
Dispatch(&ri);
}
closesocket(rtp.m_skt);
printf("与%s:%d断开连接\n\n",IPDW2Str(rtp.m_dwHerIP),rtp.m_wPort);
_endthread();
return;
}
int RcvrFun(int nPort)
{
//int nPort=8888;
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(nPort);
addr.sin_addr.S_un.S_addr = 0;
SOCKET sktListen = socket(AF_INET, SOCK_STREAM, 0);
if(0!=bind(sktListen, (sockaddr*)&addr, sizeof(addr))){
printf("绑定套接字失败。参考原因:(%d)%s\n",GetLastError(),GetLastErrorString());
return 0;
}
int nLinger=8;
LINGER linger;
linger.l_onoff=1;
linger.l_linger=nLinger;
if(0!=setsockopt(sktListen,SOL_SOCKET,SO_LINGER,(const char*)&linger,sizeof(LINGER))){
printf("设置套接字延时选项失败。参考原因:(%d)%s\n",GetLastError(),GetLastErrorString());
return 0;
}
DWORD dwIP=0;
if(0!=setsockopt(sktListen,SOL_SOCKET,SO_REUSEADDR,(const char*)&dwIP,sizeof(DWORD))){
printf("设置套接字地址重用选项失败。参考原因:(%d)%s\n",GetLastError(),GetLastErrorString());
return 0;
}
int nConnections=1024;
if(0==listen(sktListen, nConnections)){
printf("打开%d端口成功(连接参数:队列长%d,逗留%d秒)。\n等待数据...\n",nPort,nConnections,nLinger);
}else{
printf("打开%d端口失败。参考原因:(%d)%s\n",nPort,GetLastError(),GetLastErrorString());
return 0;
}
int addrlen;
while(1){
addrlen = sizeof(addr);
SOCKET sktAccept = accept(sktListen, (sockaddr*)&addr, &addrlen);
if(INVALID_SOCKET==sktAccept){
printf("与%s建立连接失败。参考原因:(%d)%s\n",
IPDW2Str(*((DWORD*)&addr.sin_addr.S_un.S_un_b)),GetLastError(),GetLastErrorString());
continue;
}
CHReceiveThreadParm *p=new CHReceiveThreadParm(sktAccept,*((DWORD*)&addr.sin_addr.S_un.S_un_b),addr.sin_port);
_beginthread(ReceiveTread,0,(LPVOID)p);
printf("与%s:%d建立连接\n",IPDW2Str(p->m_dwHerIP),p->m_wPort);
}
return 1;
}
int main(int argc, char* argv[])
{
if(argc<=1){
printf("没检测到启动参数,程序退出。\n本程序启动方式为:Svr <端口>\n");
return 0;
}
WORD dwPort=atoi(_strlwr(argv[1]));
WSADATA data;
WSAStartup(MAKEWORD(2,2),&data);
RcvrFun(dwPort);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -