ZBLOG

error: ‘usockaddr’ was not declared in this scope

usockaddr 这个类型在标准的 C++ 和 POSIX socket 编程中并不存在。如果你的代码中使用了 usockaddr,很可能是一个拼写错误或者是自定义的结构体未包含头文件。

在 POSIX socket 编程中,你应该使用 sockaddr 或者 sockaddr_in (对于 IPv4) / sockaddr_in6 (对于 IPv6)。以下是一些示例修改,帮助你解决该错误:

修改代码

  1. 替换 usockaddr: 使用标准的 struct sockaddr 类型。

  2. 确保导入必要的头文件: 确保你的代码开头包含了必要的socket编程库头文件,如 <sys/socket.h><netinet/in.h><arpa/inet.h>

示例修正后的代码片段

假设你是在处理 TCP/IP 的情况下,下面是相应修改后的部分:

#include <iostream>
#include <cstring>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <pthread.h>

class HttpServer {
public:
    int Init(const int& port);
    void receive_response();
    ~HttpServer();

private:
    int listenfd_;
};

void* handle_request(void* arg) {
    int conn_fd = reinterpret_cast<int>(arg);
    // TODO: 添加请求处理逻辑
    close(conn_fd); // 完成后关闭连接
    return nullptr;
}

void HttpServer::receive_response() {
    fd_set lfdset;
    
    for (;;) {
        FD_ZERO(&lfdset);
        int maxfd = listenfd_; // 使用listenfd_作为最大文件描述符
        if (listenfd_ != -1) {
            FD_SET(listenfd_, &lfdset);
        }

        if (select(maxfd + 1, &lfdset, nullptr, nullptr, nullptr) < 0) {
            perror("select");
            exit(1);
        }

        struct sockaddr_in usa; // 使用 sockaddr_in 而不是 usockaddr
        socklen_t sz = sizeof(usa);

        if (listenfd_ != -1 && FD_ISSET(listenfd_, &lfdset)) {
            int conn_fd = accept(listenfd_, reinterpret_cast<struct sockaddr*>(&usa), &sz);
            if (conn_fd >= 0) {
                pthread_t thread;
                if (pthread_create(&thread, nullptr, handle_request, reinterpret_cast<void*>(conn_fd)) != 0) {
                    perror("Failed to create thread");
                    close(conn_fd);
                } else {
                    pthread_detach(thread); // 分离线程以避免内存泄漏 
                }
            } else {
                perror("accept error");
            }
        }
    }
}

int HttpServer::Init(const int& port) {
    struct sockaddr_in srv_addr;
    
	listenfd_ = socket(AF_INET, SOCK_STREAM, 0);
	if (listenfd_ < 0) {
		perror("Socket creation failed");
		return -1;
	}

	int opt = 1; 
	if (setsockopt(listenfd_, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) == -1) {
		perror("setsockopt error");
		close(listenfd_);
		return -1;
	}

	memset(&srv_addr, 0, sizeof(srv_addr));
	srv_addr.sin_family = AF_INET;
	srv_addr.sin_port = htons(port); 
	srv_addr.sin_addr.s_addr = htonl(INADDR_ANY);

	if (bind(listenfd_, reinterpret_cast<struct sockaddr*>(&srv_addr), sizeof(srv_addr)) == -1) {
		perror("bind error");
		close(listenfd_);
		return -1;
	}

	if (listen(listenfd_, SOMAXCONN) == -1) { // 使用 SOMAXCONN 替代硬编码数字128
		perror("listen error");
		close(listenfd_);
		return -1;
	}

	return 0;
}

HttpServer::~HttpServer() {
	close(listenfd_);
}

总结

  • 确保替换所有出现的 usockaddr 为合适的标准类型。
  • 在进行网络编程时,需要注意各种类型和函数调用中的参数匹配。
  • 调试时,如果有其他相关错误,请一并检查。

如果你还有其他问题或需要进一步解释,请随时问我!


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=6514

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?