什么样的服务器需要选择

时间:2016-06-24 22:03:13

标签: linux sockets unix server

我知道服务器通常会打开一个端口并听取它。

今天我了解到系统类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 的情况。如果我们有两个套接字,这意味着我们正在监听两个端口,对吗?所以我有一个问题:
什么样的服务器可以打开多个端口但是接收和处理相同类型的请求?

4 个答案:

答案 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(),.   编程不是那么透明。

http://www.lowtek.com/sockets/select.html