主题:一个TCP客户端程序的运行
我不知道为什么下面这个程序要在命令提示符下运行,用的命令就是函数名.而直接运行却不能???
程序的功能大概是这样的:从键盘输入要要连接的服务器的IP 和端口 如果连接成功 就可以发送字符串
程序还设置了特殊事件的响应函数
#pragma comment(lib,"ws2_32.lib")
#include <STDIO.H>
#include <WINSOCK2.H>
SOCKET g_sockClient=INVALID_SOCKET;
void usage();
BOOL WINAPI CtrlHandler(DWORD dwEvent);
int main(int argc,char *argv[])
{
unsigned long destAddr;
int nPort;
if(argc==2){
destAddr=inet_addr(argv[1]);
if(destAddr==INADDR_NONE){
usage();
return -1;
}
nPort=23;
}
else
if(argc==3){
destAddr=inet_addr(argv[1]);
if(destAddr==INADDR_NONE){
usage();
return -1;
}
nPort=atoi(argv[2]);
if(nPort<0||nPort>65535){
usage();
return -1;
}
}
else{
usage();
return -1;
}
if(!SetConsoleCtrlHandler(CtrlHandler,TRUE)){
printf("SetConsoleCtrlHandler:%d\n",GetLastError());
return -1;
}
WSAData wsaData;
WSAStartup(WINSOCK_VERSION,&wsaData);
g_sockClient=socket(AF_INET,SOCK_STREAM,0);
if(g_sockClient==INVALID_SOCKET){
WSACleanup();
return -1;
}
struct sockaddr_in to;
memset(&to,0,sizeof(to));
to.sin_addr.s_addr=destAddr;
to.sin_family=AF_INET;
to.sin_port=htons(nPort);
printf("connect %s:%d.......",inet_ntoa(to.sin_addr),nPort);
if(connect(g_sockClient,(struct sockaddr *)&to,sizeof(to))==SOCKET_ERROR){
if(g_sockClient!=INVALID_SOCKET)
closesocket(g_sockClient);
printf("Failed.(connect %d)\n",WSAGetLastError());
WSACleanup();
return -1;
}
else
printf("Successfully.\n INPUT:\n");
char bufa[83];
char bufb[1000];
fd_set readSet;
struct timeval tv;
int ret,len;
while(1){
memset(bufa,0,83);
gets(bufa);
len=strlen(bufa);
if(len>80)len=80;
bufa[len]='\r';
bufa[len+1]='\n';
bufa[len+2]='0';
ret=send(g_sockClient,bufa,strlen(bufa),0);
if(ret==SOCKET_ERROR){
printf("send:%d\n",WSAGetLastError());
break;
}
FD_ZERO(&readSet);
FD_SET(g_sockClient,&readSet);
tv.tv_sec=3;
tv.tv_usec=0;
ret=select(0,&readSet,NULL,NULL,&tv);
if(ret==SOCKET_ERROR){
printf("select:%d\n",WSAGetLastError());
break;
}
if(ret==0){
printf("Timeout,NoResponse From Server.\n");
break;
}
if(FD_ISSET(g_sockClient,&readSet)){
memset(bufb,0,1000);
ret=recv(g_sockClient,bufb,1000,0);
if(ret==SOCKET_ERROR){
printf("select:%d\n",WSAGetLastError());
break;
}
else
printf("%s\n",bufb);
}
}
if(g_sockClient!=INVALID_SOCKET)
closesocket(g_sockClient);
WSACleanup();
printf("Stopped.\n");
return 0;
}
void usage()
{
printf("usage;\tmytelnet x.x.x.x port\t\t\t(0<port<65535)\n");
}
BOOL WINAPI CtrlHandler(DWORD dwEvent)
{
switch(dwEvent){
case CTRL_C_EVENT:
case CTRL_LOGOFF_EVENT:
case CTRL_SHUTDOWN_EVENT:
case CTRL_CLOSE_EVENT:
printf("stoppint.....\n");
closesocket(g_sockClient);
g_sockClient=INVALID_SOCKET;
break;
default:
return FALSE;
}
return TRUE;
}
程序的功能大概是这样的:从键盘输入要要连接的服务器的IP 和端口 如果连接成功 就可以发送字符串
程序还设置了特殊事件的响应函数
#pragma comment(lib,"ws2_32.lib")
#include <STDIO.H>
#include <WINSOCK2.H>
SOCKET g_sockClient=INVALID_SOCKET;
void usage();
BOOL WINAPI CtrlHandler(DWORD dwEvent);
int main(int argc,char *argv[])
{
unsigned long destAddr;
int nPort;
if(argc==2){
destAddr=inet_addr(argv[1]);
if(destAddr==INADDR_NONE){
usage();
return -1;
}
nPort=23;
}
else
if(argc==3){
destAddr=inet_addr(argv[1]);
if(destAddr==INADDR_NONE){
usage();
return -1;
}
nPort=atoi(argv[2]);
if(nPort<0||nPort>65535){
usage();
return -1;
}
}
else{
usage();
return -1;
}
if(!SetConsoleCtrlHandler(CtrlHandler,TRUE)){
printf("SetConsoleCtrlHandler:%d\n",GetLastError());
return -1;
}
WSAData wsaData;
WSAStartup(WINSOCK_VERSION,&wsaData);
g_sockClient=socket(AF_INET,SOCK_STREAM,0);
if(g_sockClient==INVALID_SOCKET){
WSACleanup();
return -1;
}
struct sockaddr_in to;
memset(&to,0,sizeof(to));
to.sin_addr.s_addr=destAddr;
to.sin_family=AF_INET;
to.sin_port=htons(nPort);
printf("connect %s:%d.......",inet_ntoa(to.sin_addr),nPort);
if(connect(g_sockClient,(struct sockaddr *)&to,sizeof(to))==SOCKET_ERROR){
if(g_sockClient!=INVALID_SOCKET)
closesocket(g_sockClient);
printf("Failed.(connect %d)\n",WSAGetLastError());
WSACleanup();
return -1;
}
else
printf("Successfully.\n INPUT:\n");
char bufa[83];
char bufb[1000];
fd_set readSet;
struct timeval tv;
int ret,len;
while(1){
memset(bufa,0,83);
gets(bufa);
len=strlen(bufa);
if(len>80)len=80;
bufa[len]='\r';
bufa[len+1]='\n';
bufa[len+2]='0';
ret=send(g_sockClient,bufa,strlen(bufa),0);
if(ret==SOCKET_ERROR){
printf("send:%d\n",WSAGetLastError());
break;
}
FD_ZERO(&readSet);
FD_SET(g_sockClient,&readSet);
tv.tv_sec=3;
tv.tv_usec=0;
ret=select(0,&readSet,NULL,NULL,&tv);
if(ret==SOCKET_ERROR){
printf("select:%d\n",WSAGetLastError());
break;
}
if(ret==0){
printf("Timeout,NoResponse From Server.\n");
break;
}
if(FD_ISSET(g_sockClient,&readSet)){
memset(bufb,0,1000);
ret=recv(g_sockClient,bufb,1000,0);
if(ret==SOCKET_ERROR){
printf("select:%d\n",WSAGetLastError());
break;
}
else
printf("%s\n",bufb);
}
}
if(g_sockClient!=INVALID_SOCKET)
closesocket(g_sockClient);
WSACleanup();
printf("Stopped.\n");
return 0;
}
void usage()
{
printf("usage;\tmytelnet x.x.x.x port\t\t\t(0<port<65535)\n");
}
BOOL WINAPI CtrlHandler(DWORD dwEvent)
{
switch(dwEvent){
case CTRL_C_EVENT:
case CTRL_LOGOFF_EVENT:
case CTRL_SHUTDOWN_EVENT:
case CTRL_CLOSE_EVENT:
printf("stoppint.....\n");
closesocket(g_sockClient);
g_sockClient=INVALID_SOCKET;
break;
default:
return FALSE;
}
return TRUE;
}