udp錯誤
econnrefused
udp既然無連線,怎麼知道遠端的情況呢?udp不正如協議標準描述的那樣,發出去就不管了嗎?對於接收,沒有資料就一直等,如果設定了nowait,則直接返回eagain,表示稍後再試。不管怎麼說,也不會有econnrefused這麼詳細的資訊返回才對啊。
既然udp不會從對端返回任何錯誤資訊,那麼一定有別的什麼返回了,總不能憑空猜測啊。這就涉及到了網路協議設計中的資料平面和控制平面了,對於控制平面的訊息,可以是帶內傳輸,也可以是帶外傳輸。對於tcp而言,無疑是帶內傳輸的,因為它本身就是有連線的協議,協議本身會處理任何的錯誤和異常,然而對於udp而言,因為其設計目的就是保持簡單性,故不再附帶有任何帶內的控制訊息邏輯,網際網路上為了彌補這一類協議的控制邏輯的缺失,icmp協議才顯得尤為重要!實際上,icmp,根據名稱就可以看出它是一種專門的控制協議,控制和指示ip層發生的事件。
econnrefused正是icmp返回的!然而並不是所有的udp socket都可以享用icmp帶來的錯誤提示,畢竟帶外控制訊息和協議本身的關聯太鬆散了。udp socket必須顯式的connect對端才可以。現在問題又來了,既然udp根本就是乙個無連線的協議,connect的意義何在呢?這其實是socket介面設計的範疇,和協議本身沒有任何關係,當乙個udp socket去connect乙個遠端時,並沒有傳送任何的資料報,其效果僅僅是在本地建立了乙個五元組對映,對應到乙個對端,該對映的作用正是為了和udp帶外的icmp控制通道**在一起,使得udp socket的介面含義更加豐滿。
我們知道,icmp錯誤資訊返回時,icmp的包內容就是出錯的那個原始資料報,根據這個原始資料報可以找出乙個五元組,根據該五元組就可以對應到乙個本地的connect過的udp socket,進而把錯誤訊息傳輸給該socket,應用程式在呼叫socket介面函式的時候,就可以得到該錯誤訊息。如果乙個udp socket沒有呼叫過connect,那麼即使有icmp資料報返回,由於socket保持了udp的完整語義,協議棧也就不儲存關於該socket和對端關聯的任何資訊,因此也就無法找到乙個特定的五元組將錯誤碼傳給它。
udp的規則之一就是:當接收到的udp報文的目的埠和當前程序不相符合的時候,傳送icmp報文。
wsaewouldblock
非阻塞時經常出的錯誤,表明暫時沒資料讀,或沒資料寫。
遇到的問題:
1 當客戶端傳送資料時,伺服器突然崩潰,客戶端跟著崩潰。
原因:客戶端響應sigpipe訊息。
解決辦法:
sigset_t set;
sigemptyset(&set);
sigaddset(&set, sigpipe);
sigprocmask(sig_block, &set, null);
centos7連不上網路
centos預設不會建立本地連線,至少在虛擬機器裡是這樣,
1.cd /etc/sysconfig/network-scripts/
2. 開啟裝置,如:vi ifcfg-eth0
......
bootproto=dhcp
onboot=yes
儲存退出。
3.重啟網路
systemlctl restart network
linux網路問題
ip位址配置最簡單的方式 在命令執行setup 帶提示,按照提示修改即可 輸入命令 vi etc sysconfig network 修改以下內容 networking yes hostname server.com 修改的主機名 輸入命令 vi etc sysconfig network scri...
Linux下網路問題
關於啟動網絡卡,如果linux下輸入ifconfig命令,沒有eth0 1.到 etc sysconfig network scripts 目錄看看ifcfg eth 有幾個 2.如何沒有ifcfg eth0,但有ifcfg eth0.bak的話,用mv重新命名,3.在機器上執行service ne...
linux網路相關問題
刪除問題 ifcfg eno2 檔案 直接刪除或者 nmcli con del eno2 重啟reboot systemctl restart network 依然問題存在 在目錄 etc sysconfig network scripts 目錄下還有檔案 ifcfg eno2.nfd78 之類檔案...