溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

socket網絡編程

發布時間:2020-06-13 15:24:15 來源:網絡 閱讀:538 作者:匯天下豪杰 欄目:網絡安全

1、什么是計算機網絡?

  多個計算機進行通信--->計算機網絡。

2、計算機通信的復雜度

  (1)、傳輸信息的復雜度(種類、內容);

  (2)、信息的數量

  (3)、傳輸距離(干擾...)

  (4)、信息的安全問題

  (5)、計算機體系的完整性和封閉性。

  既要保證計算機的封閉性,又要達成計算機的通信。

3、ip地址

  (1)、IP地址是有限的,需要一種方式將IP地址復用。

  (2)、IP地址的復用導致了數據傳遞的復雜性(ATM,存儲轉發機制;路由機制)。

  (3)、IP地址過于抽象不方便使用,于是給出了IP地址的人文化轉義:域名。

  (4)、域名只能代表一個IP網絡地址,于是就只能代表一個網絡上的節點實體。

  (5)、實際上訪問節點的時候,本質上使用的是IP地址,所以就需要將域名轉化為IP地址(DNS...)

4、IP地址的分類

  (1)、IPv4地址是4字節的,中間以 . 劃分;IPv6地址是16字節的;

  規定:在IP地址劃分上,一般不取全0/全1;

  IP一般分為5類;

  A、B、C、D、E,一般常用的IP地址為A類,B類,C類;

socket網絡編程

A類IP:第一個字節是以0開頭  0000 0000--->0111 1111  0~127

B類IP:第一個字節是以10開頭  1000 0000--->1011 1111  128~191 

C類IP:第一個字節是以110開頭   1100 0000--->1101 1111  192~223

  (2)、子網掩碼:就是將網絡號設置為1,主機號設置為0(對每一個字節的位進行設置);

  例:C類IP地址,3個字節網絡號和一個字節的主機號;

  1111 1111 1111 1111 1111 1111 0000 0000

     255       .     255     .      255     .     0

  (3)、子網劃分:此時就存在C類地址的子網掩碼不一定總是255.255.255.0;

  這還的看C類IP下面有沒有子網劃分,

  有子網劃分的話,最后一個字節,也就是主機號可能為2段(01/10)、4段(00/01/10/11)

  例:192.168.3.11xx xxxx  1111 1111 1111 1111 1111 1111 1100 0000

  此時對應的子網掩碼為:255.255.255.192

  (4)、IOS和TCP/IP

模型分析

socket網絡編程

  (5)、端口號

  port:唯一標識應用程序的編號;

  我們之間通過QQ、微信、郵箱進行收發數據時,沒有導致數據的錯亂接收,是怎么做到的呢?又是怎么一一對應找到的呢?

  :通過端口號,識別了電腦上的某一應用程序,也就是找對應的編號。

  我們在進行數據的發送時:首先通過IP尋找物理計算機,在根據port,尋找對應的應用程序。

  (6)、TCP和UDP

  UDP屬于TCP/IP體系中的一部分。

  TCP協議和UDP協議都屬于傳輸層協議。

  TCP協議:

  i>、面向連接的傳輸協議、可靠的、同步的;

  ii>、面向連接的網絡傳輸特點:a、需要有一方主動的建立連接,另一方接收連接請求;b、只有建立了連接之后才能夠進行數據的傳輸;c、當數據傳輸完畢之后,就需要釋放連接,由連接的兩端來共同決定連接是否保持。

  UDP協議:

  a、面向無連接的:即就是在進行數據傳輸的時候,不需要預先創建一個連接;

  b、不可靠的:無法知道發送的數據是否能夠到達目的,也無法知道什么時候能夠到達目的。

  c、異步的:

  (7)、TCP的三次握手、四次揮手

  TCP------->至少3次握手(最后一次防止誤按,2次的話,有可能死鎖);    : 打電話模型

  模型分析

socket網絡編程

  TCP-------->4次揮手。  模型:男女朋友分手模型

socket網絡編程

  通過IP,只能保證物理上的連通,至于收發數據的形式是什么,都不歸它管。

  127.0.0.1:本機回送地址,可作為測試本機使用,不安裝網卡也是可以ping通的。

5、TCP的編程實現

  基礎的socket編程對TCP的就是下面的步驟:

(1)、模型分析

socket網絡編程

(2)、代碼實現

utili.h

#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>

#define SERVER_PORT 9090
#define SERVER_IP  "127.0.0.1"
#define LISTEN_QUEUE    5
#define BUF_SIZE    255

服務器端代碼:

#include"utili.h"

//TCP
int main(void){
    int sockSer = socket(AF_INET, SOCK_STREAM, 0); 
    if(sockSer == -1){
        perror("socket");
        return -1; 
    }   

    struct sockaddr_in addrSer, addrCli;
    addrSer.sin_family = AF_INET;
    addrSer.sin_port = htons(SERVER_PORT);
    addrSer.sin_addr.s_addr = inet_addr(SERVER_IP);

    int yes = 1;
    setsockopt(sockSer, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)); //地址、端口的重用

    socklen_t len = sizeof(struct sockaddr);
    int res = bind(sockSer, (struct sockaddr *)&addrSer, len);
    if(res == -1){
        perror("bind");
        close(sockSer);
        return -1; 
    }   

    res = listen(sockSer, LISTEN_QUEUE);
    if(res == -1){
        perror("listen");
        close(sockSer);
        return -1;
    }

    int sockConn;
    char sendbuf[BUF_SIZE];
    char recvbuf[BUF_SIZE];
    while(1){
        sockConn = accept(sockSer, (struct sockaddr *)&addrCli, &len);
        if(sockConn == -1){
            continue;
        }else{
            printf("Server Accept Client Connect OK\n");
        }
        printf("Ser :>");
        scanf("%s", sendbuf);
        if(strncmp(sendbuf, "quit", 4) == 0)
            break;
        send(sockConn, sendbuf, strlen(sendbuf)+1, 0);

        recv(sockConn, recvbuf, BUF_SIZE, 0);
        printf("Cli :>%s\n", recvbuf);    
    }
    close(sockSer);

    return 0;
}

客戶端代碼:

#include"utili.h"

//TCP
int main(void){
    int sockCli = socket(AF_INET, SOCK_STREAM, 0); 

    struct sockaddr_in addrSer;
    addrSer.sin_family = AF_INET;
    addrSer.sin_port = htons(SERVER_PORT);
    addrSer.sin_addr.s_addr = inet_addr(SERVER_IP);

    struct sockaddr_in addrCli;
    addrCli.sin_family = AF_INET;
    addrCli.sin_port = htons(7070);
    addrCli.sin_addr.s_addr = inet_addr("192.168.1.155");

    int yes = 1;
    setsockopt(sockCli, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)); //地址、端口的重用

    socklen_t len = sizeof(struct sockaddr);

    int res = bind(sockCli, (struct sockaddr *)&addrCli, len);
    if(res == -1){
        perror("bind");
        close(sockCli);
        return -1; 
    }   

    res = connect(sockCli, (struct sockaddr*)&addrSer, len);
    if(res == -1){
        perror("connect");
        close(sockCli);
        return -1;
    }else{
        printf("Client Connect Server ok\n");
    }

    char sendbuf[BUF_SIZE];
    char recvbuf[BUF_SIZE];
    while(1){
        connect(sockCli, (struct sockaddr*)&addrSer, len);
        recv(sockCli, recvbuf, BUF_SIZE, 0);
        printf("Ser :>%s\n", recvbuf);

        printf("Cli :>");
        scanf("%s", sendbuf);
        if(strncmp(sendbuf, "quit", 4) == 0)    
            break;
        send(sockCli, sendbuf, strlen(sendbuf)+1, 0);

    }
    close(sockCli);

    return 0;
}

(3)、運行結果

socket網絡編程

socket網絡編程

6、UDP的編程實現

  基礎的socket編程對UDP的就是下面的步驟:

(1)、模型分析

socket網絡編程

(2)、代碼實現

utili.h

#include<unistd.h>
#include<stdio.h>
#include<string.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>

#define SERVER_PORT  9090
#define SERVER_IP    "127.0.0.1"
#define LISTEN_QUEUE  5
#define BUFFER_SIZE   255

服務器端代碼:

#include"utili.h"

int main(){
    int sockSer = socket(AF_INET, SOCK_DGRAM, 0); 
    if(sockSer == -1){
        perror("socket");
        return -1; 
    }   
    struct sockaddr_in addrSer, addrCli;
    addrSer.sin_family = AF_INET;
    addrSer.sin_port = htons(SERVER_PORT);
    addrSer.sin_addr.s_addr = inet_addr(SERVER_IP);

    socklen_t len = sizeof(struct sockaddr);
    int res = bind(sockSer, (struct sockaddr*)&addrSer, len);
    if(res == -1){
        perror("bind");
        close(sockSer);
        return -1; 
    }   

    char sendbuf[BUFFER_SIZE];
    char recvbuf[BUFFER_SIZE];
    while(1){
        recvfrom(sockSer, recvbuf, BUFFER_SIZE, 0, (struct sockaddr*)&addrCli, &len);
        printf("Cli:>%s\n",recvbuf);
        
        printf("Ser:>");
        scanf("%s",sendbuf);
        if(strncmp(sendbuf, "quit", 4) == 0){
            break;
        }
        sendto(sockSer, sendbuf, strlen(sendbuf)+1, 0, (struct sockaddr*)&addrCli, len);
    }
    close(sockSer);
    return 0;
}

客戶端代碼:

#include"utili.h"

int  main(){
    int sockCli = socket(AF_INET, SOCK_DGRAM, 0); 
    if(sockCli == -1){
        perror("socket");
        return -1; 
    }   

    struct sockaddr_in addrSer;
    addrSer.sin_family = AF_INET;
    addrSer.sin_port = htons(SERVER_PORT);
    addrSer.sin_addr.s_addr = inet_addr(SERVER_IP);

    char sendbuf[BUFFER_SIZE];
    char recvbuf[BUFFER_SIZE];
    socklen_t  len = sizeof(struct sockaddr);
    while(1){
        printf("Cli:>");
        scanf("%s",sendbuf);
        if(strncmp(sendbuf, "quit", 4) == 0){ 
            break;
        }   
        sendto(sockCli, sendbuf, strlen(sendbuf)+1, 0, (struct sockaddr*)&addrSer, len);

        recvfrom(sockCli, recvbuf, BUFFER_SIZE, 0, (struct sockaddr*)&addrSer, &len);
        printf("Ser:>%s\n",recvbuf);
    }
    close(sockCli);
    return 0;      
}

(3)、運行結果

服務器端截圖

socket網絡編程

客戶端截圖

socket網絡編程

  服務端的套接字總領全局,不與任何客戶端進行通信,為每一個新的客戶端所分配一個新的套接字,進行通信。

  LISTEN_QUEUE:等待隊列的大小(最多等待多少隊列);

  UDP:必須先知道服務器在哪。



向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女