c - 如何将一个 TCP 服务器连接到另一个 TCP 服务器

标签 c sockets server client

我正在使用 TCP 服务器。假设我有一台运行特定端口的服务器,但后来我想将客户端连接到它,我会简单地完成套接字、绑定(bind)、监听、接受服务器然后套接字、连接客户端的典型过程.所以假设我们的服务器端口是 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;
}

在运行程序的第二个实例时,我收到错误“绑定(bind):无效参数”。我假设这是由于该端口已被使用。有什么方法可以绕过这个,或者有什么方法可以将服务器连接到客户端,并允许客户端也使用相同的端口充当服务器

最佳答案

你不能打开一个既可以监听又可以连接的套接字。

关于c - 如何将一个 TCP 服务器连接到另一个 TCP 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57468372/

相关文章:

c++ - 损坏的 HTML - 浏览器不会从我的网络服务器下载整个 HTTP 响应,CURL 会

PHP SQL 字符串赋值抛出服务器错误

html - 将网站图标添加到文本/纯响应中

c++ - 是否总是会有一个与您构建的 .dll 关联的 .lib(导入库)?

c - 在这种情况下尾随填充字节的重要性是什么?

sql - 如何直接从 PL/SQL 调用 PRO*C 程序?

java - 如何从字节缓冲区打印字符串

c - 编写 vargarg C 预处理器宏,它调用其他宏及其每个参数等等

swift - 如何让IBM BlueSocket运行在GUI应用程序上并支持多连接

C# UDP Socket 需要时间将数据发送到未知 IP