運用dup2的tcp socket通訊

2021-08-02 07:57:35 字數 1623 閱讀 3770

dup 和 dup2既然有重定向的功能,那麼我們之前寫的tcp socket通訊是不是可以修改一下呢?比如,不用write往socket裡面寫,而直接用dup2/dup重定向呢?

答案是肯定的。

**如下

tcp_dup2_server

#include 

#include

#include

#include

#include

#include

#include

#include

#include

int startup(const char* _ip, int _port) // bind繫結 struct sockaddr_in local; local.sin_family = af_inet; local.sin_port = htons(_port); local.sin_addr.s_addr = inet_addr(_ip); if(bind(sock, (struct sockaddr*)&local, sizeof(local)) < 0) if(listen(sock, 10) < 0) return sock; } static void usage(const char *proc) int main(int argc, char *argv) //int sock =startup(argv[1], atoi(argv[2])); int listen_sock =startup(argv[1], atoi(argv[2])); struct sockaddr_in remote; socklen_t len = sizeof(remote); char buf[1024]; sleep(2); while(1) printf("client ip: %s, port: %d\n", inet_ntoa(remote.sin_addr), ntohs(remote.sin_port)); while(1) else if(s == 0) } } }

tcp_dup2_client

#include 

#include

#include

#include

#include

#include

#include

#include

#include

static void usage(const char *proc) int main(int argc, char *argv) int sock = socket(af_inet, sock_stream, 0); if(sock < 0) struct sockaddr_in peer; peer.sin_family = af_inet; peer.sin_port = htons(atoi(argv[2])); peer.sin_addr.s_addr = inet_addr(argv[1]); if(connect(sock, (struct sockaddr*)& peer, sizeof(peer)) < 0) char buf[1024]; int ret = dup2(sock, 1); while(1) printf("%s", buf); fflush(stdout); } close(sock); }

dup與dup2系統呼叫

以下 摘自linux 0.11,雖然 已經過時,但是它的實現非常直觀,簡單,對於理解dup的實現有著很大的價值和幫助。通過這段 很容易理解dup背後的思想。複製檔案控制代碼 描述符 fs fcntl.c 引數fd 是欲複製的檔案控制代碼,arg 指定新檔案控制代碼的最小數值。返回新檔案控制代碼或出錯...

dup2 功能實現

用dup 來返回檔案描述符,直到符合要求的為止,最後再把不符合要求的關閉 當輸入的描述符是負的或者已超過max open時,會出錯 include dup include include define open max 256 int my dup2 int,int int main int arg...

Linux 系統呼叫 dup 和dup2

1 dup dup 系統呼叫會建立檔案描述符的乙個拷貝 1 新生成的檔案描述符是程序中最小的未使用的檔案描述符,0 1 2對應標準輸入 標準輸出 標準錯誤輸出 2 如果拷貝成功,那麼原始的和拷貝的檔案描述符可能會交叉使用 3 兩者都指向同乙個開啟的檔案描述符,因此共享檔案偏移量和檔案狀態標誌 語法 ...