/*
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;
}