C套接字重定向

标签 c file sockets redirect file-descriptor

我有两个套接字文件描述符,ab,它们由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_a() 函数或 work_b() 函数中使用缓冲区数组

最佳答案

我不知道有什么有效的方法可以在没有缓冲区的情况下执行此操作,因此这里是一个不使用单独线程且仅使用一个缓冲区的示例。您可以在多个线程中使用下面的 doRW 函数,但每个线程只能使用一个缓冲区。 Recv 和 send 似乎是线程安全的方法,如“Are parallel calls to send/recv on the same socket valid?”中所述。

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;
}

关于C套接字重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27701776/

相关文章:

c++ - 使用枚举成员值检查变量值的优化方法

file - Gradle:无法复制文件

c++ - 将 Unicode UTF-8 文件读入 wstring

c - Errno 35 (EAGAIN) 在 recv 调用时返回

c - 为什么数组在C中的字符串后面有路径?

c - XML 验证器(检查给定的 xml 是否正确或损坏)

ruby - 如何创建持久 TCP 套接字?

sockets - C编程-发送HTTP请求

c - 如何在 C# 中为 DLL 导入指定正确的编码(marshal)处理

Java如何将字符串以字节形式写入文件并获取字符串