我有 3 个套接字侦听来自同一 IP(10080、20081、30082)的不同端口。我已经在不同的线程(实际上是 pthreads)中创建了套接字并绑定了它等等。当我执行 Accept() 时,3 个套接字等待客户端调用,但是当我对任何端口进行调用时,总是回答发出最后一个 Accept() 的套接字。
这是我的过程(C++):
线程 1
为端口 10080 创建套接字
为端口 10080 绑定套接字
监听 10080 端口
接受端口 10080
..................................................... .....................
线程 2
为端口 20081 创建套接字
为端口 20081 绑定套接字
监听 20081 端口
接受端口 20081
..................................................... .....................
线程 3
为端口 30082 创建套接字
为端口 30082 绑定套接字
监听 30082 端口
接受端口 30082
..................................................... .....................
不管我调用哪个端口(10080、20081 或 30082)总是继续处理“线程 3”。
任何人都可以帮助我处理正确线程中的信息吗?
谢谢。
PS:我正在监视主套接字中的端口以及Accept()指令创建的套接字中的端口,并且主套接字仍然正确(30082)并且Accept套接字具有被调用端口(10080、20081或30082 )。
struct addrinfo lRequestAddrInfo;
struct addrinfo * lResultAddrInfo;
int lSocketOption = 1;
memset(&lRequestAddrInfo,0,sizeof(lRequestAddrInfo));
lRequestAddrInfo.ai_socktype=SOCK_STREAM;
lRequestAddrInfo.ai_flags=AI_PASSIVE;
int lReturn = 0;
lReturn = getaddrinfo(lAddress->ip.c_str(), lAddress->port.c_str(), &lRequestAddrInfo, &lResultAddrInfo);
int lSocket = socket(lResultAddrInfo->ai_family, SOCK_STREAM, lResultAddrInfo->ai_protocol);
setsockopt(lSocket, SOL_SOCKET, SO_REUSEADDR, &lSocketOption, sizeof(lSocketOption));
lReturn = bind(lSocket, lResultAddrInfo->ai_addr, lResultAddrInfo->ai_addrlen);
lReturn = listen(lSocket, SOMAXCONN);
while(IsConnected())
{
struct sockaddr lSocketAddress;
socklen_t lSocketAddresslen = sizeof(lSocketAddress);
lNewSocket = accept(pListener->_connection, &lSocketAddress, &lSocketAddresslen);
if (lNewSocket > -1)
{
//process information in new thread
}
}
这是线程内部的代码。更多信息:
线程 1
lSocket = 3(端口 10080)
线程 2
lSocket = 5(端口 20081)
线程 3
lSocket = 7(端口 30082)
当我在 10080 港口停靠时
lSocket = 7(端口 30082) lNewSocket = 4(端口 10080)
当我在 20081 港口停靠时
lSocket = 7(端口 30082) lNewSocket = 6(端口 20081)
当我在 30082 港口停靠时
lSocket = 7(端口 30082) lNewSocket = 8(端口 30082)