2014-12-30 39 views
-1

我有兩個套接字文件描述符ab,它們的功能是socket。問題是:我該怎麼做才能使a中的任何內容都寫入b,然而,從b中讀取的內容將寫入a。這種情況像代理一點。你會給我一些想法,謝謝!C套接口重定向

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

注意:不能用BUFFER數組中的work_a()無論是功能還是work_b()

+3

它是最好的,如果你可以在你想要實現的東西上添加示例代碼。 – askb

+0

「...任何從'a'讀取的內容...」 - *任何內容*?如果讀者完全沒有意識到自己正在做這件事,這是一個很高的命令,這是一種可疑的描述中遺漏的情況。這聽起來像是在試圖以編程方式實現單功能'ncat'或'netcat'等。 – WhozCraig

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

也許,你的回答並不是我認爲的最好,但是,謝謝。 – Anudorannador