在您的代码中,您使用了 bind()
和 listen()
来设置一个监听套接字,然后再尝试通过同一个套接字连接到另一个地址。这种做法是错误的,因为 bind()
和 listen()
通常用于服务器端,而 connect()
用于客户端。
错误代码 106 对应于 ECONNREFUSED
(连接被拒绝),可能由以下原因造成:
套接字状态:您在调用
connect()
之前已经将套接字绑定并监听,这意味着它处于服务器模式。使用同一套接字同时进行监听和连接是不允许的。目标主机和端口:确保要连接的目标 IP 地址(192.168.8.36)和端口(5000)上有正在运行的服务,并且可以接受连接。
网络问题:检查网络是否正常,确保源主机能够访问目标主机及其端口。
建议修改:
- 如果您希望创建一个客户端来与某个服务器建立连接,请移除与绑定和监听相关的部分。以下是修改后的示例代码:
#include <iostream>
#include <cstring>
#include <unistd.h>
#include <fcntl.h>
#include <arpa/inet.h>
int setNonBlocking(int sockfd) {
int flags = fcntl(sockfd, F_GETFL, 0);
if (flags == -1) {
std::cerr << "Failed to get socket flags!" << std::endl;
return -1;
}
if (fcntl(sockfd, F_SETFL, flags | O_NONBLOCK) == -1) {
std::cerr << "Failed to set non-blocking!" << std::endl;
return -1;
}
return 0; // Success
}
void connectToPeer(const char* ip, int port) {
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1) {
std::cerr << "Socket creation failed!" << std::endl;
return;
}
struct sockaddr_in peerAddr;
memset(&peerAddr, 0, sizeof(peerAddr));
peerAddr.sin_family = AF_INET;
peerAddr.sin_port = htons(port);
if (inet_pton(AF_INET, ip, &peerAddr.sin_addr) <= 0) {
std::cerr << "Invalid address or address not supported" << std::endl;
close(sockfd);
return;
}
// Optional: Set the socket to non-blocking mode
setNonBlocking(sockfd);
if (connect(sockfd, (struct sockaddr*)&peerAddr, sizeof(peerAddr)) == -1) {
if (errno != EINPROGRESS) { // Check for error on connection
std::cerr << "Connection failed! Error: " << errno << std::endl;
close(sockfd);
return;
}
}
std::cout << "Connected successfully." << std::endl;
close(sockfd); // Remember to close the socket when done.
}
int main() {
const char* remoteIp = "192.168.8.36"; // Replace with the other client's IP address
int remotePort = 5000; // The port you wish to connect to
connectToPeer(remoteIp, remotePort);
return 0;
}
总结:
请记住,不要在客户端与服务器之间混淆操作模式。每个套接字只能扮演一种角色(客户端或服务器),而不能同时扮演这两种角色。如果需要进行双向通信,可以分别创建两个不同的套接字。
内容由零声教学AI助手提供,问题来源于学员提问