Unix聊天室案例 客户端+服务端

/*
 * 	聊天室客户端
 *
 */

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

int sockfd;
char *IP = "127.0.0.1";
short PORT = 10222;
typedef struct sockaddr SA;

char name[20]; /* 客户端昵称 */

	/* 启动客户端,连接服务器 */
void init()
{
	printf("聊天室客户端可是启动\n");
	sockfd = socket(AF_INET,SOCK_STREAM,0);
	struct sockaddr_in addr;
	addr.sin_family = AF_INET;
	addr.sin_port = htons(PORT);
	addr.sin_addr.s_addr = inet_addr(IP);

	if(connect(sockfd,(SA*)&addr,sizeof(addr))==-1){
		perror("无法连接到服务器\n");
		printf("客户端启动失败\n");
	}
	printf("客户端启动成功!\n");
}

void *recv_thread(void *p)
{
	while(1){
		char buf[100] = {0};
		if(resv(sockfd,buf,sizeof(buf),0)<=0){
			return;
		}
		printf("%s\n",buf);
	}	
}

	/* 开始通信 */
void start()
{
	/* 发送消息,发送之前启动一个线程,
	   用来接受服务器发送过来的消息.  */
	pthread_t pid;
	pthread_create(&pid,0,recv_thread,0);
	while(1){
		char buf[100] = {0};
		scanf("%s",buf); /* 接受用户输入 */
		char msg[100] = {0};
		sprintf(msg,"%s说:%s",name,buf);
		send(sockfd,msg,strlen(msg),0); /* 发给服务器 */
	}
}

void sig_close()
{
	close(sockfd);
	exit(0);
}

int main()
{
	signal(SIGINT,sig_close); /* 关闭Ctrl+C */
	printf("请输入您的昵称:");
	scanf("%s",name);
	init(); /* 连接服务器 */
	send(sockfd,name,strlen(name),0); /* 将昵称发给服务器 */
	start();
	return 0;
}
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

int sockfd;
char *IP = "127.0.0.1";
short PORT = 10222;
typedef struct sockaddr SA;

struct client
{
	char name[20]; /* 存储客户昵称 */
	int fds; /* 客户端的socket描述符 */
};

struct client c[100] = {0}; /* 最多记录100个连接 */
int size = 0; /* 初始化服务器的网络,创建socket */
	
	/* 初始化服务器的网络,
	   创建socket.  */
void init()
{

	printf("聊天室服务器开始启动...\n");	
	sockfd = socket(AF_INET,SOCK_STREAM,0);
	if(sockfd==-1)
	{
		perror("创建socket失败\n");
		printf("服务器启动失败\n");
		exit(-1);
	}

		/* 配置socket地址参数 */
	struct sockaddr_in addr;
	addr.sin_family = AF_INET;
	addr.sin_port = htons(PORT);
	addr.sin_addr.s_addr = inet_addr(IP);

		/* 绑定服务器 */
	if(bind(sockfd,(SA*)&addr,sizeof(addr)==-1){
		perror("绑定失败\n");
		printf("服务器启动失败\n");
		exit(-1);
	}
	printf("绑定成功!\n");

		/* 设置监听 */	
	if(listen(sockfd,10)==-1){
		perror("设置监听失败\n");
		printf("服务器启动失败\n");
		exit(-1)'
	}
	printf("设置监听成功!\n");
	printf("初始化服务器成功\n");
}
	
	/* 分发消息 */
void sendMsg2All(char *msg)
{
	int i=0;
	for(;i0){
		strcpy(c[size].name,name); /* 获取昵称 */
	}
	size++;
	char tishi[100] = {0};
		/* 群发通知消息 */
	sprintf(tishi,"热烈欢迎%s登录聊天室..\n",name);
	sendMsg2All(tishi);

	while(1)
	{
		char buf[100] = {0};
		if(recv(fd,buf,sizeof(buf),0)==0){ /* 返回0标识TCP另一端断开连接 */
			printf("fd=%dquit\n",fd); /* 测试 */
			int i;
			char name[20] = {0};
			for(i=0;ifd=%dquit\n",fd);
					char msg[100] = {0};
					sprintf(msg,"欢送%s离开聊天室,再见!\n",name);
					
					/* 群发退出通知. */
					sendMsg2All(msg);
					close(fd);
					return;
				}
			}

		}
		sendMsg2All(buf);
	}
	
}

	/* 启动服务,等待客户端请求. */
void service()
{
	printf("服务器开始启动服务\n");
	while(1)
	{
		struct sockaddr_in fromaddr;
		socklen_t len = sizeof(fromaddr);
		int fd = accept(sockfd,(SA*)&fromaddr,&len);
		if(fd==-1){
			printf("客户端连接出错!\n");
			continue; /* 继续循环,处理连接 */
		}
			/*  */
		printf("fd=%d\n",fd); /* 测试 */
		
		pthread_t thrd;
		pthread_creat(&thrd,service_thread,&fd);
		
	}
}
	
	/* 关闭服务器. */
void sig_close()
{
	close(sockfd);	
	printf("服务器已经关闭\n");
	exit(0);
}

int main()
{
	signal(SIGINT,sig_close); /* 退出Ctrl+C */
	init();
	service();
	return 0;
}


你可能感兴趣的:(Unix,C)