基於TCP的伺服器端/客戶端
阿新 • • 發佈:2018-12-14
1、TCP伺服器端的預設函式呼叫順序
socket()-->bind()-->listen()-->accept()-->read()/write()-->close()
2、函式詳解
int listen(int sock, int backlog);
sock:希望進入等待連線請求狀態的套接字檔案描述符,傳遞的描述符套接字引數為伺服器端套接字
backlog:連線請求等待佇列的長度。該值與伺服器端的特性有關,像頻繁接受請求的Webfuwu伺服器端至少應為15。
int accept(int sock, struct sockaddr *addr, socklen_t addrlen);
sock:希望進入等待連線請求狀態的套接字檔案描述符,傳遞的描述符套接字引數為伺服器端套接字
addr:儲存發起連線請求的客戶端地址資訊的變數地址值
addrlen:第二個引數的長度
3、伺服器端程式
#include <sys/socket.h> #include <stdlib.h> #include <stdio.h> int main(int argc, char **argv) { int serv_sock; int clnt_sock; //宣告套接字 struct sockaddr_in serv_addr; struct sockaddr_in clnt_addr socklen_t clnt_addr_size; //需要傳送的資訊 char message[] = "hello world"; //建立套接字 serv_sock = sock(PF_INET, SOCK_STREAM, 0); memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); serv_addr.sin_port = htons(atoi(argv[1])); //進行繫結 bind(serv_sock, (struct sockaddr*)serv_addr, sizeof(serv_addr)); //監聽 listen(serv_sock, 5); //接受 clnt_addr_size = sizeof(clnt_addr); clnt_sock = accept(serv_sock, (struct sockaddr*)clnt_addr, &clnt_addr_size); write(clnt_sock, message, sizeof(message)); close(serv_sock); close(clnt_sock); return 0; }
4、 TCP客戶端的預設函式呼叫順序
socket()-->connect()-->read()/write()-->close()
5、函式詳解
int connect(int sock, (struct sockaddr*)servsddr, socklen_t addrlen);
所謂連線請求並不意味著伺服器端呼叫accept函式,其實是伺服器端把連線請求資訊記錄到等待佇列。因此connect函式返回後並不立即進行資料交換;客戶端的IP地址和埠在呼叫connect函式時自動分配,無需呼叫bind函式進行分配。
6、伺服器端程式
#include <sys/socket.h> #include <stdlib.h> #include <stdio.h> int main(int argc, char **argv) { int clnt_sock; //宣告套接字 struct sockaddr_in serv_addr; socklen_t clnt_addr_size; char message[30]; int str_len; //建立套接字 clnt_sock = sock(PF_INET, SOCK_STREAM, 0); memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = inet_addr(argv[1]); serv_addr.sin_port = htons(atoi(argv[2])); connect(clnt_sock, (struct sockaddr*)serv_addr, sizeof(serv_addr)); str_len = read(clnt_sock, message, sizeof(message)-1); close(clnt_sock); return 0; }