📄 server.c
字号:
#include <signal.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <stdio.h>
#include <fcntl.h>
#define MAX_LINE 100
#define MAX_NAME 100
#define MAX_CLIENT 30
int init_ser( int);
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);
}
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, i, j;
int length;
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 sever 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;
fcntl( sockfd, F_SETFL, O_NONBLOCK);
for ( ; ;) {
if ( (userCount = user_free( user_link)) >=0) {
new_sockfd = accept( sockfd, (struct sockaddr*)&cli_addr,
&cli_len);
fcntl( new_sockfd, F_SETFL, O_NONBLOCK);
if ( new_sockfd < 0) {
user_link[userCount] = 0;
} else {
user_link[userCount] = 1;
userfd[userCount] = new_sockfd;
}
} // if userCount >= 0
for ( i=0; i<MAX_CLIENT;i++) {
if ( user_link[ i] == 1) {
length = read( userfd[i], line, MAX_LINE);
if ( length == 0) { // socket is closed.
user_link[i] = 0;
username[i][0] = '\0';
} 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
} // 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 + -