某国产linux(或者叫linux国内定制版)
用sudo运行程序,调用socket的bind()绑定127.0.0.1:8090,会报13号错误,permission denied。
但是用sudo -i成为root后再运行同样的代码,则成功。
用sudo gdb ./a.out也是成功的。
以上在bind()之前打印uid、gid、euid、egid都是0。
程序很简单,chatgpt提供的
#include <iostream>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
int main() {
int serverSocket, clientSocket;
struct sockaddr_in serverAddress, clientAddress;
socklen_t clientLength;
// 创建套接字
serverSocket = socket(AF_INET, SOCK_STREAM, 0);
if (serverSocket < 0) {
std::cerr << "无法创建套接字" << std::endl;
return 1;
}
// 设置服务器地址
serverAddress.sin_family = AF_INET;
serverAddress.sin_addr.s_addr = inet_addr("127.0.0.1");
serverAddress.sin_port = htons(8090);
// 将套接字绑定到服务器地址
if (bind(serverSocket, (struct sockaddr *)&serverAddress, sizeof(serverAddress)) < 0) {
std::cerr << "绑定失败" << std::endl;
return 1;
}
// 开始监听连接
if (listen(serverSocket, 5) < 0) {
std::cerr << "无法监听连接" << std::endl;
return 1;
}
std::cout << "正在监听端口 8090..." << std::endl;
while (true) {
// 接受客户端连接
clientLength = sizeof(clientAddress);
clientSocket = accept(serverSocket, (struct sockaddr *)&clientAddress, &clientLength);
if (clientSocket < 0) {
std::cerr << "无法接受客户端连接" << std::endl;
return 1;
}
std::cout << "收到来自 " << inet_ntoa(clientAddress.sin_addr) << " 的连接" << std::endl;
// 在此处可以处理客户端连接,例如读取/写入数据
// 关闭客户端套接字
close(clientSocket);
}
// 关闭服务器套接字
close(serverSocket);
return 0;
}
--
FROM 123.118.191.*