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

📄 server.c

📁 很经典的Linux网络编程源码
💻 C
字号:
/*server.c*/
#include <signal.h>
#include <sys/wait.h>
#include "inet.h"

int     init_ser( int); 
int     max( int a, int b)
{
    int     themax;

    if ( a > b) themax = a;
    else themax = b;
    return themax;
}

void    set_name( char *line, char *name) 
{
    strcpy( name, &line[1]);
    sprintf( line, "%s join the room\n", name);
}

void    add_name( char *line, char *name)
{
    char    theline[MAX_LINE];

    strcpy( theline, name);
    strcat( theline, " : ");
    strcat( theline, line);
    strcpy( line, theline);
}

int		user_free( int user_link[MAX_CLIENT])
{
	int		i = 0;

	while ( ( user_link[i] != 0)&&( i<MAX_CLIENT)) i++;
	if ( i == MAX_CLIENT) return( -1);
	return( i);
}

void    add_sockset( fd_set *sockset, int sockfd, int *user_link, int *userfd)
{
    int     i;

    FD_ZERO( sockset);
    FD_SET( sockfd, sockset);
    for ( i=0; i<MAX_CLIENT; i++) {
        if ( user_link[i] == 1) {
            FD_SET( userfd[i], sockset);
        }
    }
}

int     main( void)
{
	int		sockfd;
	int		new_sockfd;
	int		user_link[MAX_CLIENT];
	int 	userfd[MAX_CLIENT];
    char    username[MAX_CLIENT][MAX_NAME];
    char    line[MAX_LINE];
	int		userCount;
	unsigned    int		cli_len;
	struct	sockaddr_in		cli_addr;
    FILE    *file;
    int     port;
    int     length, i, j;
    fd_set  sockset;
    int     maxfd = 0;

    file = fopen( "config", "r");
    fgets( line, MAX_LINE, file);
    fscanf( file, "%d", &port);
    fclose( file);
    printf ( "%d \n", port);
    sockfd = init_ser( port);

	if ( sockfd == 0) {
		printf( "Init server socket error\n");
		fflush( stdout);
		exit(1);
	} //Socket init done

	listen( sockfd, MAX_CLIENT);
	cli_len = sizeof( cli_addr);	
	for ( i = 0; i<MAX_CLIENT; i++) {
		user_link[i] = 0;
        username[i][0] = '\0';
    }
	userCount = 0;
    FD_ZERO( &sockset);
    FD_SET( sockfd, &sockset);
    maxfd = max( maxfd, sockfd+1);

	for ( ; ;) {
        select( maxfd, &sockset, NULL, NULL, NULL);
		if ( FD_ISSET( sockfd, &sockset) 
            && (userCount = user_free( user_link)) >=0) { 
			new_sockfd = accept( sockfd, (struct sockaddr*)&cli_addr,
				&cli_len);
			if ( new_sockfd < 0) {
				user_link[userCount] = 0;
                printf( "acc error\n");
			} else {
				user_link[userCount] = 1;
                userfd[userCount] = new_sockfd;
                FD_SET( new_sockfd, &sockset);
                maxfd = max( maxfd, new_sockfd+1);
            }
        } // if userCount >= 0
        for ( i=0; i<MAX_CLIENT;i++) {
            if ( ( user_link[ i] == 1) 
                && (FD_ISSET( userfd[i], &sockset))) {
                length = read( userfd[i], line, MAX_LINE);
                if ( length == 0) { // socket is closed.
                    user_link[i] = 0;
                    username[i][0] = '\0';
                    FD_CLR( userfd[i], &sockset);
                } else if ( length >0) {
                    line[length] = '\0';
                    if ( (line[0] == '/')&&(username[i][0] == '\0')) {
                        set_name( line, username[i]);
                    } else {
                        add_name( line, username[i]);
                    }
                    for ( j=0; j<MAX_CLIENT; j++) {
                        if ( (j != i)&&(user_link[j]==1)) {
                            write( userfd[j], line, strlen( line));
                        }
                    }
                } // length >0
            } // user_link[i] == 1
        } // for                
        add_sockset( &sockset, sockfd, user_link, userfd);
	} // for		
    return 0;
}

int	init_ser( int port)
//If success, return sockfd, else return 0
{

	int		SERV_TCP_PORT;
	int		sockfd;
	struct	sockaddr_in	serv_addr;

    SERV_TCP_PORT = port;

	if ( ( sockfd = socket( AF_INET,SOCK_STREAM,0))<0) {
        perror( "socket:");
		printf( "server:can`t open stream socker.\n");
		fflush( stdout);
		return( 0);
	}

	bzero( ( char*)&serv_addr, sizeof( serv_addr));
	serv_addr.sin_family 	  =AF_INET;
	serv_addr.sin_addr.s_addr =htonl( INADDR_ANY);
	serv_addr.sin_port	  =htons( SERV_TCP_PORT);

	if ( bind( sockfd, ( struct sockaddr *)&serv_addr, 
		sizeof( serv_addr))<0) {
        perror( "bind:");
		printf( "server: can`t bind local address\n");
		fflush( stdout);
		return( 0);
	}
	return( sockfd); //successful.
}

⌨️ 快捷键说明

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