1. 程式人生 > >【網路】網路套接字基本概念!!

【網路】網路套接字基本概念!!

IP

  • IP地址是在IP協議裡面標識網路中的不同的主機
  • 在IPV4協議裡面的IP地址是4個位元組,32位
  • 通常使用點分十進位制來表示IP地址,即192.168.2.120,用點來區分每一位

埠號
在每一臺主機裡面執行的程序不是唯一的,所以在程序使用網路資源的時候就需要使用一種標記來標記同一個主機裡面的使用網路資源的程序,即埠號。

  • 一個程序只能佔用多個埠號,但一個埠號可以被一個程序佔用
  • 不使用網路資源的程序沒有埠號

TCP協議(Transmission Control Protocol 傳輸控制協議)

  • 傳輸層協議
  • 有連線
  • 可靠傳輸
  • 面向位元組流

UDP協議P(User Datagram Protocol 使用者資料報協議)

  • 傳輸層協議
  • 無連線
  • 不可靠傳出
  • 面向資料報

    網路位元組序
    在計算機內部傳輸資料的時候存在著大小端的區分,在網路中傳輸資料的時候同樣存在著大小端的區分,但是在不同的機器上面讀取的資料就會產生差異。

    #include <arpa/inet.h>

    uint32_t htonl(uint32_t hostlong);
    uint16_t htons(uint16_t hostshort);
    uint32_t ntohl(uint32_t netlong);
    uint16_t ntohs(uint16_t netshort);

注:n表示network ,h表示host ,l表示long ,s表示short。

socket常見介面

建立socket檔案描述符
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
繫結伺服器IP和埠
  #include <sys/types.h>          /* See NOTES */
  #include <sys/socket.h>
  int bind(int sockfd, const struct sockaddr *addr,
            socklen_t addrlen);
監聽socket
 #include <sys/types.h>          /* See NOTES */
 #include <sys/socket.h>
 int listen(int sockfd, int backlog);
用於接受請求
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
連線客戶端和伺服器
 #include <sys/types.h>          /* See NOTES */
 #include <sys/socket.h>
 int connect(int sockfd, const struct sockaddr *addr,
                   socklen_t addrlen);

sockaddr結構
這裡寫圖片描述
這裡寫圖片描述

通常使用的是sockaddr_in結構體,裡面定義了sin_family來標記型別,sin_port儲存埠號,sin_addr裡面的s_addr來儲存IP地址。
注:使用的時候需要強制轉換成sockaddr*

地址轉換函式

字串轉ip函式
       #include <sys/socket.h>
       #include <netinet/in.h>
       #include <arpa/inet.h>
       int inet_aton(const char *cp, struct in_addr *inp);
       in_addr_t inet_addr(const char *cp);
       in_addr_t inet_network(const char *cp);
ip轉字串函式
       char *inet_ntoa(struct in_addr in);
       struct in_addr inet_makeaddr(int net, int host);
       in_addr_t inet_lnaof(struct in_addr in);
       in_addr_t inet_netof(struct in_addr in);

簡單UDP程式

server.c

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



int main(int argc,char* argv[]){
    int sock = socket(AF_INET,SOCK_DGRAM,0);
    if(sock < 0){
        perror("socket");
        exit(1);
    }
    struct sockaddr_in local;
    local.sin_family =  AF_INET;
    local.sin_port = htons(atoi(argv[2]));
    local.sin_addr.s_addr = inet_addr(argv[1]);
    if(bind(sock,(struct sockaddr*)&local,sizeof(local)) < 0){
        perror("bind");
        exit(2);
    }

    char buf[1024];
    struct sockaddr_in client;

    while(1){
        socklen_t len = sizeof(client);
        ssize_t s =recvfrom(sock,buf,sizeof(buf)-1,0,(struct sockaddr*)&client,&len);
        if(s >0){
            buf[s] = 0;
            printf("[%s:%d]:%s\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port),buf);
            sendto(sock,buf,strlen(buf),0,(struct sockaddr*)&client,sizeof(client));
        }
    }
    return 0;
}

client.c

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


int main(int argc,char* argv[]){
    int sock = socket(AF_INET,SOCK_DGRAM,0);
    if(sock < 0){
        perror("socket");
        exit(1);
    }
    struct sockaddr_in server;
    server.sin_family =  AF_INET;
    server.sin_port = htons(atoi(argv[2]));
    server.sin_addr.s_addr = inet_addr(argv[1]);
    struct sockaddr_in peer;
    char buf[1024];
    while(1){
        socklen_t len = sizeof(peer);
        printf("Please inter:");
        fflush(stdout);
        //ssize_t s = strlen(buf);
        ssize_t s = read(0,buf,sizeof(buf)-1);
        //char* buf = "nihao";  
        if(s > 0){
            buf[s-1] = 0;
            sendto(sock,buf,strlen(buf),0,(struct sockaddr*)&server,sizeof(server));
            ssize_t r =recvfrom(sock,buf,sizeof(buf)-1,0,(struct sockaddr*)&peer,&len);
            if(r > 0){
                buf[r] = 0;
                printf("%s\n",buf);
            }
        }

    }
    return 0;
}

簡單TCP程式

server.c

#include<stdio.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<string.h>
#include<netinet/in.h>
#include<sys/types.h>
#include<unistd.h>


int main(int argc,char* argv[]){
    int sock = socket(AF_INET,SOCK_STREAM,0);
    if(sock < 0){
        perror("socket error");
        return 1;
    }
    struct sockaddr_in local;
    local.sin_family = AF_INET;
    local.sin_port = htons(atoi(argv[2]));
    local.sin_addr.s_addr = inet_addr(argv[1]);


    if(bind(sock,(struct sockaddr*)&local,sizeof(local)) < 0){
        perror("bind");
        return 2;
    }

    if(listen(sock,10) < 0){
        perror("listen");
        return 3;
    }

    struct sockaddr_in client;
    for(;;){
        socklen_t len;
        int new_sock;
        if((new_sock = accept(sock,(struct sockaddr*)&client,&len)) < 0){
            perror("accept");
            return 4;
        }
        char buf_ip[16];
        memset(buf_ip,'\0',sizeof(buf_ip));
        inet_ntop(AF_INET,&client.sin_addr,buf_ip,sizeof(buf_ip));
        printf("Get a connet :ip-->%s  port-->%d\n",buf_ip,ntohs(client.sin_port));

        while(1){
            char buf[1024];
            memset(buf,'\0',sizeof(buf));
            read(new_sock,buf,sizeof(buf));
            printf("client#%s\n ",buf);
            fflush(stdout);
            memset(buf,'\0',sizeof(buf));
            size_t s = read(0,buf,sizeof(buf));
            buf[s] = '\0';
            write(new_sock,buf,strlen(buf));
    }
    return 0;
    }
}

client.c

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

int main(int argc,char* argv[]){
    int sock = socket(AF_INET,SOCK_STREAM,0);
    if(sock < 0){
        perror("socket");
        return 1;
    }
    struct sockaddr_in peer;
    peer.sin_family = AF_INET;
    peer.sin_port = htons(atoi(argv[2]));
    peer.sin_addr.s_addr = inet_addr(argv[1]);

    socklen_t len = sizeof(peer);
    int ret = connect(sock,(struct sockaddr*)&peer,len);
    if(ret < 0){
        perror("connet");
        return 2;
    }

    printf("connet success\n");
    char buf[1024];
    while(1){
        printf("client#");
        ssize_t s = read(0,buf,sizeof(buf));
        if(s < 0){
            perror("read");
            return 3;
        }
        buf[s-1] = '\0';
        write(sock,buf,strlen(buf));
        if(strcmp(buf,"quit") == 0){
            printf("quit\n");
            return 0;
        }
        read(sock,buf,sizeof(buf));
        printf("server:# %s\n",buf);
    }
    close(sock);
    return 0;
}

相關推薦

網路網路基本概念

IP IP地址是在IP協議裡面標識網路中的不同的主機 在IPV4協議裡面的IP地址是4個位元組,32位 通常使用點分十進位制來表示IP地址,即192.168.2.120,用點來區分每一位 埠號 在每一臺主機裡面執行的程序不是唯一的,所以在程序使用網路資

正在等待可用解決方法

地址欄 nal net 方法 ima sockets 等待 inf http 問題:使用chrome瀏覽器訪問公司的web產品時,一直提示 正在等待可用的套接字。。。。,頁面常常加載不出來 解決方法: 步驟1:在chrome瀏覽器地址欄輸入:chrome://net-i

網路程式設計——原始實現原理

目錄 1. 基礎知識  1.1、概述 1.2、鏈路層原始套接字  1.3、網路層原始套接字 2、原始套接字的實現 2.1  原始套接字報文收發流程 2.2鏈路層原始套接字的實現     2.2.1  套接字建

Linux網路程式設計——原始程式設計

原始套接字的建立 int socket ( int family, int type, int protocol ); 引數: family:協議族 這裡寫 PF_PACKET type:  套接字類,這裡寫 SOCK_RAW protocol:協議類別,指定可以接收或傳送的資料包型別,不能寫

MySQL技術內幕13-檔案和pid檔案

1、套接字檔案 前面提到過,在UNX系統下本地連線 MySQL可以採用UNX域套接字方式,這種方式需要一個套接字( socket)檔案。套接字檔案可由引數 socket控制。一般在/tmp目錄下,名為 mysql. sock: mysql> SHOW VARIABL

嵌入式Linux網路程式設計,網路基礎,socket(SOCK_STREAM、SOCK_DGRAM、SOCK_RAW),IP地址,埠號,位元組序,位元組序轉換函式,IP地址的轉換

文章目錄 1,socket 1.1,socket的型別(SOCK_STREAM、SOCK_DGRAM、SOCK_RAW) 1.2,socket的位置 2,IP地址 2.1,特殊IP地址: 3,埠號

Linux網路程式設計——原始例項:MAC 頭部報文分析

通過《Linux網路程式設計——原始套接字程式設計》得知,我們可以通過原始套接字以及 recvfrom( ) 可以獲取鏈路層的資料包,那我們接收的鏈路層資料包到底長什麼樣的呢? MAC 頭部(有線區域網) 注意:CRC、PAD 在組包時可以忽略 鏈路層資料包的其中一

Linux 網路程式設計——原始例項:MAC 地址掃描器

如果 A (192.168.1.1 )向 B (192.168.1.2 )傳送一個數據包,那麼需要的條件有 ip、port、使用的協議(TCP/UDP)之外還需要 MAC 地址,因為在乙太網資料包中 MAC 地址是必須要有的。那麼怎樣才能知道對方的 MAC 地址?答案是:它通

Linux 網路程式設計——原始例項:傳送 UDP 資料包

乙太網(Ethernet)報文格式(MAC頭部報文格式): IP 報文格式: UDP 報文格式: 校驗和函式: /******************************************************* 功能:     

網路程式設計——1. 理解網路程式設計和

1.1 理解網路程式設計和套接字 網路程式設計和套接字概要 1)首先需要物理連線,如今大部分計算機都已經連線到網際網路,因此不用擔心這一點 2)資料傳輸軟體。作業系統會提供名為“套接字”的部件,套接字是網路資料傳輸用的軟體裝置。 構建接電話套接字 1)安裝電

《TCP/IP網路程式設計》第一章:理解網路程式設計和 筆記

第一章:理解網路程式設計和套接字 本章程式碼,在TCP-IP-NetworkNote中可以找到。 1.1 理解網路程式設計和套接字 1.1.1構建打電話套接字 以電話機打電話的方式來理解套接字。 呼叫 socket 函式(安裝電話機)時進行的對話: 問:接

Windows Socket 網路程式設計(二) —— 程式設計原理

 一、客戶機/伺服器模式在TCP/IP網路中兩個程序間的相互作用的主機模式是客戶機/伺服器模式(Client/Server model)。該模式的建立基於以下兩點:1、非對等作用;2、通訊完全是非同步的。客戶機/伺服器模式在操作過程中採取的是主動請示方式:首先伺服器方要先啟動

Linux網路程式設計 tcp程式碼

本次介紹一下TCP協議下的套接字程式碼,總體來看,tcp協議比udp協議更加安全可靠,無論是從使用者使用的角度還是從編寫程式碼的角度,你會發現與udp不同的是tcp在每次通訊前,伺服器端和客戶端都會進行一次連線,連線成功後,才可以進行相互間的通訊。 套接字

網路IPC:

網路程序間通訊:socket API簡介 不同計算機(通過網路相連)上執行的程序相互通訊機制稱為網路程序間通訊(network IPC)。 在本地可以通過程序PID來唯一標識一個程序,但是在網路中這是行不通的。其實TCP/IP協議族已經幫我們解決了這個問題,網路層的“ip地址”可以唯一標識網路中的主機,而

Linux網路程式設計之選項設定

轉自 http://blog.csdn.net/chenjin_zhong/article/details/7268939 1.介紹 在Linux網路程式設計中,有時需要設定地址複用,允許傳送廣播包,將主機加入某個多播組,設定傳送與接收緩衝區的大小,設定傳送與接收的超

python 網路程式設計 TCP例項

一. 伺服器端程式碼tcpServer.py: from socket import * from time import ctime #HOST變數為空,表示bind()函式可以繫結在所有有效的地址上 HOST = '' PORT = 21234 #設定緩衝大小為1

linux網路程式設計之介面)、ip、埠理解

它是網路通訊過程中端點的抽象表示,包含進行網路通訊必需的五種資訊:連線使用的協議,本地主機的IP地址,本地程序的協議埠,遠地主機的IP地址,遠地程序的協議埠。或者說,套接字,是支援TCP/IP的網路通訊的基本操作單元,可以看做是不同主機之間的程序進行雙向通訊的端點,簡單的說就是通訊的兩方的一種約定,用套接字中

網路程式設計二(Socket、客戶端和服務端通訊問題)

在客戶機/伺服器工作模式中,在Server端,要準備接受多個Client端計算機的通訊。為此,除用IP地址標識Internet上的計算機之外,另還引入埠號,用埠號標識正在Server端後臺服務的執行緒。埠號與IP地址的組合稱為網路套接字(socket)。 Java語言在

UNIX再學習 -- 網路IPC:

一、基本概念1、程式設計介面什麼是伯克利套接字(Berkeley Socket)?美國加利福尼亞大學比克利分校於 1983年釋出 4.2 BSD Unix 系統。其中包含一套用 C 語言編寫的應用程式開

網路程式設計——Socket()

網路程式設計     網路程式設計的目的就是指直接或間接地通過網路協議與其他計算機進行通訊。網路程式設計中 有兩個主要的問題,一個是如何準確的定位網路上一臺或多臺主機,另一個就是找到主機後 如何可靠高效的進行資料傳輸。在TCP/IP協議中IP層主要負責網路