linux套接字端口,多端口监听套接字linux(multiport listening socket linux)

多端口监听套接字linux(multiport listening socket linux)

我正在用C(linux)编写一个多线程服务器应用程序,它必须监听2个不同的端口号,例如监听端口号3000和4000,以便连接到它的不同客户端提供不同的功能(实际功能由工作人员执行线程,主线程无限期地运行,并在新连接时产生新工作者)。 我不确定select是否会在这里工作,因为我们可以有多个套接字连接,但都与相同的端口号相关联。 我试着依次绑定到sock_1和sock_2。 当我运行client_1时,一切都按预期工作。 但是,当我运行client_2时,在客户端的connect()上出现错误。 如果select()可以在这里使用,请告诉我该怎么做。 任何帮助非常感谢! 谢谢 !

(PS sock_1表示端口号3000,sock_2表示端口号4000,client_1表示从3000端口寻求服务的客户端,client_2表示客户端从4000号端口向同一服务器寻求服务)

I am writing a multithreaded server application, in C (linux), that must listen to 2 different port numbers, say listen to port no 3000 and 4000, for different clients connecting to it to serve different functionality (actual function is executed by a worker thread, main thread runs indefinitely and spawns of new workers upon new connections). I am not sure if select would work here as we can have multiple socket connections but all associated with same port number. I tried sequentially binding to sock_1 and sock_2. When I run client_1, everything works as expected. But, when I run client_2, I get an error on connect() from client side. If select() can be used here, please let me know how to do it. Any help much appreciated ! Thanks !

(P.S sock_1 refers to port no 3000 and sock_2 refers to port no 4000, client_1 refers to client thats seeking service from port 3000 and client_2 refers to client seeking service from same server from port no 4000)

原文:https://stackoverflow.com/questions/12740609

更新时间:2019-12-27 06:40

最满意答案

你完全误解了套接字和端口,这两个是不同的东西。 一个端口可以有多个套接字。 但是您可以将您的列表套接字(被动套接字)绑定到单个端口。 在进一步阅读本文之前

如果您希望您的应用程序在两个不同的端口上侦听,您是否需要将两个不同的套接字绑定在一起。

对于快速参考,单个进程中的选择最多只能有1024个套接字描述符。 所以如果你使用单一的进程模型,那么一个select只能处理1024个连接。 还请阅读C10k问题,看看有什么适合您的需求。

You have totally misunderstood socket and port, these two are different things. A port can have multiple sockets. but you can bind your listing socket(passive socket) to only a single port. Before going any further read this

If you want that your application listen on two different ports, have you bind two different sockets with it.

For a Quick reference a select in single process can only have upto 1024 socket descriptors. So if you are using a single process model then a select can only handle 1024 connections. Also read C10k problem see what suits your need.

2017-05-23

相关问答

google了一下这个问题,原文是:VSFTPD我是自己编译的,在论坛上许多文章说是编译使用的是XINETD模式,所以只要在/etc/xinet d.d/vsftpd文件中,把disable=no改成YES就行了! 还有就是在/etc/vsftpd.conf文件添加listen=yes这样就改成了STANDALONE独立模式! 500 OOPS: could not bind listening IPv4 socket 错误: 因为xinetd已经启动了vsftpd,而vsftpd设置成了star

...

现代版本的socat为此提供了一个ABSTRACT命名空间。 引自手册 : 摘要-CONNECT: 摘要-LISTEN: 摘要-SENDTO: 摘要-recvfrom的: 摘要-RECV: 摘要-CLIENT: ABSTRACT地址几乎与相关的UNIX地址相同,只是它们不是基于文件系统的套接字,而是备用的UNIX域地址空间。 为了实现这一点,套接字地址字符串在内部以“\ 0”为前缀。 此功能在Linux上可用(仅限?)。 选项组与相关的U

...

当然有,只需在套接字上设置SO_REUSEADDR SOL_SOCKET级别选项即可。 int yes = 1;

if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof yes))

perror("setsockopt");

Sure there is, just set the SO_REUSEADDR SOL_SOCKET level option on the socket. int yes = 1;

if (setsock

...

如果fork()然后在子进程中接受(),则只有一个子进程在连接上调用accept()然后处理它。 这是预分叉,并且不会在孩子之间共享连接。 您可以通过撤消订单以及接受和分叉来为每个连接方案执行标准的一个子项。 然而,这两种技术都用于效率,平衡等,而不是用于共享特定连接。 TCP与UDP不同。 在TCP中这样做是不明智的,因为你几乎肯定会弄得一团糟。 给定的接收消息可以分布在一个或多个数据包上,对于多个进程进行协调比让一个子进程处理连接更麻烦。 If you fork() and then acce

...

你完全误解了套接字和端口,这两个是不同的东西。 一个端口可以有多个套接字。 但是您可以将您的列表套接字(被动套接字)绑定到单个端口。 在进一步阅读本文之前 如果您希望您的应用程序在两个不同的端口上侦听,您是否需要将两个不同的套接字绑定在一起。 对于快速参考,单个进程中的选择最多只能有1024个套接字描述符。 所以如果你使用单一的进程模型,那么一个select只能处理1024个连接。 还请阅读C10k问题,看看有什么适合您的需求。 You have totally misunderstood soc

...

如果这只是在调试时受到伤害,请使用sysinternals人员中的tcpview强制关闭套接字。 我假设它适用于您的平台,但我不确定。 如果您正在对任何套接字执行阻塞操作,请不要使用无限期超时。 根据我的经验,这可能会在多处理器计算机上造成奇怪的行为。 我不确定它是什么Windows服务器操作系统,但它是2003 Server之前的一个或两个版本。 而不是无限期超时,使用30到60秒的超时,然后重复等待。 如果您正在使用它们,这也适用于重叠的IO和IOCompletion端口。 如果这是一个应用程

...

一次性监听套接字并不罕见。 例如,FTP协议使用它们。 只需在所需的端口上创建一个新的侦听套接字(或让套接字决定它自己可以检索的端口),将其backlog设置为1,然后只需对其调用accept()并关闭它。 如果accept()接受客户端连接,它将返回用于与该客户端通信的新套接字句柄。 在此期间,您无需保持侦听套接字处于活动状态。 我不知道该操作的ICS等效性是什么,但在Indy中有一个TIdSimpleServer组件用于此目的(顺便说一下,Windows上的Skype使用Indy)。 One-

...

select()需要最大的fd + 1。 你给它最大的fd,未经修改。 如果您在Linux而不是Windows上看到此错误,则这是最可能的原因。 select() requires the largest fd+1. You give it the largest fd, unmodified. If you see this error on Linux and not Windows, this is the most likely cause.

使用select(2)调用来检查哪个fd可以读取。 来自调用的文件描述符可以在没有阻塞的情况下读取。 例如,对返回的fd上的accept()将立即创建一个新连接。 From Wake up thread blocked on accept() call I just used the shutdown() system call and it seems to work...

在netstat显示中查找处于CLOSE_WAIT状态的端口。 如果你看到很多,你的服务器有资源泄漏,这不是由于客户端。 相反,如果您在FIN_WAIT_1中有很多端口,则服务器正在关闭,但您的客户端不在。 这些都不是你正在寻找的东西,但他们暴露了同源错误。 如果可能的话,在接受的套接字上设置一个读取超时时间,并记录并关闭它们。 明智地选择超时间隔。 The solution was to use the ls command, as shown: ls -al /proc//fd

...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值