c - 如何将一个 TCP 服务器连接到另一个 TCP 服务器
问题描述
我正在使用 TCP 服务器。假设我有一个使用特定端口运行的服务器,但是我想将一个客户端连接到它,我将简单地通过套接字、绑定、侦听、接受服务器的典型过程,然后是套接字,连接客户端. 所以假设我们的服务器端口是 4000,我们的客户端端口是 4001。现在,我想创建一个新客户端,它将在端口 4001 上连接到我的客户端,但据我所知,作为客户端,我不能这样做。端口 4001 必须属于服务器而不是客户端(即它必须正在侦听)。出现问题是因为我认为您不能为服务器和客户端使用相同的端口。
我决定通过下面提供的示例代码进行尝试。我在命令行上调用程序如下:
如果这是服务器的第一次调用,那么我只需调用不带任何参数的程序,它将自动在端口 3000 上运行。即 ./serverprogram
如果我想将端口 3001 上的客户端连接到端口 3000 上的服务器。然后我会使用两个参数调用命令行,第一个是 3001,第二个是 3000。即 ./serverprogram 3001 3000
#define PORT 3000
int main (int argc, char * argv[]){
int sfd = socket(AF_INET, SOCK_STREAM, 0);
int my_port = (argc == 3) ? atoi(argv[1]) : PORT;
if (argc > 2){
struct sockaddr_in c_addr;
c_addr.sin_family = AF_INET;
memset(&c_addr.sin_zero, 0, 8);
c_addr.sin_port = htons(atoi(argv[2]));
struct addrinfo *result = NULL;
getaddrinfo("AcaciaLinux", NULL, NULL, &result);
struct sockaddr_in *x = (struct sockaddr_in*) result->ai_addr;
c_addr.sin_addr = x->sin_addr;
freeaddrinfo(result);
if(connect(sfd, (struct sockaddr *) &c_addr, sizeof(struct sockaddr_in)) == -1){
perror("connect");
exit(1);
}
printf("We have connected to a server.");
}
if (sfd == -1){
perror("socket");
exit(1);
}
struct sockaddr_in saddr;
saddr.sin_family = AF_INET;
saddr.sin_port = htons(my_port);
saddr.sin_addr.s_addr = INADDR_ANY;
memset(&(saddr.sin_zero), 0, 8);
if(bind(sfd, (struct sockaddr*) &saddr, sizeof(struct sockaddr_in)) == -1){
perror("bind");
close(sfd);
exit(1);
}
if (listen(sfd, 5) < 0){
perror("listen");
exit(1);
}
struct sockaddr_in caddr;
saddr.sin_family = AF_INET;
int cfd;
unsigned int c_len = sizeof(struct sockaddr_in);
if ((cfd = accept(sfd, (struct sockaddr*) &caddr, &c_len)) == -1){
perror("accept");
exit(1);
}
printf("Alas, we have finally connected to a client.");
return 0;
}
在运行程序的第二个实例时,我收到错误“绑定:无效参数”。我假设这是由于该端口已在使用中。有没有办法绕过这个,或者有什么办法可以将服务器连接到客户端,并允许客户端也可以使用相同的端口充当服务器
解决方案
你不能打开一个既可以监听又可以连接的套接字。
推荐阅读
- swift - SceneKit 和 ARKit 中的 simdTransform 是什么?
- excel - Excel:如何多次在表格中找到最接近的数字
- apache - 限制对 Apache 2.4 虚拟主机 (WAMP) 的访问
- django - 多个 Django 模型之间的大量数据传输
- node.js - db.getCollectionInfos 不是函数
- objective-c - NSFileManager isWritableFileAtPath false
- tensorflow-datasets - Tensorflow 数据集交错读取图像文件路径
- arrays - R:根据列名将 JAGS 输出矩阵转换为数组
- c# - 如何在 C# 中正确检查 HttpResponseMessage 的 http 状态代码?
- interface - Jackson:反序列化没有注释和混入的接口