Socket中的bind函数与C++11中的std::bind冲突

1、解决方案

该函数是绑定Socket, 而在C++11中增加了std::bind(_Fp &&__f, _BoundArgs &&__bound_args…) 函数, 可以用该函数绑定函数指针, 当在C++类中添加了using namespace std;之后,如果你想调用socket.h中的bind方法则会出现问题, 使得bind函数调用不是你想要的行为。解决方案是在使用socket.h的bind函数的类中不要使用using namespace std

还可以这样 ::bind 调用 socket函数, 这样就不会调用std里的了
原文:https://blog.csdn.net/dstangrui/article/details/53540265

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++,可以使用socket和HTTP协议库来实现接收客户端发来的POST请求。 首先,创建一个socket连接并监听客户端请求: ```cpp #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> int main() { // 创建socket int server_fd = socket(AF_INET, SOCK_STREAM, 0); // 绑定IP地址和端口号 struct sockaddr_in server_addr; server_addr.sin_family = AF_INET; server_addr.sin_port = htons(8080); // 端口号 server_addr.sin_addr.s_addr = INADDR_ANY; bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)); // 监听客户端请求 listen(server_fd, 5); // 接收客户端请求 struct sockaddr_in client_addr; socklen_t client_addrlen = sizeof(client_addr); int client_fd = accept(server_fd, (struct sockaddr*)&client_addr, &client_addrlen); } ``` 接下来,读取客户端发来的POST请求,并解析请求头和请求体: ```cpp #include <sstream> // 读取数据 std::stringstream ss; char buffer[1024]; int len; while ((len = recv(client_fd, buffer, 1024, 0)) > 0) { ss << buffer; } std::string request = ss.str(); std::string request_header = request.substr(0, request.find("\r\n\r\n")); //请求头 std::string request_body = request.substr(request.find("\r\n\r\n") + 4); //请求体 ``` 根据HTTP协议规定,POST请求的请求体通常包含表单数据,需要对其进行解析。这里可以使用第三方库来实现。 例如,使用cpp-httplib库: ```cpp #include "httplib.h" // 解析请求体 httplib::Params params; httplib::parse_multipart_formdata(request_body, "boundary", params); ``` 最后,返回响应给客户端: ```cpp // 返回响应 std::string response_body = "Hello World!"; std::stringstream response; response << "HTTP/1.1 200 OK\r\n"; response << "Content-Type: text/html; charset=UTF-8\r\n"; response << "Content-Length: " << response_body.length() << "\r\n"; response << "\r\n"; response << response_body; send(client_fd, response.str().c_str(), response.str().length(), 0); ``` 完整代码如下: ```cpp #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include "httplib.h" int main() { // 创建socket int server_fd = socket(AF_INET, SOCK_STREAM, 0); // 绑定IP地址和端口号 struct sockaddr_in server_addr; server_addr.sin_family = AF_INET; server_addr.sin_port = htons(8080); // 端口号 server_addr.sin_addr.s_addr = INADDR_ANY; bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)); // 监听客户端请求 listen(server_fd, 5); // 接收客户端请求 struct sockaddr_in client_addr; socklen_t client_addrlen = sizeof(client_addr); int client_fd = accept(server_fd, (struct sockaddr*)&client_addr, &client_addrlen); // 读取数据 std::stringstream ss; char buffer[1024]; int len; while ((len = recv(client_fd, buffer, 1024, 0)) > 0) { ss << buffer; } std::string request = ss.str(); std::string request_header = request.substr(0, request.find("\r\n\r\n")); //请求头 std::string request_body = request.substr(request.find("\r\n\r\n") + 4); //请求体 // 解析请求体 httplib::Params params; httplib::parse_multipart_formdata(request_body, "boundary", params); for (const auto& param : params) { std::cout << param.first << " = " << param.second << std::endl; } // 返回响应 std::string response_body = "Hello World!"; std::stringstream response; response << "HTTP/1.1 200 OK\r\n"; response << "Content-Type: text/html; charset=UTF-8\r\n"; response << "Content-Length: " << response_body.length() << "\r\n"; response << "\r\n"; response << response_body; send(client_fd, response.str().c_str(), response.str().length(), 0); // 关闭socket连接 close(client_fd); close(server_fd); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值