?? multicli.cpp
字號:
#include <winsock2.h>
#include <io.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#pragma comment(lib,"ws2_32")
#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(void* s);
int ReadFromKeyBoardAndSandToServer(SOCKET sock);
int main(int argc, char *argv[]){
SOCKET sock;
int port;
unsigned long dst_ip;
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){
char buf[BUFSIZE];
CreateThread(NULL,0,
(LPTHREAD_START_ROUTINE)(ReceiveFromServer),
&(sock),0,NULL);
ReadFromKeyBoardAndSandToServer(sock);
strcpy(buf,"quit");
send(sock,buf,strlen(buf),0);
}
void ReceiveFromServer(void* s){
int len;
SOCKET sock;
char buf[BUFSIZE];
sock=*((SOCKET*)s);
while((len=recv(sock,buf,BUFSIZE-1,0))>=0){
buf[len]='\0';
printf("%s",buf);
fflush(stdout);
}
}
int ReadFromKeyBoardAndSandToServer(SOCKET sock){
int len;
char cmd[BUFSIZE];
char buf[BUFSIZE];
while(true){
if((len=_read(0,buf,BUFSIZE-1))>0){
buf[len]='\0';
sscanf(buf,"%s",cmd);
if(strcmp(cmd,"quit")==0) break;
if(send(sock,buf,len,0)<0) break;
}
}
return 0;
}
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 + -