All pastes #2107224 Raw Edit

server

public c v1 · immutable
#2107224 ·published 2012-01-29 04:22 UTC
rendered paste body
/* 服务器端 server.c */#include <glib.h>#include <stdio.h>#include <fcntl.h>#include <signal.h>#include <sys/socket.h>#include <sys/types.h>#include <sys/time.h>#include <unistd.h>#include <netdb.h>#include <netinet/in.h>#define OURPORT 8088#define MAX_USERS 8//定义用户数据结构struct _client {	gint sd;	gboolean in_use;	gchar name[64];	gchar buf[1024];};typedef struct _client client;//定义用户数据区client user[MAX_USERS];//定义服务线程voiddo_service (gpointer id){	gint j;	char tobuf[1024];	while(read(user[GPOINTER_TO_INT(id)].sd,user[GPOINTER_TO_INT(id)].buf,1024)!=0)	{		sprintf(tobuf,"%s:%s\n",user[GPOINTER_TO_INT(id)].name,user[GPOINTER_TO_INT(id)].buf);		for(j=0; j<MAX_USERS; j++)		{			if(user[j].in_use)			{				write(user[j].sd,tobuf,1024);				g_print("%s",tobuf);			}		}	}	user[GPOINTER_TO_INT(id)].in_use = FALSE;	close(user[GPOINTER_TO_INT(id)].sd);//exit(0);}int main(int argc, char* argv[]){	gint sd, newsd;	struct sockaddr_in *sin;	gint slen;	gint count = 0;	gint flags;	gchar buf[1024];	gchar tobuf[1024];	gint length,i,j;	if(!g_thread_supported())		g_thread_init(NULL);	else		g_print("thread not supported\n");	sd = socket(AF_INET,SOCK_STREAM,0);	if(sd == -1)	{		g_print("create socket error!\n");		return -1;	}	sin = g_new(struct sockaddr_in,1);	sin->sin_family = AF_INET;	sin->sin_port = OURPORT;	slen = sizeof(struct sockaddr_in);	if(bind(sd,(struct sockaddr *)sin,slen)==-1)	{		g_print("bind error!\n");		return -1;	}	if(listen(sd,8)<0)	{		g_print("listen error!\n");		return -1;	}	for(i=0; i<MAX_USERS; i++)		user[i].in_use = FALSE;	flags = fcntl(sd,F_GETFL);	fcntl(sd,F_SETFL,flags&~O_NDELAY);	for(;;)	{		newsd = accept(sd,(struct sockaddr *)sin,&slen);		if(newsd == -1)		{			g_print("accept error!\n");			break;		}		else		{			if(count >= MAX_USERS)            {                sprintf(buf,"用户数量过多服务器不能连接。\n");                write(newsd,buf,1024);                close(newsd);            }            else            {                flags = fcntl(user[i].sd,F_GETFL);                fcntl(user[i].sd,F_SETFL,O_NONBLOCK);                user[count].sd = newsd;                user[count].in_use = TRUE;                read(newsd,user[count].name,64);                //创建为用户服务的线程                g_thread_create((GThreadFunc)do_service,(gpointer)count,TRUE,NULL);                count++;            }        }    }//for(;;)close(sd);g_free(sin);}