UDP中recvfrom函式與sendto函式分析
一.UDP客戶伺服器程式的套接字模型
與tcp伺服器相比較的優缺點:
二、函式解析
#include <sys/socket.h> ssize_t recvfrom(int sockfd, void *buf, size_t nbytes, int flags, struct sockaddr *from, socklen_t *addrlen); ssize_t sendto(int sockfd, const void *buf, size_t nsize, int flags, const struct sockaddr *to, const socklen_t *addrlen); 若成功,均返回讀或者寫的位元組數;失敗則返回-1
函式的細節要點分析:
1、recvfrom和sendto的前三個引數與recv和send一模一樣。
2、recv中引數from,addrlen都是值-結果引數,from指標指向資料發報者的協議地址的套接字地址結構,而addrlen指標則指向地址結構的位元組數返回給呼叫者(與accept函式的最後倆個引數相似, 返回給呼叫者,處理完請求後,呼叫sendto函式)。
3、在recvfrom函式中如果不在乎資料發報者的地址,可必須同時設定from和addrlen引數為NULL。
4、在UDP協議中返回長度為0的資料是可行的。因為在UDP的情況下,他會形成20位元組的ip首部(IPv4)和一個8位元組的UDP首部而沒有資料的IP資料報。所以UDP是無連線。
5、sendto和recvfrom在tcp函式中也是通用的。
三、sendto與recvfrom緩衝分析
send和sendto函式在UDP層沒有輸出緩衝區,在TCP層有輸出緩衝區,recv和recvfrom無論在UDP層還是TCP層都有接收緩衝區。這樣看來sendto應該是不會阻塞的。
UDP傳送緩衝區和接收緩衝區細節分析:
1、這一次我們展示的套介面傳送緩衝區用虛框表示,因為它並不存在。UDP套介面有傳送緩衝區大小(SO_SNDBUF修改),不過它僅僅是寫到套介面的UDP資料報的大小上限。 如果應用程式寫一個大於套介面傳送緩衝區大小的資料報,核心將返回一個EMSGSIZE錯誤。 既然UDP不可靠,他不必儲存應用程序的資料拷貝,因此無需真正的傳送緩衝區(應用程序的資料在沿協議棧往下傳遞,以某種形式拷貝到核心緩衝區,然而資料鏈路層在送出資料之後將丟棄該拷貝)
2、UDP沒有MSS(最大分節大小)的概念,如果某個UDP應用程式傳送大資料,那麼他比TCP應用程式更容易分片。從UDP套介面 write成功返回僅僅表示使用者寫入的資料報或者所有片段已經加入到資料鏈路層的輸出佇列。如果該佇列沒有足夠的空間存放該資料報或者他的某個片段,核心 通常返回給應用程序一個ENOBUFS錯誤(也有的系統不會返回錯誤)。
3、TCP和UDP都擁有套介面接收緩衝區。TCP套介面接收緩衝區不可能溢位,因為TCP具有流量控制(視窗).然而對於TCP來說, 當接收到的資料報裝不進套介面接收緩衝區時,該資料報就丟棄 。UDP是沒有流量控制的:較快的傳送端可以很容易淹沒較慢的接收端,導致接收端的UDP丟棄資料報。
相關推薦
UDP中recvfrom函式與sendto函式分析
一.UDP客戶伺服器程式的套接字模型 與tcp伺服器相比較的優缺點: 二、函式解析 #include <sys/socket.h> ssize_t recvfrom(int sockfd, void *buf, size_t nbytes, int
派生類的建構函式和解構函式和多繼承中的二義性與虛擬函式
解構函式主要作用是對資料成員初始化。 1派生類的建構函式 派生類的建構函式定義的一般形式為: 派生類名::派生類名(基類所需形參,本類成員所需形參):基類1(基類1 引數表),基類2(基類2 引數表),···,基類n(基類n 引數表),物件成員1(物件1 引數表),物件成員2(物件2 引
MySQL 中的 FOUND_ROWS() 與 ROW_COUNT() 函式
原文地址:https://www.cnblogs.com/digdeep/p/4818660.html 移植sql server 的儲存過程到mysql中,遇到了sql server中的: IF @@ROWCOUNT < 1 對應到mysql中可以使用 FOUND_ROWS() 函
30.面向物件中常用內建函式與過載函式
內建函式:類中特殊功能 __init__(self): ###為例項物件賦值 1,可以沒有這個函式 例項沒資料 2,資料初始化函式
JS中建構函式與普通函式的區別及JS建構函式、原型和例項的關係
JS中建構函式與普通函式的區別: https://www.cnblogs.com/cindy79/p/7245566.html JS建構函式、原型和例項的關係: https://blog.csdn.net/u012443286/article/details/78823955 Java
**python中atexit模組 與register函式**
python中atexit模組 與register函式 register函式函式模型: register函式的作用: register函式位於atexie模組,是程式結束時的退出清理函式 register函式的使用例子: 一:atexit.register(fu
Python多執行緒中join函式與setDaemon函式使用說明
在Python多執行緒程式設計的時候,經常需要用到join函式和setDaemon函式。之前對這兩個函式一直理解不是很到位。今天查閱了很多資料,對兩個函式的認識更加的深入一些了。 join([timeout])可以參考Python文件說明。大概意思就
c++中靜態函式與動態函式的區別
在C語言中,由於沒有類的概念,所以沒有靜態成員一說,在c中static的作用主要有2個: 一是隱藏功能,對於static修飾的函式和全域性變數而言二是保持永續性功能,對於static修飾的區域性變數而言。並且,因為存放在靜態區,全域性和區域性的static修飾的變數,都預設
matlab中 str2num 函式與 str2double 函式的區別
str2num 函式與 str2double 函式的相同點與不同點 1. 相同點: 當str為一個含數字的
unity3d中的GetKey與GetKeyDown函式
參考unity官方關於GetKeyDown的API(https://docs.unity3d.com/ScriptReference/Input.GetKeyDown.html),解釋是:當開始按下指定名稱按鍵的那一幀返回為真,也就是說該函式是判斷滑鼠按下的動作,因為在unity中每一幀都會重置,所
Excel中如何活用Index函式與Match函式
Index函式與Match函式聯合查詢 在Excel中MATCH函式可以返回指定內容所在的位置,而INDEX又可以根據指定位置查詢到位置所對應的資料,所以在INDEX函式中巢狀MATCH函式,我們能夠很容易的返回指定位置相關聯的資料。 函式介紹
spark三種清理資料的方式:UDF,自定義函式,spark.sql;Python中的zip()與*zip()函式詳解//及python中的*args和**kwargs
(1)UDF的方式清理資料 import sys reload(sys) sys.setdefaultencoding('utf8') import re import json from pyspark.sql import SparkSession
python中的iter()函式與next()函式
list、tuple等都是可迭代物件,我們可以通過iter()函式獲取這些可迭代物件的迭代器。然後我們可以對獲取到的迭代器不斷使⽤next()函式來獲取下⼀條資料。iter()函式實際上就是調⽤了可迭
SQLServer中常用的字串函式與日期函式
1.字串函式 --len()計算字元的個數 print len('Hi~你好嗎?') --datalength() 返回佔用的位元組的個數,不是字串的函式 print datalength('Hi~你好嗎?')--我這的問號寫的是英文,佔用一個位元組,中文就佔用兩個 print
關於類中new物件與建構函式執行順序的問題
如下有3個類,其中COM是表示元件類別。Root類包含一個COM物件引用,Root中派生出Stem類(即Stem類繼承Root類)。每個類都有一個無引數的建構函式,列印當前的類名。其中Root類中擁有一個靜態程式碼塊。 package com.practise;
從send函式和sendto函式引數的不同看TCP和UDP的差別
sendto能聯想到客戶端地址的引數有兩個:sockfd 和 dest_addr,但在實際應用中對所有UDP客戶sockfd引數都使用同一個值,所以可以推斷這個socket是為所有UDP客戶使用的,不能看做目的客戶端的地址對映,只有dest_addr才是目的客戶端的地址對映(ip地址和埠號)。
C語言中的內部函式與外部函式
內部函式: 如果一個函式只能被本檔案中其它函式所呼叫,它稱為內部函式。在定義內部函式時,在函式名和函式型別的前面加static。即 static 型別識別符號 函式名 (形參表) 如: static int fun (int a, int b) 內部函式又稱靜態函
Lua中的模組與module函式
這篇文章主要介紹了Lua中的模組(module)和包(package)詳解,本文講解了require函式、寫一個模組、package.loaded、module函式等內容. 從Lua5.1版本開始,就對模組和包添加了新的支援,可是使用require和module來定義和
Python 中的range()函式與array()函式
我們在Python中存在一個非常好用的range()與array()函式,下面作用法簡要介紹。 一、range()函式 >>> range(1,10) ——>不包括10 [1, 2, 3, 4, 5, 6, 7, 8, 9]
Oracle中round()函式與trunc()函式的區別?
round(x[,y])【功能】返回四捨五入後的值 【引數】x,y,數字型表示式,如果y不為整數則擷取y整數部分,如果y>0則四捨五入為y位小數,如果y小於0則四捨五入到小數點向左第y位。 【返回】數字 【示例】 select round(5555.6666,2.1)