gpt4 book ai didi

sockets - 可以可靠地将 TCP 套接字连接到自身吗?

转载 作者:可可西里 更新时间:2023-11-01 02:54:01 26 4
gpt4 key购买 nike

我想知道是否有可能将一个 TCP 套接字可靠地连接到它自己——也就是说,只获得一个套接字,无论您发送 () 什么,您都会通过 recv() 接收回来。我看到这可能会发生(例如 hereherehere ),但这些帖子都没有解释如何以编程方式可靠地执行此操作(即,这通常被吹捧为好奇心,而不是一个人会故意使用的功能)。我对适用于 Windows、Mac 和 Linux 的解决方案很感兴趣。

为了完整起见,请让我解释一下我为什么对此感兴趣。我正在编写一个基于云的应用程序,服务器可以在其中向其他服务器(包括它们自己)发送消息。每个服务器都使用一个套接字与其他服务器通信,因此,为了统一代码并使某些线程问题更简单,如果服务器也可以仅使用一个套接字与自己通信,那就太好了。

编辑: @Rufflewind 建议连接到环回适配器。我尝试使用下面的代码,无论是否调用监听。但是,在所有情况下,我都会收到错误消息(“无效参数”或“不支持的操作”)。我做错了什么?

#include <iostream>
#include <netinet/tcp.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

void die(const char* const message) {
perror(message);
exit(0);
}

#define CHECK(operation,message) \
if ((operation) != 0) \
die(message)

int main(int argc, char* argv[]) {
sockaddr_in local;
local.sin_family = AF_INET;
local.sin_port = htons(40000);
inet_aton("127.0.0.1", &local.sin_addr);
int sck = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
CHECK(bind(sck, (struct sockaddr *)&local, sizeof(local)), "Error while binding the socket to an address");
// CHECK(listen(sck, 1), "Error while listening.");
CHECK(connect(sck, (struct sockaddr *)&local, sizeof(local)), "Error while connecting the socket to self");
std::cout << "Succeeded in connecting sockets!" << std::endl;
const char* message = "ABCDEFGH";
const size_t messageLength = ::strlen(message) + 1;
const char* currentSend = message;
ssize_t leftToSend = messageLength;
while (leftToSend != 0) {
const ssize_t sent = send(sck, currentSend, leftToSend, 0);
if (sent == -1)
die("Can't send.");
currentSend += sent;
leftToSend -= sent;
}
std::cout << "Sent the message!" << std::endl;
char buffer[256];
char* currentRead = buffer;
size_t leftToRead = messageLength;
while (leftToRead != 0) {
const ssize_t read = recv(sck, currentRead, leftToRead, 0);
if (read == -1)
die("Can't read.");
currentRead += read;
leftToRead -= read;
}
std::cout << "Received message: " << buffer << std::endl;
return 0;
}

最佳答案

最直接的方法是绑定(bind)到环回适配器。只需在任意端口上收听 127.0.0.1 并连接到该端口即可。

这种方法的问题是端口在机器上是全局的,所以这意味着 其他 程序也可以连接到它,如果你有多个程序,你可能会遇到冲突或者可能耗尽所有可能的端口。

另一种方法是使用 Unix 域套接字,但这在 Windows 上不受支持。

关于sockets - 可以可靠地将 TCP 套接字连接到自身吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37224719/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com