栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

基于select的回射服务器

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

基于select的回射服务器

server
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include  //exit
#define MAXLINE 1024
int main()
{
	int i, maxi, maxfd, listenfd, connfd, sockfd;
	int nready, client[FD_SETSIZE];
	ssize_t n;
	fd_set rset, allset;
	char buf[MAXLINE];
	socklen_t clilen;
	struct sockaddr_in cliaddr, servaddr;
	int result;

	listenfd = socket(AF_INET, SOCK_STREAM, 0); //建立服务器端socket
	bzero(&servaddr, sizeof(servaddr));
	servaddr.sin_family = AF_INET;
	servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
	servaddr.sin_port = htons(9734);

	bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
	if (listen(listenfd, 5) == -1)
		exit(0);

	maxfd = listenfd; 
	maxi = -1;		  
	for (i = 0; i < FD_SETSIZE; i++)
		client[i] = -1; 
	FD_ZERO(&allset);
	FD_SET(listenfd, &allset); //将服务器端socket加入到集合中

	while (1)
	{
		rset = allset;										 
		nready = select(maxfd + 1, &rset, NULL, NULL, NULL); // nready储存所有描述符集已就绪的总位数
		if (nready < 1)
		{
			perror("server5");
			exit(1);
		}

		if (FD_ISSET(listenfd, &rset))
		{ 
			clilen = sizeof(cliaddr);
			connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &clilen);
			printf("new client: %s, port %dn",
				   inet_ntop(AF_INET, &cliaddr.sin_addr, NULL, 4),
				   ntohs(cliaddr.sin_port)); //输出新连接的地址信息和端口号

			for (i = 0; i < FD_SETSIZE; i++)
				//将第一个-1的client[i]取出来存connfd
				if (client[i] < 0)
				{
					client[i] = connfd; 
					break;
				}
			if (i == FD_SETSIZE)
				if (i == FD_SETSIZE)
					// FD_SETSIZE个的set都用完了,客户端连接过多了。
					perror("too many clients");

			FD_SET(connfd, &allset); 
			if (connfd > maxfd)
				maxfd = connfd; 
			if (i > maxi)
				maxi = i; 

			if (--nready <= 0)
				continue; 
		}
		for (i = 0; i <= maxi; i++) {	
			if ( (sockfd = client[i]) < 0)
				continue;//若client[i]=-1 继续循环
			if (FD_ISSET(sockfd, &rset)) {
				if ( (n = read(sockfd, buf, MAXLINE)) == 0) {
						
					close(sockfd);
					FD_CLR(sockfd, &allset);
					client[i] = -1;
				} else
					write(sockfd, buf, n);

				if (--nready <= 0)
					break;				
			}
		}
	}
}
client
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include  //exit
#include 
#define MAXLINE 1024
int main()
{
    int client_sockfd;
    int len;
    struct sockaddr_in server; //服务器端网络地址结构体
    int result;
    char recvline[MAXLINE], sendline[MAXLINE];
    client_sockfd = socket(AF_INET, SOCK_STREAM, 0); //建立客户端socket
    // memset(&client_sockfd, 0, sizeof(sockaddr));
    server.sin_family = AF_INET;
    inet_pton(AF_INET, "127.0.0.1", &server.sin_addr);
    server.sin_port = htons(9734);

    len = sizeof(server);
    if (connect(client_sockfd, (struct sockaddr *)&server, len) == -1)
    {
        perror("oops: client2");
        exit(1);
    }

    while (1)
    {
        fgets(sendline, 1024, stdin);

        if ((send(client_sockfd, sendline, strlen(sendline), 0)) < 0)
        {
            printf("send mes error: %s errno : %d", strerror(errno), errno);
            exit(0);
        }
        int n = recv(client_sockfd, &recvline, MAXLINE, 0);
        recvline[n] = '';
        printf("recv msg from server:%s", recvline);
    }
    close(client_sockfd);
    exit(0);
}
结果

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/706102.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号