一个简单的多进程服务器

/*
    server.c 
*/

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <errno.h>

#define MaxConnect 100
#define MaxlistenNum 500 

typedef struct sockaddr SockAddrStruct;
typedef struct sockaddr_in SockAddrStructIn;
const int Port = 12345;

int serverfunc( int NewFd  );
int Accept(int SocketFd,struct sockaddr_in* Addr_in , int Len);
int Recv(int NewFd, char* Msg , int Len , int flag);
int Socket(int domain, int type, int protocol);
int Bind(int socket, const struct sockaddr *address,socklen_t address_len);
int Listen(int sockfd, int backlog);
pid_t Fork(void);

int main()
{

	int SocketFd = -1;
	int NewFd = -1 ;
	int addrLen = 0 ;
	int ConnectFD[MaxConnect] = {0};
	pid_t pid = 0 ;
    int connectNum = 0 ;
	
	SockAddrStructIn Addr_in;
	addrLen = sizeof(Addr_in);
	Addr_in.sin_family = AF_INET;
	Addr_in.sin_port = htons(Port);
	Addr_in.sin_addr.s_addr = INADDR_ANY; //inet_addr(INADDR_ANY);//任意ip地址
	
	SocketFd = Socket( AF_INET , SOCK_STREAM , 0 );
	if( -1 == SocketFd )
	{
	    return -1;
	}
	if( ( Bind(SocketFd ,(SockAddrStruct* )&Addr_in , sizeof( Addr_in) ) ) < 0 )
	{
	     return -1;
	}
	if( ( Listen( SocketFd , MaxlistenNum ) ) < 0 )
	{
	     return -1;
	}
	
	printf("server is start\n");
	
	while(1)
	{     
	      NewFd = Accept(SocketFd, &Addr_in, addrLen);
		  if( (pid = Fork()) < 0 )
		  {
			  return -1 ;
		  }
		  else if( 0 == pid )
		  {
		      serverfunc( NewFd );
		  }
		  else
		  {    
		       connectNum++ ;//有缺陷 需要换成数据库
		       printf("server recv a new connect ! , connectNum[%d] \n" , connectNum);
		  }
	}
	
	return 0;
}

int serverfunc( int NewFd  )
{
     int iRet = -1;
     char Msg[100] = {0};
     char Buf[100] = {0};
	 while(1)
	 {
		 if( ( iRet = Recv( NewFd , Msg , sizeof(Msg) , 0 ) ) <= 0 )
		 {
		     close(NewFd);
			 return iRet;
		 }
		 if( 0 == strcmp(Msg, "quit") )
		 {
			 printf("(strcmp)client send the msg is quit\n" );
			 close(NewFd);
			 return 0 ;
		 }
		 snprintf(Buf, sizeof(Buf) - 1, "server:%s", Msg);
		 if(( iRet = write( NewFd, Buf, sizeof(Buf) ) ) < 0)
		 {
			 perror("server send  Fd failed !\n");
			 close( NewFd );
			 return iRet ;
		 }
	 }
	 iRet = 0;
	 close( NewFd );
	 return iRet;
}

int Accept(int SocketFd,struct sockaddr_in* Addr_in , int Len)
{
	 int newSocket = -1;
	 newSocket = accept(SocketFd,(struct sockaddr* )Addr_in, &Len);
	 if( -1 == newSocket )
	 {
	      perror("accept failed !\n");
	      return -1 ;
	 }
	 return newSocket;
}

int Recv(int NewFd, char* Msg , int Len , int flag)
{
    int iRet = recv( NewFd , Msg , Len , flag ) ;
    if( iRet < 0 )
	{
	     perror("  recv is failed ");
	}
	else if( 0 == iRet )
	{
	    printf("(recv) is not connect \n" );
	}
	else
	{
	    
	}
	return iRet;
	
}

int Socket(int domain, int type, int protocol)
{
     int SocketFd = -1 ;
	 SocketFd = socket( domain, type, protocol);
	 if( -1 == SocketFd )
	 {
	      perror("server socket create failed !\n");
	      return SocketFd;
	 }
	 
	 return SocketFd;
}

int Bind(int socket, const struct sockaddr *address,socklen_t address_len)
{ 
    if(( bind( socket, address, address_len) ) < 0)
	{
	    perror("bind error\n");
	    return -1;
	}
    return 0;
}

int Listen(int sockfd, int backlog)
{
    int iRet = -1;
    if( ( iRet = listen( sockfd, backlog ) ) < 0 )
	{
	     perror("listen error\n");
	     return iRet;
	}
	return iRet;
}

pid_t Fork(void)
{   
    pid_t pid ;
    pid = fork();
	if(pid < 0 )
	{
	   perror("fork error\n");
	}
	return pid;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值