天天看點

網絡程式設計的一點知識

一、Socket程序間通信

    基本特點:

        Socket是一種接口技術,被抽象成一個檔案夾來操作,可以讓同一台計算機的程序之間通信,也可以讓不同計算機的程序間通信(網絡)

    同一台計算機的程序間通信:

        底層需要借助socket檔案,進行同一計算機下的程序間通信

        int socket(int domain, int type, int protocol);

        功能:建立socket對象

        domain:

            AF_UNIX/AF_LOCAL    本地通信,程序間通信 

            AF_INET             基于IPv4位址通信

            AF_INET6            基于IPv6位址通信

        type:

          SOCK_STREAM           資料流協定

          SOCK_DGRAM            資料報協定

        protocol:

            特殊的通信協定,一般不用,寫0即可

        傳回值:成功傳回socket描述符,失敗傳回-1

        int bind(int sockfd, const struct sockaddr *addr,

                socklen_t addrlen);

        功能:綁定socket和通信位址

        sockfd:socket描述符

        addr:

            實際傳遞的是sockaddr_un或者sockaddr_in 但是要把它們轉換為sockaddr類型

            #include <sys/un.h> [vim /usr/include/linux/un.h]

            struct sockaddr_un {

                __kernel_sa_family_t sun_family; //domain寫什麼就填什麼

                char sun_path[UNIX_PATH_MAX];   //socket檔案路徑

            };

            網絡通信位址類型:

            #include <netinet/in.h>

            sockaddr_in {

                __kernel_sa_family_t  sin_family;   //domain寫什麼就填什麼

                __be16        sin_port;             //端口号

                struct in_addr    sin_addr;         //IP位址

            }

            struct in_addr{

                __be32 s_addr;

            }

            addrlen:位址結構體的位元組數

            傳回值:成功傳回0,失敗傳回-1

            int listen(int sockfd, int backlog);

            功能:監聽socket,資料流通信時使用

            sockfd:socket描述符

            backlog:排隊數量

            傳回值:成功傳回0,失敗傳回-1

            int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

            功能:等待連接配接,資料流通信時使用

            sockfd:socket描述符

            addr:擷取連接配接者的位址

            addrlen:既是輸入也是輸出

                既要告訴accept函數目前系統位址結構體的位元組數,同時也能夠擷取發送者的位址結構體的位元組數

            傳回值:

                成功傳回是一個建立連接配接後的socket描述符,失敗傳回-1

            int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

            功能:連接配接socket

            sockfd:socket描述符

            addr:目标位址

            addrlen:位址結構體的位元組數

            傳回值:成功傳回0,失敗傳回-1

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

        功能:向連接配接成功的sockfd發送資料,資料流中使用

        sockfd:連接配接成功後的socket描述符

        buf:待發送的資料記憶體首位址

        len:要發送的位元組數

        flags:一般寫0即可

            MSG_DONTWAIT    不阻塞

            MSG_OOB         優先發送緊急資料

        傳回值:成功發送的位元組數,失敗傳回-1

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

        功能:從連接配接成功後的sockfd中讀取資料,資料流中使用

        sockfd:連接配接成功後的socket描述符

        buf:存儲讀取到的資料的記憶體首位址

        len:存儲資料的記憶體的位元組數

        flags:一般寫0即可

            MSG_DONTWAIT    不阻塞

            MSG_OOB         優先接收緊急資料

        傳回值:成功接收到的位元組數,-1出現錯誤,0連接配接斷開

    本地socket程序間通信程式設計模型:

        程序A                       程序B

     建立socket對象                 建立socket對象

     準備通信位址                   準備通信位址

     綁定socket和位址                   ...

     監聽                               ...

     等待連接配接                           連接配接

     接收/發送資料                    發送/接收資料

     關閉socket                     關閉socket

     删除socket

繼續閱讀