ZBLOG

int setNonBlocking(int sockfd) { int flags = fcntl(sockfd, F_GETFL, 0); if (flags == -1) { std::cerr

在您的代码中,您使用了 bind()listen() 来设置一个监听套接字,然后再尝试通过同一个套接字连接到另一个地址。这种做法是错误的,因为 bind()listen() 通常用于服务器端,而 connect() 用于客户端。

错误代码 106 对应于 ECONNREFUSED(连接被拒绝),可能由以下原因造成:

  1. 套接字状态:您在调用 connect() 之前已经将套接字绑定并监听,这意味着它处于服务器模式。使用同一套接字同时进行监听和连接是不允许的。

  2. 目标主机和端口:确保要连接的目标 IP 地址(192.168.8.36)和端口(5000)上有正在运行的服务,并且可以接受连接。

  3. 网络问题:检查网络是否正常,确保源主机能够访问目标主机及其端口。

建议修改:

  • 如果您希望创建一个客户端来与某个服务器建立连接,请移除与绑定和监听相关的部分。以下是修改后的示例代码:
#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助手提供,问题来源于学员提问

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?