RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 789581
Accepted
Григорий
Григорий
Asked:2020-02-24 18:48:12 +0000 UTC2020-02-24 18:48:12 +0000 UTC 2020-02-24 18:48:12 +0000 UTC

accept() c++ 套接字的问题

  • 772

主要的

...
CreateListenSocket();
Accept();
...

服务器.cpp

...
void MCServer::CreateListenSocket() {
    // Create a socket and bound it as listening socket
    _ListenSocket = socket(AF_INET, SOCK_STREAM, 0);
    if (_ListenSocket == INVALID_SOCKET) {
        cerr << "Can't create a socket!\tError >> " << WSAGetLastError() << endl;
    }

    // Bind the ip address and port to a socket
    sockaddr_in hint = { 0 };
    hint.sin_family = AF_INET;
    hint.sin_port = htons(_port);
    hint.sin_addr.S_un.S_addr = INADDR_ANY;

    bind(_ListenSocket, (sockaddr*)&hint, sizeof(hint));

    // Tell Winsock the socket is for listening 
    listen(_ListenSocket, SOMAXCONN);
    cout << "Listen socket ready\t\tsocket: " << _ListenSocket << endl;
}
...
void MCServer::Accept() {
    _Client = accept(_ListenSocket, 0, 0);       //<<<<<<<<<< PROBLEM
}
...

服务器.h

class MCServer {
...
private:
    int                     _port;
    char*                   _buf;
    int                     _size = 4096;
    SOCKET                  _ListenSocket;
    SOCKET                  _Client;
    fstream                 _file;
    string                  _time;
    string                  _skt;
...

当服务器启动时,_Client被设置为正确的值。例如 128 或 126 或 132。达到

_Client = accept(_ListenSocket, 0, 0);

老实说等待传入的连接。当客户敲门时,它就起作用了。然后,当该客户端完成时,服务器关闭套接字并再次调用

...
CreateListenSocket();
Accept();
...

但是第二次到达

_Client = accept(_ListenSocket, 0, 0);

_Client 被分配了一个宇宙数字......就像 99895919816189 和accept()在它应该等待真正的呼叫时接受没有传入客户端的连接。但是客户端还没有连接。怎么了?

c++
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Григорий
    2020-02-24T21:10:14Z2020-02-24T21:10:14Z

    发现了一个bug,想分享。希望它可以帮助某人。调试器发现问题:

    返回 -1 函数bind(_ListenSocket, (sockaddr*)&hint, sizeof(hint));

    看了MSDN,找到了解决办法,需要配置这个功能:

    BOOL bOptVal = TRUE;
    int bOptLen = sizeof(BOOL);
    setsockopt(_ListenSocket, SOL_SOCKET, SO_REUSEADDR, (char*)&bOptVal, bOptLen);
    

    现在 bind() 可以绑定已经传输数据的套接字。

    但问题并没有消失。bind()、listen() 和 accept() 可以正常工作。accept() 按预期等待,但在新的传入连接上不接受它。什么都没发生。我最终发现了一个错误:在这里,用我自己的方法:

    void MCServer::Accept() {
        _Client = accept(_ListenSocket, 0, 0);       //<<<<<<<<<< PROBLEM
    }
    

    将新套接字分配给客户端后,我没有关闭“侦听端口”。当再次调用该方法时

    void MCServer::CreateListenSocket() {
        // Create a socket and bound it as listening socket
        _ListenSocket = socket(AF_INET, SOCK_STREAM, 0);
        if (_ListenSocket == INVALID_SOCKET) {
            cerr << "Can't create a socket!\tError >> " << WSAGetLastError() << endl;
        }
    
        // Bind the ip address and port to a socket
        sockaddr_in hint = { 0 };
        hint.sin_family = AF_INET;
        hint.sin_port = htons(_port);
        hint.sin_addr.S_un.S_addr = INADDR_ANY;
    
        bind(_ListenSocket, (sockaddr*)&hint, sizeof(hint));
    
        // Tell Winsock the socket is for listening 
        listen(_ListenSocket, SOMAXCONN);
        cout << "Listen socket ready\t\tsocket: " << _ListenSocket << endl;
    }
    

    我正在尝试重新分配一个已经在监听的套接字,而没有正确关闭它。

    解决方案是在每次 accept() 之后关闭“侦听端口”,或者不要尝试重新创建它。再次调用该方法CreateListenSocket();是错误的。

    • 0

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5