1. 程式人生 > >基於TCP的伺服器端/客戶端

基於TCP的伺服器端/客戶端

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