我想为单个进程实现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分支,它根本不支持进程调用。任何帮助将不胜感激!
OP发布的代码无法完全编译!
这可以帮助您取得一些进步...我已经以非阻塞模式管理套接字/监听/接受+套接字/连接。我有一个方向(服务器到客户端)的数据流,但是显然客户端到服务器不是(我希望FD 5变得可读,但显然不是)。需要做更多的工作。