socket網(wǎng)絡(luò)編程-創(chuàng)新互聯(lián)

1、什么是計算機網(wǎng)絡(luò)?

創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),包頭企業(yè)網(wǎng)站建設(shè),包頭品牌網(wǎng)站建設(shè),網(wǎng)站定制,包頭網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,包頭網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。

 多個計算機進(jìn)行通信--->計算機網(wǎng)絡(luò)。

2、計算機通信的復(fù)雜度

 (1)、傳輸信息的復(fù)雜度(種類、內(nèi)容);

 (2)、信息的數(shù)量

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

 (4)、信息的安全問題

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

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

3、ip地址

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

 (2)、IP地址的復(fù)用導(dǎo)致了數(shù)據(jù)傳遞的復(fù)雜性(ATM,存儲轉(zhuǎn)發(fā)機制;路由機制)。

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

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

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

4、IP地址的分類

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

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

 IP一般分為5類;

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

socket網(wǎng)絡(luò)編程

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

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

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

(2)、子網(wǎng)掩碼:就是將網(wǎng)絡(luò)號設(shè)置為1,主機號設(shè)置為0(對每一個字節(jié)的位進(jìn)行設(shè)置);

 例:C類IP地址,3個字節(jié)網(wǎng)絡(luò)號和一個字節(jié)的主機號;

 1111 1111 1111 1111 1111 1111 0000 0000

    255      .    255    .     255    .    0

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

這還的看C類IP下面有沒有子網(wǎng)劃分,

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

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

 此時對應(yīng)的子網(wǎng)掩碼為:255.255.255.192

 (4)、IOS和TCP/IP

模型分析

socket網(wǎng)絡(luò)編程

 (5)、端口號

 port:唯一標(biāo)識應(yīng)用程序的編號;

我們之間通過QQ、微信、郵箱進(jìn)行收發(fā)數(shù)據(jù)時,沒有導(dǎo)致數(shù)據(jù)的錯亂接收,是怎么做到的呢?又是怎么一一對應(yīng)找到的呢?

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

 我們在進(jìn)行數(shù)據(jù)的發(fā)送時:首先通過IP尋找物理計算機,在根據(jù)port,尋找對應(yīng)的應(yīng)用程序。

(6)、TCP和UDP

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

 TCP協(xié)議和UDP協(xié)議都屬于傳輸層協(xié)議。

 TCP協(xié)議:

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

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

 UDP協(xié)議:

 a、面向無連接的:即就是在進(jìn)行數(shù)據(jù)傳輸?shù)臅r候,不需要預(yù)先創(chuàng)建一個連接;

 b、不可靠的:無法知道發(fā)送的數(shù)據(jù)是否能夠到達(dá)目的,也無法知道什么時候能夠到達(dá)目的。

 c、異步的:

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

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

 模型分析

socket網(wǎng)絡(luò)編程

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

socket網(wǎng)絡(luò)編程

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

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

5、TCP的編程實現(xiàn)

 基礎(chǔ)的socket編程對TCP的就是下面的步驟:

(1)、模型分析

socket網(wǎng)絡(luò)編程

(2)、代碼實現(xiàn)

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

服務(wù)器端代碼:

#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)、運行結(jié)果

socket網(wǎng)絡(luò)編程

socket網(wǎng)絡(luò)編程

6、UDP的編程實現(xiàn)

 基礎(chǔ)的socket編程對UDP的就是下面的步驟:

(1)、模型分析

socket網(wǎng)絡(luò)編程

(2)、代碼實現(xiàn)

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

服務(wù)器端代碼:

#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)、運行結(jié)果

服務(wù)器端截圖

socket網(wǎng)絡(luò)編程

客戶端截圖

socket網(wǎng)絡(luò)編程

 服務(wù)端的套接字總領(lǐng)全局,不與任何客戶端進(jìn)行通信,為每一個新的客戶端所分配一個新的套接字,進(jìn)行通信。

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

 UDP:必須先知道服務(wù)器在哪。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

當(dāng)前名稱:socket網(wǎng)絡(luò)編程-創(chuàng)新互聯(lián)
網(wǎng)站網(wǎng)址:http://muchs.cn/article38/dchcsp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站網(wǎng)站導(dǎo)航、網(wǎng)頁設(shè)計公司、網(wǎng)站制作、定制網(wǎng)站、小程序開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)