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

📄 clt.cpp

📁 网络通信的例子
💻 CPP
字号:
// Clt.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdlib.h>
#include <conio.h>
#include <winsock2.h>
#include <process.h>

#define		RCV_DATA_LEN		1024


SOCKET g_skt=0;

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());
}

void Dispatch(SReceiveInfo *pri)
{
	Beep(333,33);
	Beep(444,33);
	Beep(888,33);
	Beep(555,33);
	char *szOrder=(char*)pri->m_bufRcv;
	if(0==strcmp("PORT",szOrder)){
		printf("服务器端UDP端口为:%d\n",*((WORD*)(pri->m_bufRcv+256)));
		return;
	}
	if(0==strcmp("SEND MSG",szOrder)){
		printf("服务器端回送的消息为:%s\n",pri->m_bufRcv+256);
		return;
	}
	if(0==strcmp("GET CUR TIME",szOrder)){
		printf("服务器端回送的时间为:%s\n",pri->m_bufRcv+256);
		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;
}

SOCKET ConnectTo(DWORD dwIP,WORD wPort)
{
	SOCKET sktClient = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
	sockaddr_in addr;
	addr.sin_family = AF_INET;
	addr.sin_port = htons(wPort);
	addr.sin_addr.S_un.S_addr=dwIP;

	if(connect(sktClient, (sockaddr*)&addr, sizeof(addr)))return 0;

	return sktClient;
}

void Ask4Port()
{
	char buf[1024]="PORT";
	int nSend=send(g_skt,(const char*)buf,1024,0);
}

void GetCurTime()
{
	char buf[1024]="GET CUR TIME";
	int nSend=send(g_skt,(const char*)buf,1024,0);
}

void EchoMode()
{
	char buf[1024]="SEND MSG";
	printf("请输入要发送的文本信息:\n");
	scanf("%s",buf+256);
	int nSend=send(g_skt,(const char*)buf,1024,0);
}

int main(int argc, char* argv[])
{
	if(argc<=2){
		printf("启动参数不足,程序退出。\n本程序启动方式为:Svr <服务器IP地址> <端口>\n");
		return 0;
	}
	char *szIP=NULL;
	WORD wPort=0;
	if(argc>1){
		szIP=_strlwr(argv[1]);
	}
	if(argc>2){
		wPort=atoi(_strlwr(argv[2]));
	}

	WSADATA data;
	WSAStartup(MAKEWORD(2,2),&data);

	DWORD dwIP=inet_addr(szIP);
	g_skt=ConnectTo(dwIP,wPort);
	if(g_skt<=0){
		printf("与%s:%d建立连接失败。参考原因:(%d)%s\n",
			IPDW2Str(dwIP),wPort,GetLastError(),GetLastErrorString());
		return 0;
	}else{
		//printf("与%s:%d建立连接成功\n",IPDW2Str(dwIP),wPort);
	}
	CHReceiveThreadParm *p=new CHReceiveThreadParm(g_skt,dwIP,wPort);
	_beginthread(ReceiveTread,0,(LPVOID)p);

	Ask4Port();

	BOOL b=1;
	char c;
	while(b){
		printf("    ------------------------------------    \n");
		printf("	1.\"Get current time(TCP)\"\n");
		printf("	2.\"Echo Mode(UDP)\"\n");
		printf("	3.\"Exit the program\n");
		printf("	请选择命令:\n");
		c=_getch();

		switch(c){
		case '1':
			{GetCurTime();argc=1;b=2;}break;
		case '2':
			{EchoMode();argc=1;b=3;}break;
		case '3':
			printf("\n");return 0;
		}
	}

	return 0;
}

⌨️ 快捷键说明

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