我有两个套接字文件描述符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_a()
函数或work_b()
答案 0 :(得分:0)
我不知道在没有缓冲区的情况下执行此操作的任何有效方法,因此这里是一个示例,不使用单独的线程和只有一个缓冲区。您可以从多个线程使用下面的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;
}