C/C++ [ Websockets ] 无法解析从 <sys/socket.h> 调用接受方法

Posted

技术标签:

【中文标题】C/C++ [ Websockets ] 无法解析从 <sys/socket.h> 调用接受方法【英文标题】:C/C++ [ Websockets ] non resolving calling to accept method from <sys/socket.h> 【发布时间】:2021-06-19 16:14:22 【问题描述】:

您好,我创建了一个管理套接字流的 Websocket 类。 它旨在使以下内容与套接字一起使用:

openSocket() bindSocket() listen()accept()方法调用问题来了!
#include <netinet/in.h>

class Websocket

private:
    static const int domain = AF_INET;
    static const int type = SOCK_STREAM;
    static const auto internetAddressIntegers = INADDR_ANY;

    void openSocket();
    void bindSocket();
    int socketFileDescriptor;

public:
    Websocket(int port);
    bool connect();
    bool disconnect();
    void listen();

    int port;
    struct sockaddr_in address;
;
#include "Websocket.h"

#include <sys/socket.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>

Websocket::Websocket(int port)

    this->port = port;
    this->address.sin_family = this->domain;
    this->address.sin_addr.s_addr = this->internetAddressIntegers;
    this->address.sin_port = htons(this->port);


bool Websocket::connect()

    this->openSocket();
    this->bindSocket();
    return true;


bool Websocket::disconnect()

    return close(this->socketFileDescriptor);


void Websocket::openSocket()

    this->socketFileDescriptor = socket(this->domain, this->type, 0);

    if (this->socketFileDescriptor < 0)
        perror("ERROR on opening");

    printf("Socket opened \n");


void Websocket::bindSocket()

    bzero((char *) &this->address, sizeof(this->address));

    if (bind(this->socketFileDescriptor, (struct sockaddr *) &this->address, sizeof(this->address)) < 0)
        perror("ERROR on binding");

    printf("Socket have been bound successfully \n");
    ::listen(this->socketFileDescriptor, 5);


void Websocket::listen()

    printf("Listen method \n");
    socklen_t socketLen = sizeof(this->address);
     // The program does not advance after this line
    int newSocketFileDescriptor = accept(this->socketFileDescriptor, (struct sockaddr *) &this->address, &socketLen);

    if (newSocketFileDescriptor < 0)
        perror("ERROR on listening");

    printf("Socket listening on port %i \n", this->port);

    while(true)
    
        char buffer[256];
        bzero(buffer, 256);
        int socketMessage = read(newSocketFileDescriptor, buffer, 255);

        if (socketMessage < 0)
            perror("ERROR reading from socket");

        printf("Message receive: %s \n", buffer);
    


#include "socket/Websocket.h"
#include <stdio.h>

#define PORT 9117

int main(int argc, char *argv[])

    printf("Program started \n");

    Websocket websocket(PORT);
    websocket.connect();
    websocket.listen();

    printf("Finish program... \n");

    return 0;

我无法弄清楚为什么在监听方法上接受调用不起作用。调用 accept 方法时程序流程停止。 我关注了这个文档https://pubs.opengroup.org/onlinepubs/7908799/xns/accept.html

【问题讨论】:

“不工作”是什么意思? 对不起,也许最好说:它不起作用。调用接受方法时程序不会继续执行。 好的,你能证明什么记录了到套接字正在等待的端口的连接尝试? accept() 在连接被接受之前不会返回,那么你为什么期望它返回呢? the accepting call is not working “不工作”是什么意思?发生什么了?什么不会发生?你期望会发生什么?程序输出是什么?你期望程序输出什么? The program doesn't continue executing 你用的是什么平台(windows/linux)?它是否收到信号,如果收到,是哪个?你调试过你的程序吗? 你知道accept 是一个阻塞调用(除非套接字本身是非阻塞的),对吧?还是我误会了? 【参考方案1】:

Websocket 构造函数中正确设置address 后,你在bindSocket 中通过调用破坏了它

    bzero((char *) &this->address, sizeof(this->address));

- 删除它,您的程序将侦听正确的端口。

【讨论】:

以上是关于C/C++ [ Websockets ] 无法解析从 <sys/socket.h> 调用接受方法的主要内容,如果未能解决你的问题,请参考以下文章

WebSockets 和 Socket.io 有啥区别?

用于 Windows CE/Mobile 的 C++ 中的 HTTP Websockets 客户端库

Qt学习: 如何在Qt中使用全局变量!出现无法解析的命令的问题看过来!!

棘轮和 Websockets - 无法正常工作

C/C++ 使用 tinyxml库 操作XML格式文件(创建插入删除修改解析)

C/C++ 使用 tinyxml库 操作XML格式文件(创建插入删除修改解析)