網絡通信

三大(通信)網絡:計算機網絡(有線網絡,WIFI)、電信網絡(有線電話,2G/3G/4G/5G)、有線電視網絡
網絡融合:電信網絡提供基礎設施(基站、線路),計算機網路借用信道傳播數據
計算機網絡(主流):開放、廉價

實質:進程之間的通信,只需要準備好物品,寫好地址(IP+端口號),其他的丟給網絡就好。
IP地址:(茫茫計算機網絡中)用來唯一地標識某個網絡中的一臺設備。
端口號(port):用來唯一標識同一臺設備中的不同進程。就是一個非負整數,範圍:0-65535

網絡通信的兩種實現方式:(計算機網絡中唯二的兩家物流公司)
1、 基於TCP協議:面向連接,傳輸可靠,但傳輸效率低
2、 基於UCP協議:無連接,傳輸效率高,但不保證可靠,盡力傳輸。

基於TCP協議通信實現:參與通信的兩個程序是不對等的,一個是客戶端程序,一個是服務器端程序。即採用C/S模式。(client/server)客戶端是主動發起通信,服務器端是被動。

套接字(socket):插座,一個網絡接入點。相當於手機(網絡開關)

服務器端程序實現步驟: 客戶端
1.創建監聽套接字(買一部只能接電話的手機) 1.創建流套接字(買手機)
2.給套接字綁定(IP)地址(相當於給手機上號) 2.綁定地址(買卡)
3.將套接字設置爲監聽狀態(開機,將手機設置爲待機) 3.連接服務器 (呼叫)
4.接受客戶端連接請求(相當於接受來電請求) 4.收發數據(通話)
5.收發數據(相互通信) 5.斷開連接(掛機)
6.斷開連接(掛機)
456|456|456|456|456(可重複執行)
7.關閉監聽套接字(手機關機或飛行模式)

相關函數:
 int socket(int domain, int type, int protocol);
//套接字描述符
第一個參數:AF_INET:使用internet地址家族,即採用TCP/IP網絡標準(基本固定)
第二個參數:表套接字類型主要有三種形式
SOCK_STREAM : 流套接字,用於TCP協議通信
SOCK_DGRAM: 即數據報套接字,用於UDP協議通信
SOCK_RAW :即原始套接字,用於網絡底層通信
第三個參數:表示使用的通信協議,0表示使用默認協議
 uint16_t htons(uint16_t hostshort)將一個short類型數據從主機字節序轉化爲網絡字節序
host(主機) to networks(網絡) s(short)
 int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
將套接字和端口號綁定
 int listen(int sockfd, int backlog)
//等待隊列長度,通常設置爲5
 int accept (int sockfd, struct sockaddr *addr, socklen_t *addrlen);
//新的套接字|連接套接字//對方的地址信息,不關注時設置爲NULL,關注時用結構體保存
新的套接字專門用於收發數據
 ssize_t send(int sockfd, const void *buf, size_t len, int flags)
//內存地址 //大小 //標識

服務器端代碼

#include <sys/types.h>          
#include <sys/socket.h>
#include <stdio.h> 
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>
int main()
{ 
//1、買手機//創建套接字      //address intnet(固定)
    int socket_listen=socket(AF_INET,SOCK_STREAM,0);
    //套接字描述符號       //地址家族//套接字類型//默認協議

//2、登記各種信息(結構體)//綁定地址
    struct sockaddr_in myaddr;
    myaddr.sin_family = AF_INET;//指定地址家族爲Internet地址家族
    myaddr.sin_addr.s_addr=INADDR_ANY;//指定IP地址爲本機任意地址
    myaddr.sin_port=htons(6666);//指定端口號爲6666
    //htons:將一個short數據從主機字節序轉化爲網絡字節序
//綁卡
    if(-1==bind(socket_listen,(struct sockaddr*)&myaddr,sizeof(myaddr)))
    {                          //歷史遺留,統一結構體標準
        perror("bind");
        exit(-1);
    }
//3、手機待機//將套接字設置爲監聽狀態
    listen(socket_listen,5);//等待隊列長度,通常設爲5

//4、接電話//接受客戶端連接請求
    int sock_conn=accept(socket_listen,NULL,NULL);
    //返回值是一個連接套接字,專門用於對應的連接上和客戶端進行通信
//5、收發數據
    //send 發送,將內存的數據發到網絡
    //receive 接收,將網絡上接受的數據存到內存

    char msg[100];
    int ret;
    strcpy(msg,"hello");
    ret=send(sock_conn,msg,strlen(msg),0);//0表默認,不加額外控制//發

    ret=recv(sock_conn,msg,sizeof(msg)-1,0);//收
                        //減'\0'
//  if(ret<0)//異常斷開
//  if(ret=0)//對方正常斷開
    if(ret>0)
    {
        msg[ret]='\0';//把收到的加'\0'
        printf("客戶端說:%s\n",msg);
    }
    else
    {
        printf("接收失敗,連接斷開\n");
    }
//6、斷開連接,即關閉連接套接字
    close(sock_conn);

//7、關閉監聽套接字
    close(socket_listen);
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章