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

📄 server.ec

📁 中兴ZX10交换机接口代码
💻 EC
字号:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<stdarg.h>
#include<string.h>
#include<errno.h>
#include<netdb.h>
#include<fcntl.h>
#include<sys/time.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include"skel.h"


#define SERVER 1
#define SERVNAME  "zxhlr"

extern int errno;

/*define and init the vars*/

int sockfd=-1;
int port=5000;
/*************************************************************************************************/
main()
{
	int i,num;
	int childpid;

	  net_init(SERVNAME,port);
	  if((childpid=net_open())==0){
		  /*read and write through the description socked*/
		  str_echo();
		  net_close();
		  exit(0);
	  }
}
/*************************************************************************************************/
str_echo()
{
	int n;
	char line[512];

	for(;;){
		n=readline(sockfd,line,512);
		if (n==0)
			return;
		else if (n<0)
			printf("server:n<0 error\n");
		if (writen(sockfd,line,n)!=n)
			printf("server:writen error\n");
	}
}
/*************************************************************************************************/
err_dump(str)
char *str;
{
	printf("%s\n",str);
	exit(1);
}
/*************************************************************************************************/
/*read"n"bytes from a description */
int
readn(fd,ptr,nbytes)
   register int fd;
   register char *ptr;
   register int nbytes;
   {
	   int nleft,nread;
	   nleft=nbytes;
	   while(nleft>0){
		   nread=read(fd,ptr,nleft);
		   if(nread<0)
			   return(nread);
		   else if(nread==0)
			   break;
		   nleft-=nread;
		   ptr+=nread;
	   }
	   return(nbytes-nleft);
   }
/*************************************************************************************************/
/*write"n" bytes to a descriptor */
int
writen(fd,ptr,nbytes)
  register int fd;
  register char *ptr;
  register int nbytes;
  {
	  int nleft,nwritten;
	  nleft=nbytes;
	  while(nleft>0){
		  nwritten=write(fd,ptr,nleft);
		  if(nwritten<=0)
			  return(nwritten);
		  nleft-=nwritten;
		  ptr+=nwritten;
	  }
	  return(nbytes-nleft);
  }
/*************************************************************************************************/
  /*read a line from a description */
  int 
  readline(fd,ptr,maxlen)
  register int fd;
  register char *ptr;
  register int maxlen;
  {
	  int n,rc;
	  char c;
	  for(n=1;n<maxlen;n++){
		  if ((rc=read(fd,&c,1))==1){
			  *ptr++=c;
			  if(c=='\n')
				  break;
		  }else if (rc==0){
			  if(n==1)
				  return(0);
			  else
				  break;
		  }else
			  return(-1);
	  }
	  *ptr=0;
	  return(n);
  }
/*************************************************************************************************/
  struct sockaddr_in tcp_srv_addr;
  struct servent tcp_serv_info;
  struct sockaddr_in tcp_cli_addr;
/*************************************************************************************************/
  net_close()
  {
	  close(sockfd);
	  sockfd=-1;
  }
/*************************************************************************************************/
  net_init(service,port)
      char *service;
      int port;
	  {
		  struct servent *sp;

		  bzero((char *)&tcp_srv_addr,sizeof(tcp_srv_addr));
		  tcp_srv_addr.sin_family=AF_INET;
		  tcp_srv_addr.sin_addr.s_addr=htonl(INADDR_ANY);

		  if(strlen(service)!=0){
			  if((sp=getservbyname(service,"tcp"))==NULL)
				  err_dump("net_init:unkown service:%s/tcp",service);
			  tcp_serv_info=*sp;
			  if(port>0)
				  tcp_srv_addr.sin_port=htons(port);
			  else
				  tcp_srv_addr.sin_port=sp->s_port;
		  }else{
			  if(port<=0){
				  err_dump("tcp_open:must specify either service or port");
				  return(-1);
			  }
			  tcp_srv_addr.sin_port=htons(port);
		  }
		  if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0)
			  err_dump("net_init:can't creat stream socket");
		  if(bind(sockfd,(struct sockaddr *)&tcp_srv_addr,sizeof(tcp_srv_addr))<0)
			  err_dump("net_init:can't bind local address");
		  listen(sockfd,5);
	  }
/*************************************************************************************************/
int net_open()
{
	register int newsockfd,childpid,nbytes;
	int clilen,on;
	on=1;
again:
	clilen=sizeof(tcp_cli_addr);
	newsockfd=accept(sockfd,(struct sockaddr *)&tcp_cli_addr,&clilen);
	if (newsockfd<0){
		if(errno==EINTR){
			errno=0;
			goto again;
		}
		err_dump("accept error");
	}
	if((childpid=fork())<0)
		err_dump("server can't forks");
	else if (childpid>0){    /*parent*/
		close(newsockfd);
		return(childpid);
	}
	/*child*/
	close(sockfd);
	sockfd=newsockfd;
	return(0);
}

⌨️ 快捷键说明

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