仅使用套接字实现单进程管道

问题描述 投票:1回答:2

我想为单个进程实现pipe() kernel call,我也没有socketpair(),但是我可以使用非阻塞套接字。这是我现在所拥有的:

#include <stdint.h>
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <arpa/inet.h>

int main(void)
{
    // Wannabe server
    struct sockaddr_in addr;
    int fd;

    fd = socket(AF_INET, SOCK_STREAM, 0);
    if(fd == -1)
    {
        printf("Error opening socket\n");
        return -1;
    }

    addr.sin_port = htons(0);
    addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    addr.sin_family = AF_INET;

    if(bind(fd, (struct sockaddr *)&addr,sizeof(struct sockaddr_in) ) == -1)
    {
        printf("Error binding socket\n");
        return -1;
    }

    if (fcntl(fd, F_SETFL, O_NONBLOCK))
    {
        printf("Unable to make socket non-blocking");
        return -1;
    }


    socklen_t socklen = sizeof(addr);
    getsockname(fd, &addr, &socklen);

    const uint16_t port = ntohs(addr.sin_port);
    printf("Successfully bound to port %u\n", ntohs(addr.sin_port));

    // Accept the data packet from client and verification
    struct sockaddr_in cli;
    size_t cli_size = sizeof(cli);

    accept(fd, &cli, &cli_size);



    // Wannabe client
    int sockfd;
    struct sockaddr_in servaddr;

    // socket create and varification
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd == -1) {
        printf("socket creation failed...\n");
        return -1;
    }
    else
        printf("Socket successfully created..\n");
    memset(&servaddr, 0, sizeof(servaddr));

    // assign IP, PORT
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    servaddr.sin_port = addr.sin_port;

    // connect the client socket to server socket
    if (connect(sockfd, &servaddr, sizeof(servaddr)) != 0)
        printf("connection with the server failed...\n");
    else
        printf("connected to the server..\n");

    return 0;
}

程序说:

Successfully bound to port 44581
Socket successfully created..
connection with the server failed...

我必须对客户端套接字有问题,否则accept调用可能有问题。操作系统很奇怪,但是它是FreeBSD分支,它根本不支持进程调用。任何帮助将不胜感激!

c sockets pipe freebsd
2个回答
0
投票

OP发布的代码无法完全编译!


0
投票

这可以帮助您取得一些进步...我已经以非阻塞模式管理套接字/监听/接受+套接字/连接。我有一个方向(服务器到客户端)的数据流,但是显然客户端到服务器不是(我希望FD 5变得可读,但显然不是)。需要做更多的工作。

© www.soinside.com 2019 - 2024. All rights reserved.