send, sendto, sendmsg - send a message on a socket 系統(tǒng)調(diào)用 send()、sendto() 和 sendmsg() 用于將消息傳輸?shù)搅硪粋€套接字。
成都創(chuàng)新互聯(lián)公司基于成都重慶香港及美國等地區(qū)分布式IDC機(jī)房數(shù)據(jù)中心構(gòu)建的電信大帶寬,聯(lián)通大帶寬,移動大帶寬,多線BGP大帶寬租用,是為眾多客戶提供專業(yè)資陽主機(jī)托管報價,主機(jī)托管價格性價比高,為金融證券行業(yè)服務(wù)器托管,ai人工智能服務(wù)器托管提供bgp線路100M獨(dú)享,G口帶寬及機(jī)柜租用的專業(yè)成都idc公司。
最初的 Linux sendfile() 系統(tǒng)調(diào)用不是為了處理大文件偏移量而設(shè)計的。 因此,Linux 4 添加了 sendfile64(),偏移參數(shù)的類型更寬。 glibc sendfile() 包裝函數(shù)透明地處理內(nèi)核差異。
發(fā)送消息,send只可用于基于連接的套接字,send 和 write唯一的不同點(diǎn)是標(biāo)志的存在,當(dāng)標(biāo)志為0時,send等同于write。sendto 和 sendmsg既可用于無連接的套接字,也可用于基于連接的套接字。
domain 參數(shù)指定一個通信域; 以決定用于通信的協(xié)議族。 這些系列在 sys/socket.h 中定義。 目前 Linux 內(nèi)核理解的格式包括:當(dāng)然最常用的當(dāng)然是 AF_INET ,即IPV4。
第二個參數(shù)指明一個存放應(yīng)用程式要發(fā)送數(shù)據(jù)的緩沖區(qū);第三個參數(shù)指明實(shí)際要發(fā)送的數(shù)據(jù)的字符數(shù);第四個參數(shù)一般置0。函數(shù)說明send() 用來將數(shù)據(jù)由指定的 socket 傳給對方主機(jī)。使用 send 時套接字必須已經(jīng)連接。
失敗返回-1,錯誤原因存于errno 中。錯誤代碼EBADF 參數(shù) s 非法的 socket 處理代碼。EFAULT 參數(shù)中有一指針指向無法存取的內(nèi)存空間。WNOTSOCK 參數(shù) s 為一文件描述詞,非 socket。EINTR 被信號所中斷。
若無錯誤發(fā)生,send()返回所發(fā)送數(shù)據(jù)的總數(shù)(請注意這個數(shù)字可能小于len中所規(guī)定的大小)。否則的話,返回SOCKET_ERROR錯誤,應(yīng)用程序可通過WSAGetLastError()獲取相應(yīng)錯誤代碼。
int socket;domain指明所使用的協(xié)議族,通常為PF_INET,表示互聯(lián)網(wǎng)協(xié)議族;type參數(shù)指定socket的類型:SOCK_STREAM 或SOCK_DGRAM,Socket接口還定義了原始Socket,允許程序使用低層協(xié)議;protocol通常賦值0。
由于TCP是可靠傳輸,所以對TCP的發(fā)送接口很容易產(chǎn)生誤解,比如sn=send();錯誤的認(rèn)為sn的值是表示有sn個字節(jié)的數(shù)據(jù)已經(jīng)發(fā)送到了接收端。其實(shí)真相并非如此。
該錯誤產(chǎn)生的原因是由于send 函數(shù)中的size變量大小超過了tcp_sendspace的值。tcp_sendspace定義了應(yīng)用在調(diào)用send之前能夠在kernel中緩存的數(shù)據(jù)量。
參數(shù)msg指向欲連線的數(shù)據(jù)內(nèi)容,參數(shù)flags 一般設(shè)0,詳細(xì)描述請參考send()。參數(shù)to用來指定欲傳送的網(wǎng)絡(luò)地址,結(jié)構(gòu)sockaddr請參考bind()。參數(shù)tolen為sockaddr的結(jié)果長度。
使用sendto函數(shù)。linux發(fā)送socket報文使用UDP協(xié)議發(fā)送報文,首先創(chuàng)建一個socket,然后設(shè)置服務(wù)器的IP地址和端口號,最后使用sendto函數(shù)發(fā)送報文。Linux全稱是GNU/Linux,是一種免費(fèi)使用和自由傳播的類UNIX操作系統(tǒng)。
函數(shù)說明 sendto() 用來將數(shù)據(jù)由指定的socket傳給對方主機(jī)。參數(shù)s為已建好連線的socket,如果利用UDP協(xié)議則不需經(jīng)過連線操作。參數(shù)msg指向欲連線的數(shù)據(jù)內(nèi)容,參數(shù)flags 一般設(shè)0,詳細(xì)描述請參考send()。
使用C/s模式,最簡單的方法 服務(wù)器端:創(chuàng)建一個socket,然后綁定到本機(jī)的端口A,調(diào)用listen函數(shù)監(jiān)聽這個socket。調(diào)用accept函數(shù)接受數(shù)據(jù) 客戶端:創(chuàng)建一個socket,調(diào)用connect函數(shù),用send函數(shù)發(fā)送數(shù)據(jù)。
Linux中關(guān)閉socket為close,Windows中為closesocket。Linux中有變量socklen_t,Windows中直接為int。因為linux中的socket與普通的fd一樣,所以可以在TCP的socket中,發(fā)送與接收數(shù)據(jù)時,直接使用read和write。
socket編程雖然是事實(shí)上的標(biāo)準(zhǔn),而且不同平臺提供的接口函數(shù)也非常類似,但畢竟它不存在嚴(yán)格的標(biāo)準(zhǔn)。所以各個平臺的實(shí)現(xiàn)也不完全兼容。下面就從recvfrom()這個函數(shù)看看Window平臺和Linux平臺的不同。
Windows下的socket和Linux下的socket是不一樣的,我沒有查到sendmsg/recvmsg這個方法,上面的鏈接是一個類似的函數(shù),它和send/recv 的區(qū)別是,這個函數(shù)可以發(fā)送socket控制信息,看API就知道。另外我也沒有看到有write/read函數(shù)。
1、expect的send不能單獨(dú)用的。一般需要:spawn expect send expect send 這樣用。還有個問題 !/usr/bin/expect 應(yīng)該放在第一行吧。
2、interact 說明:第一行#!/usr/bin/expect表示使用expect的shell交互模式 set是對變量password賦值 set timeout 100:設(shè)置超時時間為100秒,如果要執(zhí)行的shell命令很長可以設(shè)置超時時間長一些。
3、當(dāng)發(fā)現(xiàn)一個匹配則檢查包含在[]中的字符串,查看是否為/bin/tcsh。如果不是則發(fā)送/bin/tcsh給chsh命令作為輸入,如果是則僅僅發(fā)送一個回車符。這個簡單的針對具體情況發(fā)出不同相響應(yīng)的小例子說明了expect的強(qiáng)大功能。
本文標(biāo)題:linux下send命令 linux sendfile
網(wǎng)站網(wǎng)址:http://aaarwkj.com/article7/dicegij.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、網(wǎng)站策劃、搜索引擎優(yōu)化、域名注冊、網(wǎng)站營銷、外貿(mào)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)