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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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平台的,创建两个线程,分别处理两个监听端口,端口通过参数传进去

追问

C++ SOCKET编程两个线程通讯互传数据怎么做,这两个线程间的数据需要互传,就是一个收的要给另一个发,一个发的要给另一个收,想不明白应该怎么做了

参考技术A 考虑用select系统调用吧,具体例子请自己找找

#include <sys/select.h>

int select(int maxfdp1, fd_set *restrict readfds,
fd_set *restrict writefds, fd_set
*restrict exceptfds,
struct timeval *restrict tvptr);追问

C++ SOCKET编程两个线程通讯互传数据怎么做,这两个线程间的数据需要互传,就是一个收的要给另一个发,一个发的要给另一个收,想不明白应该怎么做了

追答

线程共用进程地址空间,直接共用一个内存块或者容器就可以了。

需要处理好并发问题,即发和收从这个内存块和容器读或写的操作不能并发。

例如,共用一个队列queue,收到的线程放到队列中,发的线程从队列中取。

本回答被提问者采纳

wriesharek同时监听多个端口

之前的文章《wireshark解析自定义的protobuf协议》 ,当时只监听了一个端口,而如果游戏同时有二个 socket 连接,比如一个是网关另外一个是其它的,怎么办呢?

for i,port in ipairs(tcp_port) do
        tcp_port_table:add(port, m_MeteoricProto)
 end

参考链接:https://wiki.wireshark.org/Lua/Examples#Using_Lua_to_register_protocols_to_more_ports

 

 

 

wiresharek 的过滤条件可以这样写:

(ip.dst == 192.168.xx.xx or ip.src == 192.168.xx.xx) && tcp.len > 0

这样显示的基本上就是自定义解析的 socket 消息了,关于过滤条件,更多详情可参考官网:

https://wiki.wireshark.org/DisplayFilters

 

第一个问题,监听多个端口,查官方文档没找到答案。

image

 

https://wiki.wireshark.org/LuaAPI/Dissector#dissectortable:add.28pattern.2C_dissector.29

追踪到源码也不是太理解

image

https://github.com/wireshark/wireshark/blob/master/epan/wslua/wslua_dissector.c

 

之后测试发现,下面二种方式也是可以的,一种表示范围,另一种表示多个端口,与用for循环的效果一样。

tcp_port_table:add("8002-8004", m_MeteoricProto)

tcp_port_table:add("8002,8003,8004", m_MeteoricProto)

以上是关于C++ SOCKET编程,如何监听多个端口,比如监听两个端口,关键代码该怎么写,求教求教,求代码!的主要内容,如果未能解决你的问题,请参考以下文章

Linux之C++ socket通信编程

SOCKET编程之一个端口如何建立多个TCP连接?(用fork子进程selectpollepoll都是可以的)一个端口最大支持建立多少个tcp连接?

如何使用 QTcpSocket 监听 qt 中的特定端口? [复制]

socket如何监听

wriesharek同时监听多个端口

C++ UDP Socket端口复用