?? tcpcli.cpp
字號:
#include <winsock2.h>
#include <io.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define BUFSIZE 8192
#define DEFAULT_PORT 5320
enum {CMD_NAME,DST_IP,DST_PORT};
void InitWinSocket();
void ParseCmdLine(int*port ,unsigned long *ip,int argc,char*argv[]);
void CreateTcpSocket(SOCKET* sock);
void ConnectToServer(SOCKET sock,unsigned long dst_ip,int port);
void CommunicateWithServer(SOCKET sock);
void ReceiveFromServer(SOCKET sock);
int ReadFromKeyBoardAndSandToServer(SOCKET sock);
int main(int argc, char *argv[]){
SOCKET sock;
unsigned long dst_ip;
int port;
InitWinSocket();
ParseCmdLine(&port,&dst_ip,argc,argv);
CreateTcpSocket(&sock);
ConnectToServer(sock,dst_ip,port);
CommunicateWithServer(sock);
closesocket(sock);
WSACleanup();
return 0;
}
void CommunicateWithServer(SOCKET sock){
// int n;
// char cmd[BUFSIZE];
char buf[BUFSIZE];
struct timeval tv;
fd_set readfd;
tv.tv_sec=600;
tv.tv_usec=0;
while(true){
FD_ZERO(&readfd);
FD_SET(0,&readfd);
FD_SET(sock,&readfd);
select(sock+1,&readfd,NULL,NULL,&tv);
if(FD_ISSET(0,&readfd)){
if(ReadFromKeyBoardAndSandToServer(sock)<0)
break;
}
if(FD_ISSET(sock,&readfd))
ReceiveFromServer(sock);
}
strcpy(buf,"quit");
send(sock,buf,strlen(buf),0);
}
void ReceiveFromServer(SOCKET sock){
int n;
char buf[BUFSIZE];
if((n=recv(sock,buf,BUFSIZE-1,0))<=0){
perror("timeout recv");
exit(-1);
}
buf[n]='\0';
printf("%s",buf);
fflush(stdout);
}
int ReadFromKeyBoardAndSandToServer(SOCKET sock){
int n,flag=0;
char cmd[BUFSIZE];
char buf[BUFSIZE];
if((n=_read(0,buf,BUFSIZE-1))>0){
buf[n]='\0';
sscanf(buf,"%s",cmd);
if(strcmp(cmd,"quit")==0) flag=-1;
if(send(sock,buf,n,0)<0) flag=-1;
}
return flag;
}
void InitWinSocket(){
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2,1),&wsaData) != 0){
fprintf(stderr,"WSAStartup failed: %d\n",GetLastError());
exit(EXIT_FAILURE);
}
}
void ParseCmdLine(int*port ,unsigned long *ip,int argc,char*argv[]){
if(argc != 2 && argc!=3){
fprintf(stderr," Usag: %s hostname [port]\n",argv[0]);
exit(EXIT_FAILURE);
}
if((*ip=inet_addr(argv[DST_IP]))==INADDR_NONE){
struct hostent* he;
if((he=gethostbyname(argv[DST_IP]))==NULL){
fprintf(stderr,"gethostbyname error\n");
exit(EXIT_FAILURE);
}
memcpy((char*)ip,(char*)he->h_addr,he->h_length);
}
*ip=ntohl(*ip);
if(argc==3){
if((*port=(atoi(argv[DST_PORT])))==0){
struct servent *se;
if((se=getservbyname(argv[DST_PORT],"TCP"))!=NULL)
*port=(int)ntohs((u_short)se->s_port);
else{
fprintf(stderr,"getservbynmame error\n");
exit(EXIT_FAILURE);
}
}
}else *port=DEFAULT_PORT;
}
void CreateTcpSocket(SOCKET* sock){
if((*sock=socket(AF_INET,SOCK_STREAM,0))<0){
perror("socket");
exit(EXIT_FAILURE);
}
}
void ConnectToServer(SOCKET sock,unsigned long dst_ip,int port){
struct sockaddr_in server;
memset((char*)&server,0,sizeof(server));
server.sin_family=AF_INET;
server.sin_addr.s_addr=htonl(dst_ip);
server.sin_port=htons(port);
if(connect(sock,(struct sockaddr*)&server,sizeof(server))<0){
perror("connect");
exit(EXIT_FAILURE);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -