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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

sendto & recvfrom 详解

發布時間:2023/12/19 综合教程 37 生活家
生活随笔 收集整理的這篇文章主要介紹了 sendto & recvfrom 详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

參考一

sendto和recvfrom一般用于UDP協議中,但是如果在TCP中connect函數調用后也可以用.

sendto()和recvfrom()——利用數據報方式進行數據傳輸


1. 在無連接的數據報socket方式下,由于本地socket并沒有與遠端機器建立連接,所以在發送數據時應指明目的地址,sendto()函數原型為:
  int sendto(int sockfd, const void *msg,int len unsigned int flags, const struct sockaddr *to, int tolen);
  該函數比send()函數多了兩個參數,to表示目地機的IP地址和端口號信息,而tolen常常被賦值為sizeof (struct sockaddr)。Sendto 函數也返回實際發送的數據字節長度或在出現發送錯誤時返回-1。
2. recvfrom()函數原型為:
  int recvfrom(int sockfd,void *buf,int len,unsigned int lags,struct sockaddr *from,int *fromlen);
  from是一個struct sockaddr類型的變量,該變量保存源機的IP地址及端口號。fromlen常置為sizeof (struct sockaddr)。當recvfrom()返回時,fromlen包含實際存入from中的數據字節數。Recvfrom()函數返回接收到的字節數或當出現錯誤時返回-1,并置相應的errno。

  應注意的一點是,當你對于數據報socket調用了connect()函數時,你也可以利用send()和recv()進行數據傳輸,但該socket仍然是數據報socket,并且利用傳輸層的UDP服務。但在發送或接收數據報時,內核會自動為之加上目地和源地址信息。

參考二

1. sendto() 簡述:

向一指定目的地發送數據。

#include <winsock.h>

int PASCAL FAR sendto( SOCKET s, const char FAR* buf, int len, int flags,

const struct sockaddr FAR* to, int tolen);

s:一個標識套接口的描述字。

buf:包含待發送數據的緩沖區。

len:buf緩沖區中數據的長度。

flags:調用方式標志位。

to:(可選)指針,指向目的套接口的地址。

tolen:to所指地址的長度。

注釋:

sendto()適用于已連接的數據報或流式套接口發送數據。對于數據報類套接口,
必需注意發送數據長度不應超過通訊子網的IP包最大長度。IP包最大長度在WSAStartup()調用返回的WSAData的iMaxUdpDg元素中。如果數據太長無法自動通過下層協議,則返回WSAEMSGSIZE錯誤,數據不會被發送。

請注意成功地完成sendto()調用并不意味著數據傳送到達。

sendto()函數主要用于SOCK_DGRAM類型套接口向to參數指定端的套接口發送數據報。對于SOCK_STREAM類型套接口,to和tolen參數被忽略;這種情況下sendto()等價于send()。

為了發送廣播數據(僅適用于SOCK_DGRAM),in參數所含地址應該把特定的IP地址INADDR_BROADCAST(winsock.h中有定義)和終端地址結合起來構造。通常建議一個廣播數據報的大小不要大到以致產生碎片,也就是說數據報的數據部分(包括頭)不超過512字節。

如果傳送系統的緩沖區空間不夠保存需傳送的數據,除非套接口處于非阻塞I/O方式,否則sendto()將阻塞。對于非阻塞SOCK_STREAM類型的套接口,實際寫的數據數目可能在1到所需大小之間,其值取決于本地和遠端主機的緩沖區大小。可用select()調用來確定何時能夠進一步發送數據。

在相關套接口的選項之上,還可通過標志位flag來影響函數的執行方式。也就是說,本函數的語義既取決于套接口的選項也取決于標志位。后者由以下一些值組成:



意義

MSG_DONTROUTE


指明數據不選徑。一個WINDOWS套接口供應商可以忽略此標志;參見2.4節中關于SO_DONTROUTE的討論。

MSG_OOB


發送帶外數據(僅適用于SO_STREAM;參見2.2.3節)。

返回值:

若無錯誤發生,send()返回所發送數據的總數(請注意這個數字可能小于len中所規定的大小)。否則的話,返回SOCKET_ERROR錯誤,應用程序可通過WSAGetLastError()獲取相應錯誤代碼。

2. recvfrom()

簡述:

接收一個數據報并保存源地址。

#include <winsock.h>

int PASCAL FAR recvfrom( SOCKET s, char FAR* buf, int len, int flags,

struct sockaddr FAR* from, int FAR* fromlen);

s:標識一個已連接套接口的描述字。

buf:接收數據緩沖區。

len:緩沖區長度。

flags:調用操作方式。

from:(可選)指針,指向裝有源地址的緩沖區。

fromlen:(可選)指針,指向from緩沖區長度值。

注釋:

本函數由于從(已連接)套接口上接收數據,并捕獲數據發送源的地址。

對于SOCK_STREAM類型的套接口,最多可接收緩沖區大小個數據。如果套接口被設置為線內接收帶外數據(選項為SO_OOBINLINE),且有帶外數據未讀入,則返回帶外數據。應用程序可通過調用ioctlsocket()的SOCATMARK命令來確定是否有帶外數據待讀入。對于SOCK_STREAM類型套接口,忽略from和fromlen參數。

對于數據報類套接口,隊列中第一個數據報中的數據被解包,但最多不超過緩沖區的大小。如果數據報大于緩沖區,那么緩沖區中只有數據報的前面部分,其他的數據都丟失了,并且recvfrom()函數返回WSAEMSGSIZE錯誤。

若from非零,且套接口為SOCK_DGRAM類型,則發送數據源的地址被復制到相應的sockaddr結構中。fromlen所指向的值初始化時為這個結構的大小,當調用返回時按實際地址所占的空間進行修改。

如果沒有數據待讀,那么除非是非阻塞模式,不然的話套接口將一直等待數據的到來,此時將返回SOCKET_ERROR錯誤,錯誤代碼是WSAEWOULDBLOCK。用select()或WSAAsynSelect()可以獲知何時數據到達。

如果套接口為SOCK_STREAM類型,并且遠端“優雅”地中止了連接,那么recvfrom()一個數據也不讀取,立即返回。如果立即被強制中止,那么recv()將以WSAECONNRESET錯誤失敗返回。

在套接口的所設選項之上,還可用標志位flag來影響函數的執行方式。也就是說,本函數的語義既取決于套接口選項,也取決于標志位參數。標志位可取下列值:

值 意義

MSG_PEEK 查看當前數據。數據將被復制到緩沖區中,但并不從輸入隊列中刪除。

MSG_OOB 處理帶外數據(參見2.2.3節具體討論)。

返回值:

若無錯誤發生,recvfrom()返回讀入的字節數。如果連接已中止,返回0。否則的話,返回SOCKET_ERROR錯誤,應用程序可通過WSAGetLastError()獲取相應錯誤代碼。

錯誤代碼:

WSANOTINITIALISED:在使用此API之前應首先成功地調用WSAStartup()。

WSAENETDOWN:WINDOWS套接口實現檢測到網絡子系統失效。

WSAEFAULT:fromlen參數非法;from緩沖區大小無法裝入端地址。

WSAEINTR:阻塞進程被WSACancelBlockingCall()取消。

WSAEINPROGRESS:一個阻塞的WINDOWS套接口調用正在運行中。

WSAEINVAL:套接口未用bind()進行捆綁。

WSAENOTCONN:套接口未連接(僅適用于SOCK_STREAM類型)。

WSAENOTSOCK:描述字不是一個套接口。

WSAEOPNOTSUPP:指定了MSG_OOB,但套接口不是SOCK_STREAM類型的。

WSAESHUTDOWN:套接口已被關閉。當一個套接口以0或2的how參數調用shutdown()關閉后,無法再用recv()接收數據。

WSAEWOULDBLOCK:套接口標識為非阻塞模式,但接收操作會產生阻塞。

WSAEMSGSIZE:數據報太大無法全部裝入緩沖區,故被剪切。

WSAECONNABORTED:由于超時或其他原因,虛電路失效。

WSAECONNRESET:遠端強制中止了虛電路。

總結

以上是生活随笔為你收集整理的sendto &amp; recvfrom 详解的全部內容,希望文章能夠幫你解決所遇到的問題。

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