我知道服务器通常会打开一个端口并听取它。
今天我了解到系统类Unix中有一个函数select
。使用select
,我们可以收听多套接字。
我无法想象我们需要使用sudo apt-get -y update && sudo apt-get -y install git flex bison gcc automake pkg-config libtool libgcrypt-dev glib2.0-dev make libssl-dev libyajl-dev libcurl4-openssl-dev
git clone https://github.com/Stackdriver/collectd.git
cd collectd/
git checkout stackdriver-agent-5.5.0
./clean.sh && ./build.sh
./configure --prefix=/opt/stackdriver/collectd --program-prefix=stackdriver- --disable-all-plugins --enable-cpu --enable-df --enable-disk --enable-load --enable-logfile --enable-memory --enable-swap --enable-syslog --enable-interface --enable-tcpconns --enable-write_http --enable-write_gcm --disable-static --enable-aggregation --enable-csv --enable-nginx --enable-apache --enable-memcached --enable-mysql --enable-postgresql --disable-perl --without-libperl --without-perl-bindings --enable-mongodb --with-libmongoc=own --enable-plugin_mem --enable-processes --enable-ntpd --enable-zookeeper --enable-exec --enable-curl_json --enable-match_regex --enable-target_set --enable-match_throttle_metadata_keys --enable-target_replace --enable-target_scale --enable-debug --with-useragent="stackdriver_agent/myagent"
make
sudo make install
的情况。如果我们有两个套接字,这意味着我们正在监听两个端口,对吗?所以我有一个问题:
什么样的服务器可以打开多个端口但是接收和处理相同类型的请求?
答案 0 :(得分:4)
使用select
有助于处理多个套接字上的读写操作。它不必是多个服务器套接字。最典型的用途是复用大量客户端套接字。
您的服务器有一个侦听套接字。每次accept
连接时,都会将新客户端套接字添加到多路复用池。 select
然后在任何这些套接字都有可读数据时返回。最大的胜利是你用一个线程做这一切。
答案 1 :(得分:0)
嗯...记住 ports 和套接字之间的区别。
“端口”就像电话号码。但是一个电话号码可以处理任意数量的“电话!”
然后,“套接字”表示单个电话呼叫:此服务器与特定客户端之间当前活动的连接。根据定义,每个连接“都在特定端口上发生”,但任何数量的连接可能同时存在。
(“接受”操作对应于:拿起电话。)
那么,select()
购买的是能够一次监控任意数量的套接字的能力。它会检查所有套接字,等待(如果需要),以便在其中任何一个上发生某些事情,并向您返回一条消息。现在,您的服务器设计变成了“一个简单的循环”。无论您正在收听多少个套接字,无论有多少套接收消息,select()
都会一次向您发送一条消息
基本上情况是“每个服务器都会在其核心使用select()
循环,除非有一个非常好的理由不。
答案 2 :(得分:0)
您还可以在侦听(服务器)套接字上accept
编辑每个连接的套接字。
select
这些(客户端)套接字和服务器socket
(可读=>新连接)允许您有效地编写聊天服务器等应用。
答案 3 :(得分:0)
看看这里:
编写网络服务器的一种传统方法是使用main 服务器块在accept()上,等待连接。一旦连接 进来,服务器fork()s,子进程处理连接 并且主服务器能够为新的传入请求提供服务。
使用select(),而不是每个请求都有一个进程 通常只有一个进程“多路复用”所有请求,服务 每个请求都尽可能多。
因此使用select()的一个主要优点是您的服务器只会 需要一个进程来处理所有请求。因此,您的服务器 不需要共享内存或同步原语 沟通的不同“任务”。
使用select()的一个主要缺点是你的服务器不能 就像只有一个客户端一样,就像fork()解决方案一样。对于 例如,使用fork()'解决方案,在服务器fork()之后,使用 子进程与客户端一起工作,就好像只有一个客户端一样 宇宙 - 孩子不必担心新来的 连接或其他套接字的存在。用select(),. 编程不是那么透明。