我有3个套接字监听来自同一个IP的不同端口(10080,20081,30082)。我已经在不同的踏板中创建了套接字(实际上是p线程),并且绑定了它,等等。当我执行Accept()时,3个套接字等待客户端调用,但是当我对任何端口进行调用时,总是响应发出最后Accept()的套接字。
这就是我的过程(C++):
线程1
为端口10080创建套接字
端口10080的绑定套接字
监听端口10080
接受端口10080
.........................................................................
线程2
为端口20081创建套接字
端口20081的绑定套接字
监听端口20081
接受端口20081
.........................................................................
线程3
为端口30082创建套接字
端口30082的绑定套接字
监听端口30082
接受端口30082
.........................................................................
无论我调用哪个端口(10080、20081或30082),总是继续处理“线程3”。
有人能帮我在正确的线程中处理信息吗?
谢谢。
PS:我正在监视主套接字中的哪个端口和接受()指令创建的套接字中的端口,主套接字仍然正确(30082),接受套接字具有被调用的端口(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)
发布于 2012-06-12 10:26:38
终于我做到了!我在线程外部编写了套接字创建和侦听操作,在线程中编写了accept操作,在线程中编写了接受操作。
我希望这对其他人有帮助!
感谢你们的回答!
发布于 2012-06-08 09:12:23
我觉得你错过了代码的重要部分。因为您没有包括它,所以很难判断您是否使用了FD_SET()、FD_ISSET()和朋友。如果没有,那就确定你会得到奇怪的结果。我认为粘贴代码比用文字解释更容易。对我来说,类似的事情是这样的:
socket_descriptor=bindsock(thd);
while(true) {
fd_set rfs, wfs;
FD_ZERO(&rfs);
FD_ZERO(&wfs);
FD_SET(socket_descriptor,&rfs);
maxfd = conn_select(thd,&rfs, &wfs);
if (select(maxfd + 1, &rfs, &wfs, NULL, NULL) == -1) {
if (errno == EINTR) {
continue;
}
break;
}
if (FD_ISSET(socket_descriptor, &rfs)) {
thd->client_fd = accept(socket_descriptor, &thd->cliaddr,&clilen);……
功能的内部:
int
conn_select(struct THD*thd,fd_set * rfs, fd_set * wfs) {
int maxfd = -1;
size_t i;
DBUG_ENTER("conn_cullselect");
if (vector == NULL) {
DBUG_PRINT("info",("vector == NULL"));
DBUG_RETURN(0);
}
for (i = 0; i < MAX_CONNECTIONS; i++) {
conn_t *v;
if (vector[i] == NULL) {
DBUG_PRINT("info",("continue"));
continue;
}
v = vector[i];
switch (v->state) {
case AWAITING_REQUEST:
DBUG_PRINT("info",("AWAITING_REQUEST"));
if (maxfd < v->sd) {
maxfd = v->sd;
}
FD_SET(v->sd, rfs);
break;
case SENDING_FILE:
DBUG_PRINT("info",("SENDING_FILE"));
if (maxfd < v->fd) {
maxfd = v->fd;
}
FD_SET(v->fd, rfs);
break;
case SENDING_HEADER:
DBUG_PRINT("info",("SENDING_HEADER"));
if (maxfd < v->sd) {
maxfd = v->sd;
}
FD_SET(v->sd, wfs);
break;
}
}
DBUG_PRINT("info",("returning %d from conn_cullselect",maxfd));
DBUG_RETURN(maxfd);
}想法是一样的,而不是取决于您正在监听的端口数。
https://stackoverflow.com/questions/10945830
复制相似问题