導航:首頁 > 編程系統 > linuxsendto

linuxsendto

發布時間:2023-03-22 12:37:54

A. linux手冊翻譯——send(2)


send, sendto, sendmsg - send a message on a socket


系統調用 send()、sendto() 和 sendmsg() 用於將消息傳輸到另一個套接字。

僅當套接字處於連接狀態時才可以使用 send() 調用(以便知道預期的接收者, 也就是說send()僅僅用於數據流類型的數據發送 ,對於TCP,服務端和客戶端都可以使用send/recv;但是對於UDP,只能是客戶端使用send/recv,服務端只能使用sendto/recvfrom,因為客戶端是進行了connect操作知道要發送和接受的地址)。send() 和 write(2) 之間的唯一滲衡區別是存在 flags 參數。此外,
send(sockfd, buf, len, flags);
等價於
sendto(sockfd, buf, len, flags, NULL, 0);

參數 sockfd 是發送者套接字的文件描述符。

如果在連接模式的套接字(即套接字類型為SOCK_STREAM、SOCK_SEQPACKET)上使用 sendto(),則參數 dest_addr 和 addrlen 將被忽略(當它們不是NULL和0時可能返回錯誤EISCONN),若套接字沒有實際連接(還沒有三次握手建立連接)將返回錯誤ENOTCONN。 否則,目標地址由 dest_addr 給出, addrlen 指定其大小。 對於 sendmsg(),目標地址由 msg.msg_name 給出, msg.msg_namelen 指定其大小。

對於 send() 和 sendto(),消息位於 buf 中,長度為 len 。 對於sendmsg(),消息存放於 msg.msg_iov 元素指向 數組數據區 (見下)中。 sendmsg() 調用還允許發送輔助數據(也稱為控制信息)

如果消息太長而無法通過底層協議原子傳遞( too long to pass atomically through the underlying protocol ),則返回錯誤 EMSGSIZE,並且不會傳輸消息。

No indication of failure to deliver is implicit in a send(). Locally detected errors are indicated by a return value of -1.

當消息轎陵不適合套接字的發送緩沖區時,send() 通常會阻塞,除非套接字已置於非阻塞 I/O 模式。 在這種情況下,在非阻塞模式下它會失敗並顯示錯誤 EAGAIN 或 EWOULDBLOCK。 select(2) 調用可用於確定何時可以發送更多數據

上面的的描述還是很籠統的,以TCP為例,按我的理解,我認為只要發送緩沖區有空閑位置,且此時協議棧沒有向網路發送數據,那麼就可以寫入,對於阻塞模式,直到所有數據寫入到緩沖區,就會返回,否則一直阻塞,對於非阻塞模式,是有一個超時時間的,這個由 SO_SNDTIMEO 選項控制,詳細見 socket(7) ,如果當前有空閑位置可以發即當前可寫入,那麼就寫入到緩沖區,知道超時之前寫入多少算多少,然後返回成功寫入的位元組數,如果超時時任何數據都沒寫出去,或者當前就是閉喊戚不可寫入,那麼返回-1 ,並設置errno為 EAGAIN 或 EWOULDBLOCK。

The flags argument is the bitwise OR of zero or more of the following flags.

sendmsg() 使用的 msghdr 結構的定義如下:

對於未連接的套接字 msg_name 指定數據報的目標地址,它指向一個包含地址的緩沖區; msg_namelen 欄位應設置為地址的大小。 對於連接的套接字,這些欄位應分別指定為 NULL 和 0。 這里的未連接指的是數據報協議,連接指的是數據流協議

The msg_iov and msg_iovlen fields specify scatter-gather locations, as for writev(2).
msg_iov是一個buffer數組:

使用 msg_control 和 msg_controllen 成員發送控制信息(輔助數據)。 內核可以處理的每個套接字最大控制緩沖區長度由 /proc/sys/net/core/optmem_max 中的值限制; 見 socket(7) 。 有關在各種套接字域中使用輔助數據的更多信息,請參閱 unix(7) 和 ip(7)。

msg_flags 欄位被忽略。


成功時,返回成功發送的位元組數,這個位元組數並不一定和我們的緩沖區大小相同 。 出錯時,返回 -1,並設置 errno 以指示錯誤。


這些是套接字層生成的一些標准錯誤。 底層協議模塊可能會產生和返回額外的錯誤; 請參閱它們各自的手冊頁。


4.4BSD, SVr4, POSIX.1-2001. These interfaces first appeared in 4.2BSD.

POSIX.1-2001 describes only the MSG_OOB and MSG_EOR flags. POSIX.1-2008 adds a specification of MSG_NOSIGNAL. The MSG_CONFIRM flag is a Linux extension.


根據 POSIX.1-2001,msghdr 結構的 msg_controllen 欄位應該是 socklen_t 類型,而 msg_iovlen 欄位應該是 int 類型,但是 glibc 目前將兩者都視為 size_t。

有關可用於在單個調用中傳輸多個數據報的 Linux 特定系統調用的信息,請參閱 sendmmsg(2)。

Linux may return EPIPE instead of ENOTCONN.


getaddrinfo(3) 中顯示了使用 send() 的示例。

B. linux手冊翻譯——socket(2)


socket - 創建一個用於通信的端點


socket() 創建用於通信的端點並返回引用該端點的文件描述符。 成功調用時返回的文件描述符,將是當前沒有被進程打開的所有文件描述符中編號最低的。

domain 參數指定一個通信域; 以決定用於通信的協議族。 這些系列在 <sys/socket.h> 中定義。 目前 Linux 內核理解的格式包括:

當然最常用的當然是 AF_INET ,即IPV4。
上述地址族的更多詳細信息以及其他幾個地址族的信息可以在 address_families(7) 中找到。

套接字具有指定的 type ,它指定了通信語義。 當前定義的類型有:

某些套接字類型可能不會被所有協議族實現。
從 Linux 2.6.27 開始,type 參數有第二個用途:除了指定套接字類型之外,它還可以包含以下任何值的按位或,以修改 socket() 的行為:

老朋友了,上述兩個,第一個是非阻塞,第二個是執行exec時自動關閉。

protocol 指定要與套接字一起使用的特定協議。 通常只存在一個協議來支持給定協議族中的特定套接字類型 ,在這種情況下,protocol 可以指定為 0。但是,可能存在許多協議,在這種情況下,必須在此指定特定協議方式。 特定協議對應的編號可以查看文件: /etc/protocols

SOCK_STREAM 類型的套接字是全雙工位元組流。 它們不保留記錄邊界。 流套接字必須處於連接狀態,然後才能在其上發送或接收任何數據。 到另一個套接字的連接是通過 connect(2) 調用創建的。 連接後,可以使用 read(2) 和 write(2) 調用或 其變體send(2) 和 recv(2) 的來傳輸數據。 當會話完成時,可以執行 close(2)。 帶外數據也可以按照 send(2) 中的描述進行傳輸,並按照 recv(2) 中的描述進行接收。

實現 SOCK_STREAM 的通信協議確保數據不會丟失或重復。 如果協議的緩沖空間中存在一條數據在合理的時間內不能成功傳輸,則認為該連接已失效。 當 SO_KEEPALIVE 在套接字上啟用時,將會以特定於協議的方式檢查另一端是否仍然存在。 如果進程在損壞的流上發送或接收,則會引發 SIGPIPE 信號; 這會導致不處理信號的進程退出。 SOCK_SEQPACKET 套接字使用與 SOCK_STREAM 套接字相同的系統調用。 唯一的區別是 read(2) 調用將只返回請求的數據量,到達數據包中剩餘的其他數據都將被丟棄。 傳入數據報中的所有消息邊界也被保留。

SOCK_DGRAM 和 SOCK_RAW 套接字允許將數據報發送到在 sendto(2) 調用中指定的通信者。 數據報通常用 recvfrom(2) 接收,它返回下一個數據報及其發送者的地址。

SOCK_PACKET 是一種過時的套接字類型,用於直接從設備驅動程序接收原始數據包。 改用 packet(7)。

An fcntl(2) F_SETOWN operation can be used to specify a process or process group to receive a SIGURG signal when the out-of-band data arrives or SIGPIPE signal when a SOCK_STREAM connection breaks unexpectedly. This operation may also be used to set the process or process group that receives the I/O and asynchronous notification of I/O events via SIGIO. Using F_SETOWN is equivalent to an ioctl(2) call with the FIOSETOWN or SIOCSPGRP argument.

When the network signals an error condition to the protocol mole (e.g., using an ICMP message for IP) the pending error flag is set for the socket. The next operation on this socket will return the error code of the pending error. For some protocols it is possible to enable a per-socket error queue to retrieve detailed information about the error; see IP_RECVERR in ip(7).

套接字的操作由套接字選項控制。 這些選項在 <sys/socket.h> 中定義。 函數setsockopt(2) 和getsockopt(2) 用於設置和獲取選項。對於選項的描述,詳見socket(7).

成功時,將返回新套接字的文件描述符。 出錯時,返回 -1,並設置 errno 以指示錯誤。


POSIX.1-2001, POSIX.1-2008, 4.4BSD.

The SOCK_NONBLOCK and SOCK_CLOEXEC flags are Linux-specific.

socket() appeared in 4.2BSD. It is generally portable to/from non-BSD systems supporting clones of the BSD socket layer (including System V variants).


在 4.x BSD 下用於協議族的清單常量是 PF_UNIX、PF_INET 等,而 AF_UNIX、AF_INET 等用於地址族。 但是,BSD 手冊頁已經承諾:「協議族通常與地址族相同」,隨後的標准到處都使用 AF_*。

C. linux socket sendto可以不設地址嗎

需要設地址的,即使是廣播,不然怎麼知道數據包發給誰:
addr.sin_addr=htonl(INADDR_ANY) ;

D. 我在linux環境下編寫udp客戶端程序。為什麼使用sendto發送數據時,接收端接收不到數據。

1、檢查客戶端和服務端的埠號是否一致;
2、接收端的socket要採用block模式,數據收到後列印出來.

E. linux下send命令是干什麼用的

功能描述:
發送消息,send只可用於基於連接的套接字,send

write唯一的不同點是標志的存在,當標志為0時,send等同於write。sendto

sendmsg既可用於無連接的套接字,也可用於基於連接的套接字。除了套接字設置為非阻塞模式,調用將會阻塞直到數據被發送完。
用法:
#include <sys/types.h>
#include <sys/socket.h>
ssize_t send(int sock, const void *buf, size_t len, int flags);
ssize_t sendto(int sock, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen);
ssize_t sendmsg(int sock, const struct msghdr *msg, int flags);參數:
sock:索引將要從其發送數據的套接字。
buf:指向將要發送數據的緩沖區。
len:以上緩沖區的長度。
flags:是以下零個或者多個標志的組合體,可通過or操作連在一起
msg_dontroute:不要使用網關來發送封包,只發送到直接聯網的主機。這個標志主要用臘碧於診斷或者路由程序。
msg_dontwait:操作不會被阻塞。
msg_eor:終止一個記錄。
msg_more:調用者有更多的數據需要發送。
msg_nosignal:當另一端終止連接時,請求在基漏局肢於流的錯誤套接字上不要發送sigpipe信號。
msg_oob:發送out-of-band數據(需要優先處理的數據),同時現行協議必須支持此種操作。
to:指向存放接收端地址的區域,可以為null。
tolen:以上內存區的長度返世,可以為0。

F. linux下socket文件傳輸問題

如果你的客戶端在發送文件時,每次都重新connect,再進行數據傳輸,則你的程序無回法解決數據的區分。答
如果客戶端是一次connect循環發送,後台服務循環接收,則
(1)如果你的服務端只有一個進程(不支持並發),則A和B不會同時運行,只能按順序接收完A再接收B
(2)如果,每一個新鏈接上來,你都建立一個新的進程去工作,則不會有問題。

G. Linux下udp套接字sendto函數錯誤

希望能夠多貼一些代碼出來,幫助分析。
1.檢查一下sendto的參數,其中的指針參數是否初始化正確?
2.請檢查一下recvfrom的函數聲明,第6個參數的原型。

H. linux send 最大可以發送多少

最大可以發送800M的
Linux系統滲嫌調用之send/sendto/sendmsg函數解析頃洞功能描述:發叢乎手送消息。

I. Linux上sendto偶爾需要很長時間才返回是什麼原因

在linux的網路編程,特別是TCP的編程中,SIGPIPE信號錯誤是一個比較常見的問題,我猜測你是在使用TCP的socket吧,如果是這樣的話,很有可能是你在向一個已經處於關閉狀態的socket寫數據,因為TCP是面向連接的協議。如果對方將socket給close掉了,而你還繼續往這個 socket寫數據,就會觸發這個信號。 因此,建議你在write之前檢查一下對方是否已經close掉了這個socket。 如果回答得不對,可以繼續追問哈

J. 拔下網線,linux下sendto還能發送成功,why

這個問題關鍵在於,你用的udp服務,而不是tcp服務。

udp是無連接的,tcp是有連接的。

這個是關鍵,udp是只管發而不在意網路環境是什麼樣的。

其實你發送成功了,但是具體消息應該還在你機器網卡的緩沖區里。

再連接上網線,它會自動給你發出去的。

但是每個UDP包都有一個最長保存時間的。

一旦超過這個時間,它將會消失。

閱讀全文

與linuxsendto相關的資料

熱點內容
maya粒子表達式教程 瀏覽:84
抖音小視頻如何掛app 瀏覽:283
cad怎麼設置替補文件 瀏覽:790
win10啟動文件是空的 瀏覽:397
jk網站有哪些 瀏覽:134
學編程和3d哪個更好 瀏覽:932
win10移動硬碟文件無法打開 瀏覽:385
文件名是亂碼還刪不掉 瀏覽:643
蘋果鍵盤怎麼打開任務管理器 瀏覽:437
手機桌面文件名字大全 瀏覽:334
tplink默認無線密碼是多少 瀏覽:33
ipaddgm文件 瀏覽:99
lua語言編程用哪個平台 瀏覽:272
政采雲如何導出pdf投標文件 瀏覽:529
php獲取postjson數據 瀏覽:551
javatimetask 瀏覽:16
編程的話要什麼證件 瀏覽:94
錢脈通微信多開 瀏覽:878
中學生學編程哪個培訓機構好 瀏覽:852
榮耀路由TV設置文件共享錯誤 瀏覽:525

友情鏈接