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

📄 chats.c

📁 linux下用c写的简易聊天室程序
💻 C
字号:
#include <sys/types.h>#include <sys/socket.h>#include <stdio.h>#include <unistd.h>#include <netinet/in.h>#include <arpa/inet.h>#include <errno.h>#include <sys/select.h>#define MAXLINE 1024#define BACKLOG 20intmain(int argc, char **argv){	int		 i, j,maxi, maxfd, listenfd, connfd, sockfd;	int			nready, client[FD_SETSIZE];	ssize_t			n;	fd_set			rset, allset;	char			line[MAXLINE],temp[INET_ADDRSTRLEN];	socklen_t		clilen,templen;	struct sockaddr_in	cliaddr, servaddr,tempaddr;	if ( (listenfd = socket(AF_INET, SOCK_STREAM, 0))<0 ) 	  {	    perror("socket");	  }       bzero(&servaddr,sizeof(servaddr));       servaddr.sin_family = AF_INET;       servaddr.sin_addr.s_addr = htonl(INADDR_ANY);       servaddr.sin_port = 0;       if (bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr)) == -1)       {         perror("bind");         exit(1);        }    /* how we can get the binded socket information */       templen = sizeof(struct sockaddr);      if (getsockname(listenfd, (struct sockaddr *)&tempaddr,&templen) == -1){      perror("getsockname");      exit(1);      }      printf("Server is listening on port %d\n",ntohs(tempaddr.sin_port));       if (listen(listenfd,BACKLOG) == -1){         perror("listen");         exit(1);       }	maxfd = listenfd;			/* initialize */	maxi = -1;				/* index into client[] array */	for (i = 0; i < FD_SETSIZE; i++)		client[i] = -1;			/* -1 indicates available entry */	FD_ZERO(&allset);	FD_SET(listenfd, &allset);	for ( ; ; ) {		rset = allset;		/* structure assignment */		nready = select(maxfd+1, &rset, NULL, NULL, NULL);		if (FD_ISSET(listenfd, &rset)) {	/* new client connection */			clilen = sizeof(cliaddr);			if ( (	connfd = accept(listenfd, (struct sockaddr *) &cliaddr, &clilen) ) <  0)			{			  perror("accept");			}			printf("A new guy from: %s, port %d\n",					inet_ntop(AF_INET, &cliaddr.sin_addr, temp, INET_ADDRSTRLEN),					ntohs(cliaddr.sin_port));			for (i = 0; i < FD_SETSIZE; i++)				if (client[i] < 0) {					client[i] = connfd;	/* save descriptor */					break;				}			if (i == FD_SETSIZE)				perror("too many clients");			FD_SET(connfd, &allset);	/* add new descriptor to set */			if (connfd > maxfd)				maxfd = connfd;			/* for select */			if (i > maxi)				maxi = i;				/* max index in client[] array */			if (--nready <= 0)				continue;				/* no more readable descriptors */		}		for (i = 0; i <= maxi; i++) {	/* check all clients for data */			if ( (sockfd = client[i]) < 0)				continue;			if (FD_ISSET(sockfd, &rset)) {				if ( (n = read(sockfd, line, MAXLINE)) == 0) {						/*4connection closed by client */					close(sockfd);					FD_CLR(sockfd, &allset);					client[i] = -1;				} else				  {				    printf("%s",line);                      for(j=0;(j<=maxi)&&((sockfd=client[j])>=0);j++)                        {  if(j==i)                             continue;                           write(sockfd,line,n);                         } 				  }				if (--nready <= 0)					break;				/* no more readable descriptors */			}		}	}}

⌨️ 快捷键说明

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