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> 调用接受方法的主要内容,如果未能解决你的问题,请参考以下文章
用于 Windows CE/Mobile 的 C++ 中的 HTTP Websockets 客户端库
Qt学习: 如何在Qt中使用全局变量!出现无法解析的命令的问题看过来!!