1. 程式人生 > >Linux網路程式設計 tcp套接字程式碼

Linux網路程式設計 tcp套接字程式碼

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

套接字API

TCP套接字的API主要有以下幾個:

//建立套接字
int socket(int domain, int type, int protocol);

//繫結埠號和IP地址,需要定義struct sockaddr_in結構體
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

//開始監聽
int listen(int sockfd, int backlog); //等待客戶端連線,儲存地址到addr int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); //客戶端請求連線服務端 int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen); //從套接字讀取資料,recv和read用法一樣 ssize_t recv(int sockfd, void *buf, size_t len, int flags); ssize_t read(int
fd, void *buf, size_t count); //寫入資料到套接字,send和write用法一樣 ssize_t send(int sockfd, const void *buf, size_t len, int flags); ssize_t write(int fd, const void *buf, size_t count);

TCP套接字伺服器程式碼

建立套接字

int sock_listen = socket(AF_INET,SOCK_STREAM ,0);
if(sock_listen < 0){
   perror("socket");
   return
1; }

socket函式的引數分別是AF_INET表示IPv4網路,SOCK_STREAM表示使用TCP協議

進行埠號繫結

//2.繫結
typedef struct sockaddr sockaddr;
typedef struct sockaddr_in sockaddr_in;

sockaddr_in local;
local.sin_family = AF_INET;
local.sin_addr.s_addr = inet_addr(argv[1]);
local.sin_port = htons(atoi(argv[2]));

if( bind(sock_listen, (sockaddr*)&local,  sizeof(local) ) < 0  ) {
    perror("bind");
    return 3;
}

先定義一個sturct sockaddr型別的變數,在對結構體的各個變數賦值,使用bind()函式進行繫結。

到目前為止,tcp和udp的步驟是一樣的,都是先建立建立套接字,在將套接字和埠號,IP地址進行繫結。

進行監聽

if(listen(sock_listen, 5) < 0){
    perror("listen error\n");
    return 3;
}

使用listen()設定套接字處於監聽狀態,成功返回0,失敗返回-1,第一個引數就是剛才建立的套接字檔案描述符,第二個引數表示最多允許有多少backbacklog個客戶端處於連線狀態,如果接收到更多的連線請求就忽略,這裡設定的不會太大(一般為5)。

接受連線

//4.連結客戶端
sockaddr_in client;
socklen_t len = sizeof(client);

int sock_work = accept(sock_listen, (sockaddr*)&client, &len );
if(sock_work < 0){
    perror("accept");
    continue;
}
printf("[%d] client accept success!!\n",sock_work);

伺服器在三次握手完成後,呼叫accept()接受連線,如果伺服器呼叫accept()時還沒有客戶端的連線請求,就阻塞等待直到 有客戶端連線上來。addr是⼀個傳出引數,accept()返回時傳出客戶端的地址和端⼝號;如果給addr 引數傳NULL,表⽰不關⼼客戶端的地址。addrlen引數是⼀個傳⼊傳出引數(value-result argument), 傳⼊的是調⽤者提供的, 緩衝區addr的⻓度以避免緩衝區溢位問題, 傳出的是客戶端地址結構體的實際⻓度(有可能沒有佔滿調⽤者提供的緩衝區);

讀取發發送資料

如同讀取普通檔案一樣,可以使用read和write直接對套接字進行讀寫,要注意的是這裡的套接字,並不是最開始建立的那個套接字,而是在呼叫accept()後返回的那個檔案描述符,這也是和udp不同的地方。tcp有兩個套接字,第一個由我們建立,用於監聽,當有客戶端連入時,變返回另外一個套接字,這個是套接字是主要用來讀取,寫入資料的。

TCP客戶端套接字程式碼

客戶端與伺服器端不同的僅僅是客戶端不需要進行埠號繫結,和不需要接受連線,因為客戶端總是發起連線(請求連線)的一方。

相對的客戶端就多了一個請求連線的步驟

int ret = connect(sock_client, (sockaddr*)&server, sizeof(server));
if(ret < 0){
    perror("connect");
    return 1;
}

客戶端需要調⽤connect()連線伺服器。connectbind的引數形式⼀致, 區別在於bind的引數是⾃⼰的地址, ⽽connect的引數是對⽅的地址。connect()成功返回0,出錯返回-1

測試

當我們執行起伺服器端時,可以使用 netstatshell指令來顯示網路連線,路由表,介面狀態,偽裝連線,網路鏈路資訊和組播成員組。

netstat -lntp

來顯示正在偵聽的套接字。

這裡寫圖片描述

相關推薦

Linux網路程式設計 tcp程式碼

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

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

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

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 報文格式: 校驗和函式: /******************************************************* 功能:     

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的網路通訊的基本操作單元,可以看做是不同主機之間的程序進行雙向通訊的端點,簡單的說就是通訊的兩方的一種約定,用套接字中

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

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

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

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

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

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

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

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

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

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

網路程式設計——Socket()

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

python網路程式設計、HTTP協議

網路程式設計  網路目的 : 資料的傳輸 網路資料傳輸是一個複雜的過程 OSI 七層模型 --》 網路通訊標準化流程 應用層 : 提供使用者服務,具體內容由特定程式規定 表示層 : 資料的壓縮優化  會話層 : 建立應用連線,選擇傳輸層服務

Python之路(第三十一篇) 網路程式設計:簡單的tcp通訊、粘包現象

  一、簡單的tcp套接字通訊 套接字通訊的一般流程 服務端 server = socket() #建立伺服器套接字 server.bind() #把地址繫結到套接字,網路地址加埠 server.listen() #監聽連結 inf_loop:

UNIX網路程式設計——基本TCP程式設計 【轉貼】

一、基於TCP協議的網路程式 下圖是基於TCP協議的客戶端/伺服器程式的一般流程:                             &

嵌入式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,埠號

TCP程式設計 整理《計算機網路——自頂向下方法(James F. Kurose, Keith W. Rose)》

       與UDP不同,TCP是一個面向連線的協議。這意味著,在客戶端和伺服器能夠開始互相傳送資料之前,它們要先握手和建立一個TCP連線。連線建立之後,當有一方需要給另一方傳送資料,它只需經套接字把資料丟個TCP連線,無需再為資料附上目的地地址。1. 下面討論一下TCP客

網路程式設計基礎 & 基本TCP程式設計-基本函式

套接字基礎 一個通用套接字地址結構sockaddr: struct sockaddr { unsigned short sa_family; //套接字的協議簇地址型別,AF_XX char sa_data[14];//儲存