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

📄 svr.cpp

📁 网络通信的例子
💻 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 + -