Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C套接字重定向_C_File_Sockets_Redirect_File Descriptor - Fatal编程技术网

C套接字重定向

C套接字重定向,c,file,sockets,redirect,file-descriptor,C,File,Sockets,Redirect,File Descriptor,我有两个套接字文件描述符,a和b,它们是通过socket函数返回的。问题是:我如何才能使从a读取的任何内容都写入b,而从b读取的任何内容都写入a。这种情况有点像代理。你能给我一些想法吗,谢谢 int fd_a, fd_b; void fd_init() { fd_a = socket(AF_INET, SOCK_STREAM, 0); fd_b = socket(AF_INET, SOCK_STREAM, 0); } void* work_a(void*

我有两个套接字文件描述符,
a
b
,它们是通过
socket
函数返回的。问题是:我如何才能使从
a
读取的任何内容都写入
b
,而从
b
读取的任何内容都写入
a
。这种情况有点像代理。你能给我一些想法吗,谢谢

  int fd_a, fd_b;

  void fd_init()
  {
    fd_a = socket(AF_INET, SOCK_STREAM, 0);
    fd_b = socket(AF_INET, SOCK_STREAM, 0); 
  }

  void* work_a(void* arg)
  {
    // read something from fd_a then write immediately to fd_b
  }

  void* work_b(void* arg)
  {
    // read something from fd_b then write immediately to fd_a
  }

  int main(int argc, char* argv[])
  {
    // ...
    fd_init();
    pthread_create(pthread_a, 0, work_a, NULL);
    pthread_create(phtread_b, 0, work_b, NULL);
    pthread_join(pthread_a);
    pthread_join(pthread_b);
    // ...
    return EXIT_SUCCESS;
  }

注意:在
work\u a()
函数或
work\u b()

函数中都不能使用缓冲区数组,因此我不知道在没有缓冲区的情况下有什么有效的方法可以做到这一点,因此下面是一个不使用单独线程和只有一个缓冲区的示例。您可以从多个线程使用下面的doRW函数,但每个线程只能使用一个缓冲区。Recv和send似乎是线程安全的方法,如“”中所述


如果你能在你想要实现的目标上添加示例代码,那就最好了。”…从
a
中读取的任何内容-任何内容?如果读者幸福地不知道你在做这件事,这是一个很高的要求,你的描述中有一个可疑的遗漏。听起来像是您试图通过编程实现单个功能
ncat
,或
netcat
,等等。您所说的“不能在其中任何一个中使用缓冲区数组…”是什么意思?正如您在下面的schwer回答中所看到的,他使用数组
buf
作为缓冲区。我的意思是,如果没有
buf
的重定向方式,您的答案可能不是我认为的最好,但是,谢谢。
int fd_a, fd_b;

void fd_init()
{
    fd_a = socket(AF_INET, SOCK_STREAM, 0);
    fd_b = socket(AF_INET, SOCK_STREAM, 0); 
}
bool doRW(int a, int b, char* buf, int size){
    int len = recv(a, buf, size, 0);
    if(len == 0) return false; //disconnected
    else if(len > 0) send(b, buf, len, 0);
    return true;
}
int main(int argc, char* argv[])
{
    // ...
    fd_init();
    fcntl(fd_a, F_SETFL, O_NONBLOCK);
    fcntl(fd_b, F_SETFL, O_NONBLOCK);
    char* buf = malloc(2048);
    while(doRW(fd_a, fd_b, buf, 2048) && doRW(fd_b, fd_a, buf, 2048)) ;
    free(buf);
    return EXIT_SUCCESS;
}