⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tcpserver.c

📁 有关linux的tcp和udp通讯的服务器端和客服端的源程序
💻 C
字号:
/**/
#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;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -