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