socket监听多个端口(socket监听多个端口 c)

http://www.itjxue.com  2023-01-27 19:00  来源:未知  点击次数: 

怎么利用完成端口监听多个不同端口的socket

就是把多个socket关联到完成端口上,关联的时候使用不同的上下文。然后完成端口的回调里面,通过分析上下文得知是哪个socket被调用。

java Socket编程中,为什么监听多个端口时出现有一个端口无法接受到信息,需要用到线程吗

您好,提问者:

其实线程的问题还是很难解决的,因为是随机的 。

但是也不是没有解决办法,是这样的,有些功能是必须用到线程的,如果不用线程的话,可能会有接收不到的数据、停止后台超时等错误,建议使用线程。。。

举例:比如坦克大战、扑克牌,不用线程是无法完成的,也不是无法完全,就是会数据接收不到。

rose策略监听多个端口应用吗

多年前开发了一套网络库,底层实现采用IOCP(完成端口)。该库已在公司多个程序中应用;经过多次修改,长时间检验,已经非常稳定高效。

最近把以前的代码梳理了一下,又加进了一些新的思路。代码结构更加合理,性能也有所提升。打算将该库一些的知识点写出来,以供参考。

服务端要在多个端口监听,这种场合并不多见。但作为一个完善的网络库,似乎有必要支持此功能的。

传统实现方法

如果监听端口个数很少,也可以采用传统的方法。因为accept函数是阻塞的,所以要实现在n个端口监听,就需要n个线程。如果监听端口个数不多,这也不是多大问题。如果监听端口多达几十个,这种方法就有些不妥。线程也是一种资源,线程过多占用资源会增加;也会导致系统负担加重。

更可行的实现方法

实现方法有些曲折,需要一步一步分析;基本的原理就是将socket句柄与事件(event)相关联。Windows有相关的函数可以对多个事件监听,当某个事件被触发,就知道相应的socket有事件到达。可以对该socket做accept,因为已经确定该socket有事件了,所以accept函数会立即返回。这样就达到对多个端口同时监听的目的。

C++ SOCKET编程,如何监听多个端口,比如监听两个端口,关键代码该怎么写,求教求教,求代码!

#include?stdio.h

#include?Winsock2.h

#include?process.h

#pragma?comment?(lib,?"Ws2_32.lib")

unsigned?int?__stdcall?listeningThread(void?*param)

{

SOCKET?sockSrv?=?socket(AF_INET,?SOCK_STREAM,?0);

SOCKADDR_IN?addrSrv;

addrSrv.sin_addr.S_un.S_addr?=?htonl(INADDR_ANY);

addrSrv.sin_family?=?AF_INET;

addrSrv.sin_port?=?htons((int)param);

int?ret?=?bind(sockSrv,?(SOCKADDR*)?addrSrv,?sizeof(SOCKADDR));

ret?=?listen(sockSrv,?5);

SOCKADDR_IN?addrClient;

int?len?=?sizeof(SOCKADDR);

while?(1)

{

SOCKET?sockConn?=?accept(sockSrv,?(SOCKADDR*)?addrClient,?len);

char?sendBuf?[]?=?"Hello?World?!";

send(sockConn,?sendBuf,?strlen(sendBuf)?+?1,?0);

char?recvBuf[50];

recv(sockConn,?recvBuf,?50,?0);

printf("%s\n",?recvBuf);

closesocket(sockConn);

}

return?0;

}

void?main()

{

WORD?wVersionRequested;

WSADATA?wsaData;

int?err;

wVersionRequested?=?MAKEWORD(2,?2);

err?=?WSAStartup(wVersionRequested,?wsaData);

if?(err?!=?0)?{

return;

}

_beginthreadex(NULL,?0,?listeningThread,?(void?*)?8120,?0,?NULL);

_beginthreadex(NULL,?0,?listeningThread,?(void?*)?8121,?0,?NULL);

Sleep(INFINITE);

}

这个是windows平台的,创建两个线程,分别处理两个监听端口,端口通过参数传进去

Rsyslog多个socket监听udp端口问题

近期在使用rsyslog-fwd和rsyslog-kafka做日志中转集群,3台4核8G虚拟机支撑峰值约70Krps,流量大概400M左右;

但好景不长,有个业务发现日志有丢失的情况,而且丢失很严重;暂将排查过程记录如下:

通过kafka的topic监控看数据根本就没写进来,可见问题出现rsyslog这一层;排查服务器监控后就更奇怪了,日志丢失的时间段内,rsyslog服务器的网卡流量也有降低,也就是日志没到rsyslog,再向前就说应用服务器了,但应用服务器rsyslog运行正常,而且也不可能同一时间点所有服务器都出现rsyslog故障吧?

排查中转集群上的rsyslog状态,也没有任何异常日志,中转集群上配置了很多imput和相应的rule,每次出问题的都是同一个imput,给rsyslog增加了pstats监控观察后也没有任何发现,在机器上排查时,无意发现以下信息:

通一个ipv4的11513端口,有两个socket在监听,其他正常的服务器都是1个,rsyslog为什么会拉起两个socket监听同一个端口呢?

在通过netstat查看发现第一个socket的Recv-Q长期为非0,且一直是这个值,也就是存在接收队列,难道是rsyslog性能问题? 回想故障的时间点也不像,发生故障的时间随机、不存在高峰期故障的特征

再通过/proc/net/udp可以看到第一行记录存在大量丢包的情况(最后一列)。

初步估计整个故障的流程如下:

根本原因还是在为什么新起了一个socket,还要继续排查

如何用SOCKET监听多个端口

这个是可以的吧,可以监听多个端口的,不过假如多个端口传输量大的话,很容易假死状态。

比如,你在服务器上可以上网80端口,可以上QQ:8000端口,可以上3389端口,可以开启21端口,可以TELENT等

(责任编辑:IT教学网)

更多

推荐数据库文章