?? tcpserver.c
字號(hào):
/**/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
#include<sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
/**/
#define BUFSIZE 8192
#define DEFAULT_PORT 5320
enum {CMD_NAME,SRC_PORT};
int execute(char* command,char*buf,int bufmax);
int main(int argc, char *argv[])
{
int len;
int port;
int s;
int so;
int cn;
int sn;
int rn;
char cmd1[BUFSIZE];
char cmd2[BUFSIZE];
char recv_buf[BUFSIZE];
char send_buf[BUFSIZE];
struct sockaddr_in server;
struct sockaddr_in client;
if(argc == 2){
if((port=atoi(argv[DST_PORT]))==0){
struct servent*se;
if((se=getservbyname(argv[DST_PORT],"udp"))!=NULL)
port=(int)ntohs((u_short)se->s_port);
else{
fprintf(stderr,"Getservbyname error");
exit(EXIT_FAILURE);
}
}
}else
port=DEFAULT_PORT;
/*Step 1 */
if((so=socket(AF_INET,SOCK_STREAM,0)<0){
perror("socket");
exit(EXIT_FAILURE);
}
/*step 2 */
memset((char*)&server,0,sizeof(server));
server.sin_family=AF_INET;
server.sin_addr.s_addr=htonl(INADDR_ANY);
server.sin_port=htons(port);
if(bind(so,(struct sockaddr*)&server,sizeof(server))<0){
perror("bind");
exit(EXIT_FAILURE);
}
listen(so,5);
while(1){
len=sizeof(client);
if((s=accept(so,(struct sockaddr *)&client,&len))<0){
perror("accept");
exit(EXIT_FAILURE);
}
printf("connect from %s \n",inet_ntoa(client.sin_addr));
#ifdef FORK_SERVER
if(fork( )!=0){
close(s);
continue;
}
close(so);
#endif
while(1){
int i=0;
sn=sprintf(send_buf,"TCP>");
send(s,send_buf,sn,0);
receive:
if((rn=recv(s,&recv_buf[i],1,0)<0) break;
if(recv_buf_buf[i]!='\n'){
i++;
if(i<BUFSIZE-1) goto receive;
}
recv_buf[i]='\0';
printf("receive % s/n",recv_buf);
if((cn=sscanf(recv_buf,"%s %s",cmd1,cmd2)<=0)
sn=0;
else if(cn==2&&strcmp(cmd1,"show")==0){
if(strcmp(cmd2,"route")=0)
#ifdef __linux
sn=execute("/bin/netstat -rn",send_buf,BUFSIZE);
#else
sn=execute("/usr/bin/netstat -rn",send_buf,BUFSIZE);
#endif
else if(strcmp(cmd2,"arp")=0)
#ifdef __linux
sn=execute("/bin/arp -an",send_buf,BUFSIZE);
#else
sn=execute("/usr/bin/arp -an",send_buf,BUFSIZE);
#endif
else if(strcmp(cmd2,"tcp")=0)
#ifdef __linux
sn=execute("/bin/netstat -tn",send_buf,BUFSIZE);
#else
sn=execute("/usr/bin/netstat -tn",send_buf,BUFSIZE);
#endif
else if(strcmp(cmd2,"nic")=0)
sn=execute("/bin/ifconfig -a",send_buf,BUFSIZE);
else{
sn=sprintf(send_buf,"Parameter error %s \n"
"show[route |arp|tcp|nic\n",cmd2);
printf("%s",snd_buf);
}else if(cn==1 )
if(strcmp(cmd1,"quit")==0) break;
send_buf[0]='\0';
if(strcmp(cmd1,"help")!=0)
sprintf(send_buf,"command error %s\n"cmd1);
strcat(send_buf,"Command: \n"
"show route \n"
"show arp \n"
"show nic \n"
"quit \n"
"help \n");
sn=strlen(send_buf);
} else sn=sprintf(send_buf,"Command error %s \n",cmd1);
if(sn==0)sn=sprintf(send_buf," \n");
if(send(s,send_buf,sn,0)<0)
break;
printf("%s",send_buf);
}
close(s);
}
close(so);
return 0;
}
int execute(char*command,char*buf,int bufmax){
FILE *fp;
int i;
if((fp=popen(command,"r")==NULL){
perror(command);
exit(EXIT_FAILURE);
}
i=0;
while((buf[i++]=fgetc(fp)!=EOF && i<bufmax);
plcose(fp);
return i;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -