在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

談談socket網(wǎng)絡編程的5大隱患

dyquk4xk2p3d ? 來源:良許Linux ? 2023-10-07 14:38 ? 次閱讀

1.忽略返回狀態(tài)

第一個隱患很明顯,但它是開發(fā)新手最容易犯的一個錯誤。如果您忽略函數(shù)的返回狀態(tài),當它們失敗或部分成功的時候,您也許會迷失。反過來,這可能傳播錯誤,使定位問題的源頭變得困難。

捕獲并檢查每一個返回狀態(tài),而不是忽略它們??紤]清單 1 顯示的例子,一個套接字 send 函數(shù)。

清單 1. 忽略 API 函數(shù)返回狀態(tài)

int status, sock, mode;
/* Create a new stream (TCP) socket */
sock = socket( AF_INET, SOCK_STREAM, 0 );
...
status = send( sock, buffer, buflen, MSG_DONTWAIT );

if (status == -1)

{

/* send failed */ printf( "send failed: %s ", strerror(errno) );

}

else

{

/* send succeeded -- or did it? */ }

清單 1 探究一個函數(shù)片斷,它完成套接字 send 操作(通過套接字發(fā)送數(shù)據(jù))。函數(shù)的錯誤狀態(tài)被捕獲并測試,但這個例子忽略了 send 在無阻塞模式(由 MSG_DONTWAIT 標志啟用)下的一個特性。

send API 函數(shù)有三類可能的返回值:

如果數(shù)據(jù)成功地排到傳輸隊列,則返回 0。

如果排隊失敗,則返回 -1(通過使用 errno 變量可以了解失敗的原因)。

如果不是所有的字符都能夠在函數(shù)調(diào)用時排隊,則最終的返回值是發(fā)送的字符數(shù)。

由于 send 的 MSG_DONTWAIT 變量的無阻塞性質(zhì),函數(shù)調(diào)用在發(fā)送完所有的數(shù)據(jù)、一些數(shù)據(jù)或沒有發(fā)送任何數(shù)據(jù)后返回。在這里忽略返回狀態(tài)將導致不完全的發(fā)送和隨后的數(shù)據(jù)丟失。

2.對等套接字閉包

UNIX 有趣的一面是你幾乎可以把任何東西看成是一個文件。文件本身、目錄、管道、設備和套接字都被當作文件。這是新穎的抽象,意味著一整套的 API 可以用在廣泛的設備類型上。

考慮 read API 函數(shù),它從文件讀取一定數(shù)量的字節(jié)。read 函數(shù)返回讀取的字節(jié)數(shù)(最高為您指定的最大值);或者 -1,表示錯誤;或者 0,如果已經(jīng)到達文件末尾。

如果在一個套接字上完成一個 read 操作并得到一個為 0 的返回值,這表明遠程套接字端的對等層調(diào)用了 close API 方法。該指示與文件讀取相同 —— 沒有多余的數(shù)據(jù)可以通過描述符讀?。▍⒁?清單 2)。

清單 2.適當處理 read API 函數(shù)的返回值

int sock, status;
sock = socket( AF_INET, SOCK_STREAM, 0 );
...
status = read( sock, buffer, buflen );

if (status > 0)

{

/* Data read from the socket */

}

else if (status == -1)

{

/* Error, check errno, take action... */

}

else if (status == 0)

{

/* Peer closed the socket, finish the close */ close( sock ); /* Further processing... */ }

同樣,可以用 write API 函數(shù)來探測對等套接字的閉包。在這種情況下,接收 SIGPIPE 信號,或如果該信號阻塞,write 函數(shù)將返回 -1 并設置 errno 為 EPIPE。

3.地址使用錯誤(EADDRINUSE)

你可以使用 bind API 函數(shù)來綁定一個地址(一個接口和一個端口)到一個套接字端點??梢栽诜掌髟O置中使用這個函數(shù),以便限制可能有連接到來的接口。也可以在客戶端設置中使用這個函數(shù),以便限制應當供出去的連接所使用的接口。bind 最常見的用法是關聯(lián)端口號和服務器,并使用通配符地址(INADDR_ANY),它允許任何接口為到來的連接所使用。

bind 普遍遭遇的問題是試圖綁定一個已經(jīng)在使用的端口。該陷阱是也許沒有活動的套接字存在,但仍然禁止綁定端口(bind 返回 EADDRINUSE),它由 TCP 套接字狀態(tài) TIME_WAIT 引起。該狀態(tài)在套接字關閉后約保留 2 到 4 分鐘。在 TIME_WAIT 狀態(tài)退出之后,套接字被刪除,該地址才能被重新綁定而不出問題。

等待 TIME_WAIT 結束可能是令人惱火的一件事,特別是如果您正在開發(fā)一個套接字服務器,就需要停止服務器來做一些改動,然后重啟。幸運的是,有方法可以避開 TIME_WAIT 狀態(tài)??梢越o套接字應用 SO_REUSEADDR 套接字選項,以便端口可以馬上重用。

考慮清單 3 的例子。在綁定地址之前,我以 SO_REUSEADDR 選項調(diào)用 setsockopt。為了允許地址重用,我設置整型參數(shù)(on)為 1 (不然,可以設為 0 來禁止地址重用)。

清單 3.使用 SO_REUSEADDR 套接字選項避免地址使用錯誤

int sock, ret, on;
struct sockaddr_in servaddr;
/* Create a new stream (TCP) socket */
sock = socket( AF_INET, SOCK_STREAM, 0 ):
/* Enable address reuse */
on = 1;
ret = setsockopt( sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on) );
/* Allow connections to port 8080 from any available interface */
memset( &servaddr, 0, sizeof(servaddr) );
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl( INADDR_ANY );
servaddr.sin_port = htons( 45000 );
/* Bind to the address (interface/port) */
ret = bind( sock, (struct sockaddr *)&servaddr, sizeof(servaddr) );

在應用了 SO_REUSEADDR 選項之后,bind API 函數(shù)將允許地址的立即重用。

4.發(fā)送結構化數(shù)據(jù)

套接字是發(fā)送無結構二進制字節(jié)流或 ASCII 數(shù)據(jù)流(比如 HTTP 上的 HTTP 頁面,或 SMTP 上的電子郵件)的完美工具。但是如果試圖在一個套接字上發(fā)送二進制數(shù)據(jù),事情將會變得更加復雜。

比如說,您想要發(fā)送一個整數(shù):你可以肯定,接收者將使用同樣的方式來解釋該整數(shù)嗎?運行在同一架構上的應用程序可以依賴它們共同的平臺來對該類型的 數(shù)據(jù)做出相同的解釋。但是,如果一個運行在高位優(yōu)先的 IBM PowerPC 上的客戶端發(fā)送一個 32 位的整數(shù)到一個低位優(yōu)先的 Intel x86,那將會發(fā)生什么呢?字節(jié)排列將引起不正確的解釋。

字節(jié)交換還是不呢?

Endianness是指內(nèi)存中字節(jié)的排列順序。高位優(yōu)先(big endian)按最高有效字節(jié)在前排列,然而低位優(yōu)先(little endian)按照最低有效字節(jié)在前排序。

高位優(yōu)先架構(比如 PowerPC)比低位優(yōu)先架構(比如 Intel Pentium 系列,其網(wǎng)絡字節(jié)順序是高位優(yōu)先)有優(yōu)勢。這意味著,對高位優(yōu)先的機器來說,在 TCP/IP 內(nèi)控制數(shù)據(jù)是自然有序的。低位優(yōu)先架構要求字節(jié)交換 —— 對網(wǎng)絡應用程序來說,這是一個輕微的性能弱點。

通過套接字發(fā)送一個 C 結構會怎么樣呢?這里,也會遇到麻煩,因為不是所有的編譯器都以相同的方式排列一個結構的元素。結構也可能被壓縮以便使浪費的空間最少,這進一步使結構中的元素錯位。

幸好,有解決這個問題的方案,能夠保證兩端數(shù)據(jù)的一致解釋。過去,遠程過程調(diào)用(Remote Procedure Call,RPC)套裝工具提供所謂的外部數(shù)據(jù)表示(External Data Representation,XDR)。XDR 為數(shù)據(jù)定義一個標準的表示來支持異構網(wǎng)絡應用程序通信的開發(fā)。

現(xiàn)在,有兩個新的協(xié)議提供相似的功能。可擴展標記語言/遠程過程調(diào)用(XML/RPC)以 XML 格式安排 HTTP 上的過程調(diào)用。數(shù)據(jù)和元數(shù)據(jù)用 XML 進行編碼并作為字符串傳輸,并通過主機架構把值和它們的物理表示分開。SOAP 跟隨 XML-RPC,以更好的特性和功能擴展了它的思想。,獲取更多關于每個協(xié)議的信息。

5.TCP 中的幀同步假定

TCP 不提供幀同步,這使得它對于面向字節(jié)流的協(xié)議是完美的。這是 TCP 與 UDP(User Datagram Protocol,用戶數(shù)據(jù)報協(xié)議)的一個重要區(qū)別。UDP 是面向消息的協(xié)議,它保留發(fā)送者和接收者之間的消息邊界。TCP 是一個面向流的協(xié)議,它假定正在通信的數(shù)據(jù)是無結構的,如圖 1 所示。

圖 1.UDP 的幀同步能力和缺乏幀同步的 TCP

360711f0-5e6d-11ee-939d-92fbcf53809c.png

圖 1 的上部說明一個 UDP 客戶端和服務器。左邊的對等層完成兩個套接字的寫操作,每個 100 字節(jié)。協(xié)議棧的 UDP 層追蹤寫的數(shù)量,并確保當右邊的接收者通過套接字獲取數(shù)據(jù)時,它以同樣數(shù)量的字節(jié)到達。換句話說,為讀者保留了寫者提供的消息邊界。

現(xiàn)在,看圖 1 的底部.它為 TCP 層演示了相同粒度的寫操作。兩個獨立的寫操作(每個 100 字節(jié))寫入流套接字。但在本例中,流套接字的讀者得到的是 200 字節(jié)。協(xié)議棧的 TCP 層聚合了兩次寫操作。這種聚合可以發(fā)生在 TCP/IP 協(xié)議棧的發(fā)送者或接收者中任何一方。重要的是,要注意到聚合也許不會發(fā)生 —— TCP 只保證數(shù)據(jù)的有序發(fā)送。

對大多數(shù)開發(fā)人員來說,該陷阱會引起困惑。您想要獲得 TCP 的可靠性和 UDP 的幀同步。除非改用其他的傳輸協(xié)議,比如流傳輸控制協(xié)議(STCP),否則就要求應用層開發(fā)人員來實現(xiàn)緩沖和分段功能。

調(diào)試套接字應用程序的工具

GNU/Linux 提供幾個工具,它們可以幫助您發(fā)現(xiàn)套接字應用程序中的一些問題。此外,使用這些工具還有教育意義,而且能夠幫助解釋應用程序和 TCP/IP 協(xié)議棧的行為。在這里,您將看到對幾個工具的概述。查閱下面的 了解更多的信息。

查看網(wǎng)絡子系統(tǒng)的細節(jié)

netstat 工具提供查看 GNU/Linux 網(wǎng)絡子系統(tǒng)的能力。使用 netstat,可以查看當前活動的連接(按單個協(xié)議進行查看),查看特定狀態(tài)的連接(比如處于監(jiān)聽狀態(tài)的服務器套接字)和許多其他的信息。清單 4 顯示了 netstat 提供的一些選項和它們啟用的特性。

清單 4.netstat 實用程序的用法模式

View all TCP sockets currently active
$ netstat --tcp
View all UDP sockets
$ netstat --udp
View all TCP sockets in the listening state
$ netstat --listening
View the multicast group membership information
$ netstat --groups
Display the list of masqueraded connections
$ netstat --masquerade
View statistics for each protocol
$ netstat --statistics

盡管存在許多其他的實用程序,但 netstat 的功能很全面,它覆蓋了 route、ifconfig 和其他標準 GNU/Linux 工具的功能。

監(jiān)視流量

可以使用 GNU/Linux 的幾個工具來檢查網(wǎng)絡上的低層流量。tcpdump 工具是一個比較老的工具,它從網(wǎng)上“嗅探”網(wǎng)絡數(shù)據(jù)包,打印到 stdout 或記錄在一個文件中。該功能允許查看應用程序產(chǎn)生的流量和 TCP 生成的低層流控制機制。一個叫做 tcpflow 的新工具與 tcpdump 相輔相成,它提供協(xié)議流分析和適當?shù)刂貥嫈?shù)據(jù)流的方法,而不管數(shù)據(jù)包的順序或重發(fā)。清單 5 顯示 tcpdump 的兩個用法模式。

清單 5.tcpdump 工具的用法模式

Display all traffic on the eth0 interface for the local host
$ tcpdump -l -i eth0
Show all traffic on the network coming from or going to host plato
$ tcpdump host plato
Show all HTTP traffic for host camus
$ tcpdump host camus and (port http)
View traffic coming from or going to TCP port 45000 on the local host
$ tcpdump tcp port 45000

tcpdump 和 tcpflow 工具有大量的選項,包括創(chuàng)建復雜過濾表達式的能力。查閱下面的 獲取更多關于這些工具的信息。

tcpdump 和 tcpflow 都是基于文本的命令行工具。如果您更喜歡圖形用戶界面(GUI),有一個開放源碼工具 Ethereal 也許適合您的需要。Ethereal 是一個專業(yè)的協(xié)議分析軟件,它可以幫助調(diào)試應用層協(xié)議。它的插入式架構(plug-in architecture)可以分解協(xié)議,比如 HTTP 和您能想到的任何協(xié)議(寫本文的時候共有 637 個協(xié)議)。

總結

套接字編程是容易而有趣的,但是您要避免引入錯誤或至少使它們?nèi)菀妆话l(fā)現(xiàn),這就需要考慮本文中描述的這 5 個常見的陷阱,并且采用標準的防錯性程序設計實踐。 GNU/Linux 工具和實用程序還可以幫助發(fā)現(xiàn)一些程序中的小問題。 記?。涸诓榭磳嵱贸绦虻膸椭謨詴r候,跟蹤相關的或“請參見”工具。您也許會發(fā)現(xiàn)一個必要的新工具。





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 交換機
    +關注

    關注

    21

    文章

    2726

    瀏覽量

    101458
  • SMTP
    +關注

    關注

    0

    文章

    32

    瀏覽量

    12157
  • RPC
    RPC
    +關注

    關注

    0

    文章

    111

    瀏覽量

    11815
  • UDP協(xié)議
    +關注

    關注

    0

    文章

    70

    瀏覽量

    13053
  • TCP通信
    +關注

    關注

    0

    文章

    146

    瀏覽量

    4480

原文標題:socket 網(wǎng)絡編程的 5 大隱患

文章出處:【微信號:良許Linux,微信公眾號:良許Linux】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    基于UDP協(xié)議的Socket網(wǎng)絡編程模式的實現(xiàn)

    傳輸層進行網(wǎng)絡通信編程的接口是Socket&它是通用的開發(fā)網(wǎng)絡通信程序標準) 本文介紹了基于UDP協(xié)議Socket
    發(fā)表于 09-09 15:10 ?42次下載

    Linux下基于Socket網(wǎng)絡編程

    linux開發(fā)編程教程資料——Linux下基于Socket網(wǎng)絡編程,感興趣的小伙伴們可以看一看。
    發(fā)表于 08-23 16:23 ?0次下載

    Linux-socket網(wǎng)絡編程

    linux開發(fā)編程教程資料——Linux-socket網(wǎng)絡編程,感興趣的小伙伴們可以看一看。
    發(fā)表于 08-23 16:23 ?0次下載

    Linux下Socket網(wǎng)絡編程

    linux開發(fā)編程教程資料——Linux下Socket網(wǎng)絡編程,感興趣的小伙伴們可以看一看。
    發(fā)表于 08-23 16:23 ?0次下載

    linux-網(wǎng)絡編程-socket編程

    linux開發(fā)編程教程資料——linux-網(wǎng)絡編程-socket編程,感興趣的小伙伴們可以看一看。
    發(fā)表于 08-23 16:23 ?0次下載

    Socket網(wǎng)絡編程

    計算機學習相關知識學習教程之Socket網(wǎng)絡編程
    發(fā)表于 09-01 15:01 ?0次下載

    TCP-IP_Socket網(wǎng)絡編程

    網(wǎng)絡編程的基礎知識--TCP-IP_Socket網(wǎng)絡編程
    發(fā)表于 09-01 15:01 ?0次下載

    vc-網(wǎng)絡編程(socket)詳解

    vc編程---網(wǎng)絡編程(socket)詳解,感興趣的可以看看。
    發(fā)表于 09-01 15:27 ?0次下載

    Windows Socket網(wǎng)絡編程(二) —套接字編程原理

    Windows-Socket-網(wǎng)絡編程教程,感興趣的可以看看。
    發(fā)表于 09-01 15:27 ?0次下載

    Socket網(wǎng)絡基礎編程

    10.2.1 socket概述 1.socket定義 在Linux中的網(wǎng)絡編程是通過socket接口來進行的。人們常說的
    發(fā)表于 10-18 17:13 ?3次下載

    Socket 網(wǎng)絡編程框架介紹

    Socket 網(wǎng)絡編程框架 Socket(套接字)是一個網(wǎng)絡編程概念,描述了一個通信端點(End
    的頭像 發(fā)表于 11-09 14:19 ?1436次閱讀
    <b class='flag-5'>Socket</b> <b class='flag-5'>網(wǎng)絡</b><b class='flag-5'>編程</b>框架介紹

    如何理解socket編程接口

    Socket編程接口是一種網(wǎng)絡編程的基本概念,它提供了一種在不同計算機之間進行通信的方法。 Socket
    的頭像 發(fā)表于 08-16 10:48 ?842次閱讀

    什么是socket編程 socket與tcp/ip協(xié)議的關系

    什么是Socket編程 Socket編程是一種網(wǎng)絡編程技術,它允許程序之間進行通信。在計算機科學
    的頭像 發(fā)表于 11-01 16:01 ?1083次閱讀

    C語言中的socket編程基礎

    Socket編程簡介 Socket是一種通信機制,允許程序之間進行通信。在C語言中,socket編程網(wǎng)
    的頭像 發(fā)表于 11-01 16:51 ?1086次閱讀

    socket 編程基礎入門

    Socket 編程基礎入門 在計算機網(wǎng)絡中,Socket 是一個抽象層,它將網(wǎng)絡通信的細節(jié)隱藏起來,為開發(fā)者提供了一個簡單的接口來發(fā)送和接收
    的頭像 發(fā)表于 11-12 14:03 ?900次閱讀
    主站蜘蛛池模板: 日日夜夜噜 | 日韩成人在线影院 | 波多野结衣在线观看一区 | 久久美女性网 | 俺去俺来也www色官网免费的 | 91大神亚洲影视在线 | 4438x五月天| 天天综合色一区二区三区 | 污视频18高清在线观看 | 日本高清黄色 | 黄色片xxxx | 国产午夜精品理论片 | 中国一级特黄真人毛片 | 能看的黄网 | 欧美一级特黄乱妇高清视频 | 三及毛片| 日本高清视频网站www | 天天摸日日碰天天看免费 | 爱夜夜性夜夜夜夜夜夜爽 | 亚洲一区二区三区高清 | 欧美在线色视频 | 色免费在线观看 | 丁香综合五月 | 亚洲国产精品丝袜在线观看 | 26uuu另类亚洲欧美日本一 | 久久v| 深夜大尺度视频在线观看 | 成人国产精品高清在线观看 | 色成人综合 | 国产特黄1级毛片 | 高清视频在线观看+免费 | 四虎最新网址入口 | 波多野结衣在线观看一区二区 | 性欧美高清极品xx | 综合欧美一区二区三区 | 二区三区视频 | 在线免费看 | 男女性生动态免费视频 | 午夜精品网 | 97影院理论午夜论不卡 | 亚洲午夜影视 |