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

📄 ioserver.c

📁 linux下实现IO通信
💻 C
字号:
#include <stdio.h>#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#define PORT	1234#define BACKLOG	5#define MAXDATASIZE	1000typedef struct _CLINET {	int 		fd;	char		*name;	struct	sockaddr_in	addr;	char		*data;}CLIENT;void savedata(char *recvbuf, int len, char *data){	static int index=0;        int i;	for(i=0;i<len-1;i++)	{		data[index++] = recvbuf[i];			}	data[index] = '\0';//	printf("Message is : %s  from %s \n", data, inet_ntoa(client[i].addr.sin_addr));//printf("Client (%s) closed connection. User data: %s\n", client[i].name, client[i].data);}void process_cli(CLIENT *client, char *recvbuf, int len){		savedata(recvbuf, len, client->data);		send(client->fd, recvbuf, MAXDATASIZE, 0);}int main(void) {	int i, maxi, maxfd, sockfd;	int nready;	int n;	fd_set rset, allset;	int listenfd, connectfd;	struct sockaddr_in  server;	CLIENT  client[FD_SETSIZE];	char recvbuf[MAXDATASIZE];	int sin_size;		/* Create TCP socket */          if((listenfd=socket(AF_INET, SOCK_STREAM, 0))==-1)	{		perror("Create socket failed");		exit(-1);	}	/* Bind address */	int opt = SO_REUSEADDR;	setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));        bzero(&rset,sizeof(rset));        bzero(&allset,sizeof(allset));	bzero(&server, sizeof(server));	bzero(client, FD_SETSIZE);	bzero(recvbuf,MAXDATASIZE);	server.sin_family = AF_INET;	server.sin_port = htons(PORT);	server.sin_addr.s_addr = htonl(INADDR_ANY);	if (bind(listenfd, (struct sockaddr *)&server, sizeof(struct sockaddr))==-1) {		perror("Bind error.");		exit(-1);	}	/* Listen socket listenfd */	if (listen(listenfd, BACKLOG) == -1) {		perror("listen error");		exit(-1);	}	sin_size = sizeof(struct sockaddr_in);	maxfd = listenfd; 	maxi = -1;	for (i =0; i< FD_SETSIZE; i++)		client[i].fd = -1;	FD_ZERO(&allset);	FD_SET(listenfd, &allset);	while (1) {		struct sockaddr_in addr;		bzero(&addr, sizeof(addr));		rset = allset;		nready = select (maxfd+1, &rset, NULL, NULL, NULL);   		if (FD_ISSET(listenfd, &rset)) {			if ((connectfd = accept(listenfd, (struct sockaddr *)&addr, &sin_size)) == -1)  {			perror("accept error");				continue;			}				for (i = 0; i < FD_SETSIZE; i++) 				if (client[i].fd < 0) {					client[i].fd = connectfd;  					client[i].name = (char*)malloc(MAXDATASIZE);					client[i].addr = addr;					client[i].data = (char*)malloc(MAXDATASIZE);					client[i].name[0] = '\0';					client[i].data[0] = '\0';					printf("You got a connect from %s. And the port is %d\n", inet_ntoa(client[i].addr.sin_addr), ntohs(client[i].addr.sin_port));  					break;				  }			if (i == FD_SETSIZE)    printf("too many cllients.\n");			FD_SET(connectfd, &allset);			if (connectfd > maxfd)   maxfd = connectfd;			if (i > maxi)   maxi =i;			if ( -- nready <=0) continue;  /*可以省略?*/		}  /* if (FD_ISSET (listenfd… */		for (i = 0; i <= maxi; i++)  {			if ((sockfd = client[i].fd) < 0)    continue;			if (FD_ISSET(sockfd, &rset)) {				if (( n = recv(sockfd, recvbuf, MAXDATASIZE, 0)) ==0)  {					close(sockfd);					printf("Client (%s) closed connection. User data: %s\n", client[i].name, client[i].data);					FD_CLR(sockfd, &allset);					client[i].fd = -1;					free(client[i].name);					free(client[i].data);				} else 					process_cli(&client[i], recvbuf, n);					//printf("Client (%s) closed connection. User data: %s\n", client[i].name, client[i].data);				if ( --nready <=0 )  break;    /*???*/			}  /* if (FD_ISSET(sockfd, &rset))  */		} /* for(i = 0; i <= maxi; i++)   */	}  /* while(1); */	close(listenfd);}

⌨️ 快捷键说明

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