为分布式系统通信设置套接字

时间:2017-11-20 19:17:06

标签: c++ c linux sockets

我正在为聊天实现编写客户端/服务器分布式实例。我希望每个实例能够同时成为服务器和客户端,因此我尝试分配物理地址(使用bind,以便其他节点可以连接到节点)和远程地址(使用connect,因此节点可以进行通信)和其他人)。据我所知,套接字编程是不可能的,因为bind / connect函数只能在进程中使用一次。但是,如果我想发送和接收消息(使用发送/接收函数使用套接字),我不会看到其他可能性。您能否告诉我如何实现上述功能(通过send / recv通过套接字交换消息)?如果我在绑定函数之后尝试使用connect函数,我收到错误(连接:传输端点已经连接):

if((*socket_handler = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
    error("socket");
}
struct sockaddr_in socket_address;
socket_address.sin_family = AF_INET;
socket_address.sin_addr.s_addr = INADDR_ANY;
socket_address.sin_port = htons(port);
if(bind(*socket_handler, (struct sockaddr*)&socket_address, sizeof(socket_address)) == -1) {
    error("bind");
}
if(listen(*socket_handler, 5) == -1) {
    error("listen");
}
if (port == port_to_connect) {
    return;
}

// is it ok to connect that way?
socket_address.sin_family = AF_INET;
socket_address.sin_addr.s_addr = INADDR_ANY;
socket_address.sins_port = htons(port_to_connect);
if(connect(*socket_handler, (struct sockaddr*)&socket_address, sizeof(socket_address)) == -1) {
    error("connect");
}    am_i_pointing_to_myself = false;

2 个答案:

答案 0 :(得分:2)

TCP套接字可以侦听/接受,也可以连接,但不能同时进行。

您的应用程序可能需要两个单独的线程。一个线程将打开一个套接字用于侦听,等待连接并处理该连接。另一个会在用户请求时建立连接。

为了简单起见,执行连接的用户线程应该发送用户的消息并关闭连接,而后台侦听线程应该从接受的套接字读取消息,将其显示给用户,然后关闭连接。

另一个选择是让应用程序询问用户服务器或客户端模式。对于服务器模式,应用程序将侦听并等待连接,然后当它有连接时,它可以通过连接的套接字来回发送。对于客户端模式,它将建立与服务器的连接,然后使用套接字在两个方向上进行通信。

答案 1 :(得分:0)

问题是你对listen()和connect()都使用相同的套接字。这就是你得到这个错误的原因。

你应该能够同时监听和连接,但每个人都需要一个不同的套接字。

你到底要完成什么?

您说您需要让每个实例都能够成为客户端或服务器。这听起来像P2P一样。

为什么你需要接受和建立联系?