socket监听多个端口(socket监听多个端口 c)
怎么利用完成端口监听多个不同端口的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等