linux網路程式設計三 recv, send 的呼叫

2021-06-21 07:03:46 字數 2277 閱讀 9823

最近在看《linux高效能伺服器程式設計》,在此做個日記,以激勵自己,同時分享於有需要的朋友。

#include #include ssize_t recv(int sockfd, void *buf, size_t len, int flags);

ssize_t send(int sockfd, const void *buf, size_t len, int flags);

1. recv讀取socfd 上的資料, buf和len引數分別指定讀緩衝區的位置和大小,flags引數通常設定為0,它為資料收發提供了額處的控制,比如msg_oob,用於傳送或接收緊急資料,具體可查閱手冊。

呼叫成功時返回實際讀取到的資料長度,它可能小於我們期望的長度len。因此我們可能要多次呼叫 recv 才能讀取完整 的資料。它也可能返回0, 意味著通訊對方關閉了連線。出錯時返回-1,並設定errno。

2. send往sockfd寫入資料,buf和len引數分別指定寫緩衝區的位置和大小。

呼叫成功時返回實際寫入的資料長度,失敗時返回-1,並設定errno。

//客戶端**

#include #include #include #include #include #include #include #include int main(int argc, char **argv)

const char *ip = argv[1];

int port = atoi(argv[2]);

struct sockaddr_in server_address;

bzero(&server_address, sizeof(server_address));

server_address.sin_family = af_inet;

server_address.sin_port = htons(port);

inet_pton(af_inet, ip, &server_address.sin_addr);

int sockfd = socket(pf_inet, sock_stream, 0);

assert(sockfd >= 0);

if (connect(sockfd, (struct sockaddr*)&server_address, sizeof(server_address)) < 0)

else

close(sockfd);

return 0;

}

//服務端**

#include #include #include #include #include #include #include #include #include #define buf_size 1024

int main(int argc, char **argv)

const char *ip = argv[1];

int port = atoi(argv[2]);

struct sockaddr_in address;

bzero(&address, sizeof(address));

address.sin_family = af_inet;

address.sin_port = htons(port);

inet_pton(af_inet, ip, &address.sin_addr);

int sock = socket(pf_inet, sock_stream, 0);

assert(sock >= 0);

int reuse = 1;

setsockopt(sock, sol_socket, so_reuseaddr, &reuse, sizof(reuse));

int ret = bind(sock, (struct sockaddr*)&address, sizeof(address));

assert(ret != -1);

ret = listen(sock, 5);

assert(ret != -1);

struct sockaddr_in client;

socklen_t client_addrlength = sizeof(client);

int connfd = accept(sock, (struct sockaddr*)&client, &client_addrlength);

if (connfd < 0)

else

close(sock);

return 0;

}

Linux網路程式設計基礎 三

完整的讀寫函式 一旦我們建立了連線,我們的下一步就是進行通訊了.在linux下面把我們前面建立的通道 看成是檔案描述符,這樣伺服器端和客戶端進行通訊時候,只要往檔案描述符裡面讀寫東西了.就象我們往檔案讀寫一樣.1 寫函式write ssize t write int fd,const void bu...

Linux網路程式設計 TCP UDP程式設計流程(三)

建立 socket套接字 int socket 使用bind方法命令 socket套接字,將伺服器端的位址資訊與 socket套接字進行繫結 接收資料 int recvfrom 傳送資料 int sendto 伺服器關閉 int closed 建立 socket套接字 int socket 傳送資料...

Linux系統程式設計 網路程式設計基礎(三)

若在網路中,需要使客戶端連線的位址為乙個有效的ip位址,這樣就能在兩台計算機之間通訊。除ip位址外,計算機名也可用來代表一台網路中的計算機。通過訪問主機資料庫實現的。伺服器資料庫介面函式在標頭檔案netdb.h中定義。與此相關的函式有gethostbyaddr 和gethostbyname 兩個,一...