//
// created by wenfan on 2021/2/6.
//#include #include #include #include #include #include #include #include #include int main(int argc, char *ar**)
const char *ip = ar**[1];
int port = atoi(ar**[2]);
struct sockaddr_in address;
bzero(&address, sizeof(address));
address.sin_family = af_inet;
address.sin_port = htons(port);
address.sin_addr.s_addr = inet_addr(ip);
int sock = socket(pf_inet, sock_stream, 0);
assert(sock >= 0);
int ret = bind(sock, (struct sockaddr *) &address, sizeof(address));
assert(ret != -1);
struct sockaddr_in client;
socklen_t client_addrlength = sizeof(client);
ret = listen(sock, 5);
assert(ret != -1);
int confd = accept(sock, (struct sockaddr *) &client, &client_addrlength);
if (confd < 0)
printf("errno is : %d\n", errno);
else
close(confd);
}close(sock);
return 0;
}
上述**中,我們先關閉標準輸出檔案描述符stdout_fileno(其值是1),然後複製socket檔案描述符connfd。因為dup總是返回系統最小的可用檔案描述符,所以他的返回值是1,即之前關閉的標準輸出檔案描述符的值。這樣一來,伺服器輸出到標準輸出的內容就會直接傳送到客戶端連線對應的socket上(cond),此printf呼叫的輸出將被客戶端獲得。
Linux中dup函式和dup2函式
個人部落格傳送門 linux 中進行檔案描述符的重定向可以使用兩個函式 dup函式和dup2函式,其中還有乙個dup3函式,但是這個是linux後面版本新增的,不是所有的linux核心都支援,在這裡不討論。在linux系統中約定檔案描述符 0 1 2 對應標準輸入 標準輸出 標準錯誤,預設開啟。du...
高階I O函式
套接字i o操作上設定超時的方法有以下3種 1.呼叫alarm,在指定超時期滿時產生sigalrm訊號。2.在select種阻塞等待i o,一次代替直接阻塞在read或write呼叫上。3.使用較新的so rcvtimeo和so sndtimeo套接字選項。以由呼叫者指定的超時上限呼叫connect...
高階I O函式
include intpipe int fd 2 要想實現雙向的資料傳輸,應該使用兩個管道。管道內部傳輸的資料時位元組流,這和tcp位元組流的概念相同。但tcp寫入多少位元組的資料決定對方的接受視窗和擁塞視窗,而管道本身有乙個容量限制,預設是65536位元組。我們可以使用fcntl函式來修改管道容量...