【问题标题】:Port is listening but "No connection could be made because the target machine actively refused it "端口正在侦听,但“无法建立连接,因为目标机器主动拒绝它”
【发布时间】:2015-12-03 03:12:09
【问题描述】:

我有一个服务器/客户端程序。代码在几分钟前才起作用。运行几次后,突然报错10061,我用netstat -a -b 查看服务器端口是否被占用。但我明白了,这似乎没问题:

[System]
TCP     0.0.0.0:6666    Listening 

客户端代码:

SOCKET sendrecv;
sendrecv = InitClientSocket(serverIP, 6666);

ps。 ping serverIP 也可以。防火墙也关了。

SOCKET InitClientSocket(char *pHost, int iPort){
    struct sockaddr_in saClient;
    struct hostent *pHostinfo;
    SOCKET sock;

    WORD version;
    WSADATA WSAData;
    version=MAKEWORD(1,1);
    WSAStartup(version, &WSAData);

    sock=socket(AF_INET,SOCK_STREAM,0);
    if (sock ==SOCKET_ERROR){
        closesocket(sock);
        return 0;
    }

    pHostinfo=gethostbyname(pHost);
    if (pHostinfo==NULL){
        closesocket(sock);
        return 0;
    }

    saClient.sin_family=AF_INET;
    saClient.sin_addr=*((struct in_addr *)pHostinfo->h_addr);
    saClient.sin_port=htons(iPort);

    int nConnect=0;
    nConnect=connect(sock,(struct sockaddr *)&saClient, sizeof(saClient));
    if(nConnect == SOCKET_ERROR)    //Here comes the error 10061
    {
        int err = WSAGetLastError();
        closesocket(sock);
        return 0;
    }

    return sock;
}

新编辑-这是服务器代码的一部分:

SOCKET sock, sendrecv;
struct sockaddr_in sock_addr,sendrecv_addr;
WSADATA data;

WSAStartup( MAKEWORD(2,0), &data);
sock = WSASocket (AF_INET, SOCK_STREAM, 0, 0, 0, 0);

int nREUSEADDR = 1;
setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(const char*)&nREUSEADDR,sizeof(int)); 

sock_addr.sin_family=PF_INET;
sock_addr.sin_port=htons(6666);         
sock_addr.sin_addr.s_addr=INADDR_ANY;
bind(sock,(struct sockaddr*)&sock_addr,sizeof(struct sockaddr_in));
listen(sock,1);
int lun = sizeof (struct sockaddr);
sendrecv = accept(sock,(struct sockaddr*)&sendrecv_addr,&lun);

linger m_sLinger;
m_sLinger.l_onoff = 1; 
m_sLinger.l_linger = 0; 
setsockopt(sendrecv,SOL_SOCKET,SO_LINGER,(const char*)&m_sLinger,sizeof(linger));

【问题讨论】:

  • 而iPort的价值是什么?
  • @immibis SOCKET sendrecv; sendrecv = InitClientSocket(serverIP, 6666);
  • 使用 6666 端口你必须期待恶魔的干扰,它在 MSDN 上明确说明。
  • @MatteoItalia 但是我尝试了其他端口,例如 7777、8888,它们都只能工作一两次。现在我有很多端口正在监听但返回 10061 错误。
  • @MatteoItalia 是的,我的防火墙中阻止了 666 和 6666 :)

标签: c windows sockets


【解决方案1】:

Windows 服务器将在其侦听积压队列填满后开始拒绝连接。您的服务器接受的速度不够快,或者根本不接受。

【讨论】:

  • 请看我的新编辑。我贴出服务器端的相关代码。
猜你喜欢
  • 2011-08-24
  • 2023-03-25
  • 2015-04-05
  • 2016-12-08
  • 2014-09-05
  • 2017-06-01
  • 2016-08-10
  • 1970-01-01
相关资源
最近更新 更多