ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

LINUX--select服务器群发和回射

2021-02-21 09:30:36  阅读:161  来源: 互联网

标签:ser addr socket -- add fd LINUX include 群发


LINUX–select服务器群发和回射

#服务器
select()函数 控制文件描述符

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/select.h>
#include
#include
using namespace std;

vector vfds;
vector::iterator it;

typedef struct chat
{
char name[16] = { 0 };
char text[1024] = { 0 };

}CHAT_T;

int main()
{
int socket_fd = socket(AF_INET, SOCK_STREAM, 0);
if (socket_fd == -1)
{
perror(“socket:”);

}
struct sockaddr_in ser_add;
ser_add.sin_family = AF_INET;//ipv4
ser_add.sin_port = htons(8099);//转换为网络字节序
//inet_aton("146.56.129.60", &ser_add.sin_addr.s_addr);
ser_add.sin_addr.s_addr = htonl(INADDR_ANY);//对接本地任意的空闲ip
//ser_add.sin_addr.s_addr = htonl();//对接本地任意的空闲ip146.56.129.60 
 // 设置套接字选项避免地址使用错误  
int on = 1;
if ((setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on))) < 0)
{
	perror("setsockopt failed");
	exit(EXIT_FAILURE);
}

int ret = bind(socket_fd, (struct sockaddr*)&ser_add, sizeof(ser_add));
if (ret == -1)
{
	perror("bind:");

}
ret = listen(socket_fd, SOMAXCONN);
if (ret == -1)
{
	perror("listen:");

}

char buff[1024] = { 0 };

fd_set set;//集合
fd_set allset;//集合
FD_SET(socket_fd,&allset);
int maxfd = socket_fd;


while (1)
{
	set = allset;//做备份
	cout << "wait for slect..." << endl;
	int nres = select(maxfd+1,&set,NULL,NULL,NULL);//管理fd
	cout << "slect is return :" <<nres<< endl;
	//select 返回有两种情况
	if (FD_ISSET(socket_fd,&set)) 
	{
		struct sockaddr_in cli_add;
		socklen_t addrlen = sizeof(cli_add);
		int con_fd = accept(socket_fd, (struct sockaddr*)&cli_add, &addrlen);
		vfds.push_back(con_fd);
		cout << "current vfds:" << vfds.size() << endl;
		cout << "someone online" << "con_fd:" << con_fd << endl;
		//把新的客户端的fd交给select来管理
		FD_SET(con_fd, &allset);
		if (con_fd>maxfd) 
		{
			maxfd = con_fd;
		}

	
	}
	else 
	{
		for (it=vfds.begin();it!=vfds.end();it++) 
		{
		
			if (FD_ISSET(*it,&set))
			{
				int r_size=read(*it, (CHAT_T*)buff, sizeof(CHAT_T));
				if (r_size==0) //有客户端断开
				{
					cout << "one client esc:" <<*it<< endl;
					//把客户端从集合里删除
					FD_CLR(*it, &allset);
					vfds.erase(it);//vecor 删除
					break;

				}
				printf("%ssay:%s", ((CHAT_T*)buff)->name, ((CHAT_T*)buff)->text);
				//cout << "accept buff=" << ((CHAT_T*)buff)->name <<((CHAT_T*)buff)->text<<endl;
				//write(*it, buff, r_size);//回射
				//群发动作
				for (it = vfds.begin(); it != vfds.end(); it++)
				{
					write(*it, (CHAT_T*)buff, r_size);
				
				}
				bzero(buff,sizeof(buff));
				break;
			}

		}
		
		
	}
	
	
	


}






return 0;

}

标签:ser,addr,socket,--,add,fd,LINUX,include,群发
来源: https://blog.csdn.net/z15005953031/article/details/113913828

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有