日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

39 网络相关函数(七)——live555源码阅读(四)网络

發布時間:2023/12/2 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 39 网络相关函数(七)——live555源码阅读(四)网络 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

39 網絡相關函數(七)——live555源碼閱讀(四)網絡

  • 39 網絡相關函數(七)——live555源碼閱讀(四)網絡
    • 簡介
    • 14)readSocket從套接口讀取數據
    • recv/recvfrom 函數
      • 函數原型:
      • 參數說明:
      • 返回說明:

本文由烏合之眾 lym瞎編,歡迎轉載 blog.cnblogs.net/oloroso
本文由烏合之眾 lym瞎編,歡迎轉載 my.oschina.net/oloroso

簡介

網絡相關函數是一系列用于操作網絡數據的函數。在多個文件中都有相關的函數的定義。還有一些函數是系統socket API相關函數,就不提了。
   這一系列的函數大多有一個特點,需要一個UsageEnvironmet&型的參數。
   這些方法大多在live555sourcecontrol\groupsock\include\GroupsockHelper.hh中聲明。

14)readSocket從套接口讀取數據

readSocket函數從套接口socket讀取數據到buffer,并捕獲數據發送源的地址到fromAddress。
函數返回讀取到的字節數,出錯時返回0并調用socketErr(env, "recvfrom() error: ")來設置套接口錯誤消息。

// 從套接口讀數據 int readSocket(UsageEnvironment& env,int socket, unsigned char* buffer, unsigned bufferSize, struct sockaddr_in& fromAddress) {SOCKLEN_T addressSize = sizeof fromAddress;// ssize_t recvfrom(int sockfd,void *buf,int len,unsigned int flags, struct sockaddr *from,socket_t *fromlen);// 讀取主機經指定的socket傳來的數據,并把數據傳到由參數buf指向的內存空間,參數len為可接收數據的最大長度。flag一般設置為0。from是來源地址,fromlen傳出來源長度// 如果正確接收返回接收到的字節數,失敗返回-1.int bytesRead = recvfrom(socket, (char*)buffer, bufferSize, 0,(struct sockaddr*)&fromAddress,&addressSize);if (bytesRead < 0) {//##### HACK to work around bugs in Linux and Windows:int err = env.getErrno();if (err == 111 /*ECONNREFUSED (Linux) 連接請求被服務器拒絕*/ #if defined(__WIN32__) || defined(_WIN32)// What a piece of crap Windows is. Sometimes// recvfrom() returns -1, but with an 'errno' of 0.// This appears not to be a real error; just treat// it as if it were a read of zero bytes, and hope// we don't have to do anything else to 'reset'// this alleged error:// 垃圾的Windows。有時recvfrom()返回- 1,但是有errno為0。// 這似乎不是一個真正的錯誤;只是把它當作一個讀取零字節,并希望我們不需要做什么“reset”// 這所謂的錯誤:|| err == 0 || err == EWOULDBLOCK #else|| err == EAGAIN #endif|| err == 113 /*EHOSTUNREACH (Linux)*/) { // Why does Linux return this for datagram sock?fromAddress.sin_addr.s_addr = 0;return 0;}//##### END HACKsocketErr(env, "recvfrom() error: ");}return bytesRead; }

recv/recvfrom 函數

功能描述:
從套接字上接收一個消息。對于recvfrom,可同時應用于面向連接的和無連接的套接字。recv一般只用在面向連接的套接字,幾乎等同于recvfrom,只要將recvfrom的第五個參數設置NULL。
如果消息太大,無法完整存放在所提供的緩沖區,根據不同的套接字,多余的字節會丟棄。
假如套接字上沒有消息可以讀取,除了套接字已被設置為非阻塞模式,否則接收調用會等待消息的到來。

函數原型:

#include <sys/types.h> #include <sys/socket.h> ssize_t recv(int sock, void *buf, size_t len, int flags); ssize_t recvfrom(int sock, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen);

參數說明:

  • sock:索引將要從其接收數據的套接字。
  • buf:存放消息接收后的緩沖區。
  • len:buf所指緩沖區的容量。
  • flags:是以下一個或者多個標志的組合體,可通過or操作連在一起
    MSG_DONTWAIT:操作不會被阻塞。
    MSG_ERRQUEUE:指示應該從套接字的錯誤隊列上接收錯誤值,依據不同的協議,錯誤值以某種輔佐性消息的方式傳遞進來,使用者應該提供足夠大的緩沖區。導致錯誤的原封包通過msg_iovec作為一般的數據來傳遞。導致錯誤的數據報原目標地址作為msg_name被提供。錯誤以sock_extended_err結構形態被使用,定義如下
#define SO_EE_ORIGIN_NONE 0 #define SO_EE_ORIGIN_LOCAL 1 #define SO_EE_ORIGIN_ICMP 2 #define SO_EE_ORIGIN_ICMP6 3 struct sock_extended_err {u_int32_t ee_errno; /* error number */u_int8_t ee_origin; /* where the error originated */u_int8_t ee_type; /* type */u_int8_t ee_code; /* code */u_int8_t ee_pad;u_int32_t ee_info; /* additional information */u_int32_t ee_data; /* other data *//* More data may follow */ }; 宏說明
MSG_PEEK指示數據接收后,在接收隊列中保留原數據,不將其刪除,隨后的讀操作還可以接收相同的數據。
MSG_TRUNC返回封包的實際長度,即使它比所提供的緩沖區更長, 只對packet套接字有效。
MSG_WAITALL要求阻塞操作,直到請求得到完整的滿足。然而,如果捕捉到信號,錯誤或者連接斷開發生,或者下次被接收的數據類型不同,仍會返回少于請求量的數據。
MSG_EOR指示記錄的結束,返回的數據完成一個記錄。
MSG_TRUNC指明數據報尾部數據已被丟棄,因為它比所提供的緩沖區需要更多的空間。
MSG_CTRUNC指明由于緩沖區空間不足,一些控制數據已被丟棄。
MSG_OOB指示接收到out-of-band數據(即需要優先處理的數據)。
MSG_ERRQUEUE指示除了來自套接字錯誤隊列的錯誤外,沒有接收到其它數據。
  • from:指向存放對端地址的區域,如果為NULL,不儲存對端地址。
  • fromlen:作為入口參數,指向存放表示from最大容量的內存單元。作為出口參數,指向存放表示from實際長度的內存單元。

返回說明:

成功執行時,返回接收到的字節數。另一端已關閉則返回0。失敗返回-1,errno被設為以下的某個值

  • EAGAIN:套接字已標記為非阻塞,而接收操作被阻塞或者接收超時
  • EBADF:sock不是有效的描述詞
  • ECONNREFUSE:遠程主機阻絕網絡連接
  • EFAULT:內存空間訪問出錯
  • EINTR:操作被信號中斷
  • EINVAL:參數無效
  • ENOMEM:內存不足
  • ENOTCONN:與面向連接關聯的套接字尚未被連接上
  • ENOTSOCK:sock索引的不是套接字

轉載于:https://www.cnblogs.com/oloroso/p/4736913.html

總結

以上是生活随笔為你收集整理的39 网络相关函数(七)——live555源码阅读(四)网络的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。