Linux网络编程 -- socketpair的使用
socketpair的使用
 Linux實(shí)現(xiàn)了一個(gè)源自BSD的socketpair調(diào)用,可以實(shí)現(xiàn)在同一個(gè)文件描述符中進(jìn)行讀寫的功能。?
 該系統(tǒng)調(diào)用能創(chuàng)建一對已連接的UNIX族socket。?
 在Linux中,完全可以把這一對socket當(dāng)成pipe返回的文件描述符一樣使用,唯一的區(qū)別就是這一對文件描述符中的任何一個(gè)都可讀和可寫,函數(shù)原型如下:
socketpair()函數(shù)建立一對匿名的已經(jīng)連接的套接字,其特性由協(xié)議族d、類型type、協(xié)議protocol決定,建立的兩個(gè)套接字描述符會(huì)放在sv[0]和sv[1]中。
 socketpair函數(shù)參數(shù)說明:?
 第1個(gè)參數(shù)domain,表示協(xié)議族,只能為AF_LOCAL或者AF_UNIX。?
 第2個(gè)參數(shù)type,表示協(xié)議,可以是SOCK_STREAM或者SOCK_DGRAM。用SOCK_STREAM建立的套接字對是管道流,與一般的管道相區(qū)別的是,套接字對建立的通道是雙向的,即每一端都可以進(jìn)行讀寫。?
 第3個(gè)參數(shù)protocol,表示類型,只能為0。?
 第4個(gè)參數(shù)sv[2]是接收代表兩個(gè)套接口的整數(shù)數(shù)組。每一個(gè)文件描述符代表一個(gè)套接口,并且與另一個(gè)并沒有區(qū)別。
 函數(shù)返回值:?
 如果函數(shù)成功,將會(huì)返回0值。否則將會(huì)返回-1表明創(chuàng)建失敗,并且errno來表明特定的錯(cuò)誤號(hào)。
以下給出個(gè)簡單的例子,通過socketpair實(shí)現(xiàn)父子間進(jìn)程通信:
<code class="hljs ocaml has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*socketpair1.c*/</span> #<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">include</span> <sys/types.h> #<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">include</span> <sys/socket.h> #<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">include</span> <stdlib.h> #<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">include</span> <stdio.h><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">int</span> main () {<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">int</span> fd[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>];<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">int</span> r = socketpair(AF_UNIX, SOCK_STREAM, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>, fd);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (r < <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>){perror( <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"socketpair()"</span> );exit(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>);}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (fork()){ <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/* 父進(jìn)程 */</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">int</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">val</span> = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;close(fd[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>]);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>){sleep(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>);++<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">val</span>;printf(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"發(fā)送數(shù)據(jù): %d\n"</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">val</span>);write(fd[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>], &<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">val</span>, sizeof(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">val</span>));read(fd[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>], &<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">val</span>, sizeof(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">val</span>));printf(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"接收數(shù)據(jù): %d\n"</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">val</span>);}}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>{ <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*子進(jìn)程*/</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">int</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">val</span>;close(fd[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span>(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>){read(fd[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>], &<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">val</span>, sizeof(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">val</span>));++<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">val</span>;write(fd[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>], &<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">val</span>, sizeof(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">val</span>));}} }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li></ul>執(zhí)行結(jié)果:
<code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">yu<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">@ubuntu</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:~/Linux/</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">217</span>/pro_pool/socketpair<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$ </span>vi socketpair1.c yu<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">@ubuntu</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:~/Linux/</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">217</span>/pro_pool/socketpair<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$ </span>gcc -o socketpair1 socketpair1.c yu<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">@ubuntu</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:~/Linux/</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">217</span>/pro_pool/socketpair<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$ </span>./socketpair1 發(fā)送數(shù)據(jù)<span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> 接收數(shù)據(jù)<span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span> 發(fā)送數(shù)據(jù)<span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span> 接收數(shù)據(jù)<span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span> 發(fā)送數(shù)據(jù)<span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span> 接收數(shù)據(jù)<span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">6</span> ...</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li></ul>分析程序:一開始由socketpair創(chuàng)建一個(gè)套接字對,父進(jìn)程關(guān)閉fd[1],子進(jìn)程關(guān)閉fd[0],父進(jìn)程sleep(1)讓子進(jìn)程先執(zhí)行,子進(jìn)程read(fd[1], &val, sizeof(val))阻塞,然后父進(jìn)程write(fd[0]..)發(fā)送數(shù)據(jù),子進(jìn)程接收數(shù)據(jù)處理后再發(fā)送給父進(jìn)程數(shù)據(jù)write(fd[1]..),父進(jìn)程讀取數(shù)據(jù),打印輸出。(注意:socketpair產(chǎn)生的套接字對實(shí)現(xiàn)全雙工通信)
sendmsg, recvmsg , send函數(shù)的使用
sendmsg, recvmsg , send三個(gè)函數(shù)的頭文件:
<code class="hljs vala has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include <sys/types.h> </span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include <sys/socket.h></span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul> sendmsg函數(shù)?
 定義函數(shù)
 函數(shù)說明:sendmsg()用來將數(shù)據(jù)由指定的socket傳給對方主機(jī).?
 參數(shù)s:為已建立好連線的socket, 如果利用UDP協(xié)議則不需經(jīng)過連線操作.?
 參數(shù)msg:指向欲連線的數(shù)據(jù)結(jié)構(gòu)內(nèi)容, 參數(shù)flags 一般默認(rèn)為0, 詳細(xì)描述請參考send().?
 返回值:成功返回發(fā)送的字節(jié)數(shù),出錯(cuò)返回-1
 recvmsg函數(shù)?
 定義函數(shù)
 函數(shù)說明:recvmsg()用來接收遠(yuǎn)程主機(jī)經(jīng)指定的socket 傳來的數(shù)據(jù).?
 參數(shù)s 為已建立好連線的socket, 如果利用UDP 協(xié)議則不需經(jīng)過連線操作.?
 參數(shù)msg 指向欲連線的數(shù)據(jù)結(jié)構(gòu)內(nèi)容,?
 參數(shù)flags 一般設(shè)0, 詳細(xì)描述請參考send().?
 返回值:成功則返回接收到的字符數(shù), 失敗則返回-1, 錯(cuò)誤原因存于errno 中.
 send函數(shù)?
 定義函數(shù):int send(int s, const void * msg, int len, unsigned int falgs);?
 函數(shù)說明:send()用來將數(shù)據(jù)由指定的socket 傳給對方主機(jī).?
 參數(shù)s 為已建立好連接的socket.?
 參數(shù)msg 指向欲連線的數(shù)據(jù)內(nèi)容.?
 參數(shù)len 則為數(shù)據(jù)長度.?
 參數(shù)flags 一般設(shè)0, 其他數(shù)值定義如下:?
 MSG_OOB 傳送的數(shù)據(jù)以out-of-band 送出.?
 MSG_DONTROUTE 取消路由表查詢?
 MSG_DONTWAIT 設(shè)置為不可阻斷運(yùn)作?
 MSG_NOSIGNAL 此動(dòng)作不愿被SIGPIPE 信號(hào)中斷.?
 返回值:成功則返回實(shí)際傳送出去的字符數(shù), 失敗返回-1. 錯(cuò)誤原因存于errno.
結(jié)構(gòu)msghdr定義如下:
<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">struct</span> msghdr {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> *msg_name; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//發(fā)送或接收數(shù)據(jù)的地址</span>socklen_t msg_namelen; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//地址長度</span>strcut iovec * msg_iov; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//要發(fā)送或接受數(shù)據(jù)</span>size_t msg_iovlen; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//容器數(shù)據(jù)長度</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> * msg_control; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//附屬數(shù)據(jù)</span>size_t msg_controllen; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//附屬數(shù)據(jù)長度</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> msg_flags; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//接收消息的標(biāo)志</span> };</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li></ul> 返回值:成功則返回實(shí)際傳送出去的字符數(shù), 失敗返回-1, 錯(cuò)誤原因存于errno?
 錯(cuò)誤代碼:
 附屬數(shù)據(jù)msg_control結(jié)構(gòu)?
 控制信息頭部本身由下面的C結(jié)構(gòu)定義:
其成員描述如下:
<code class="hljs bash has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">成員 描述 cmsg_len 附屬數(shù)據(jù)的字節(jié)計(jì)數(shù),這包含結(jié)構(gòu)頭的尺寸。這個(gè)值是由CMSG_LEN()宏計(jì)算的。 cmsg_level 這個(gè)值表明了原始的協(xié)議級(jí)別(例如,SOL_SOCKET)。 cmsg_<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">type</span> 這個(gè)值表明了控制信息類型(例如,SCM_RIGHTS)。 cmsg_data 這個(gè)成員并不實(shí)際存在,用來指明實(shí)際的額外附屬數(shù)據(jù)所在的位置。</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul>用sendmsg來傳遞數(shù)據(jù)程序?qū)嵗?/span>
<code class="hljs cpp has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*sendmsg.c*/</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include <stdio.h></span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include <stdlib.h></span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include <unistd.h></span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include <errno.h></span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include <string.h></span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include <sys/types.h></span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include <sys/socket.h></span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> main(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> argc,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">char</span> *argv[]) {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> ret; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/* 返回值 */</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> sock[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>]; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/* 套接字對 */</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">struct</span> msghdr msg;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">struct</span> iovec iov[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>];<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">char</span> send_buf[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">100</span>] = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"it is a test"</span>;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">struct</span> msghdr msgr;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">struct</span> iovec iovr[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>];<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">char</span> recv_buf[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">100</span>];<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/* 創(chuàng)建套接字對 */</span>ret = socketpair(AF_LOCAL,SOCK_STREAM,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,sock);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(ret == -<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>){<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">printf</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"socketpair err\n"</span>);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>; }<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/* sock[1]發(fā)送數(shù)據(jù)到本地主機(jī) */</span>bzero(&msg, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">sizeof</span>(msg));msg.msg_name = NULL; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/* void*類型 NULL本地地址*/</span>msg.msg_namelen = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;iov[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>].iov_base = send_buf;iov[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>].iov_len = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">sizeof</span>(send_buf);msg.msg_iov = iov;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//要發(fā)送或接受數(shù)據(jù)設(shè)為iov</span>msg.msg_iovlen = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//1個(gè)元素</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">printf</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"開始發(fā)送數(shù)據(jù):\n"</span>);<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">printf</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"發(fā)送的數(shù)據(jù)為: %s\n"</span>, send_buf);ret = sendmsg(sock[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>], &msg, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> );<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(ret == -<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> ){<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">printf</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"sendmsg err\n"</span>);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> -<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>;}<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">printf</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"發(fā)送成功!\n"</span>);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/* 通過sock[0]接收發(fā)送過來的數(shù)據(jù) */</span>bzero(&msg, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">sizeof</span>(msg));msgr.msg_name = NULL; msgr.msg_namelen = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;iovr[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>].iov_base = &recv_buf;iovr[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>].iov_len = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">sizeof</span>(recv_buf);msgr.msg_iov = iovr;msgr.msg_iovlen = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>;ret = recvmsg(sock[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>], &msgr, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(ret == -<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> ){<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">printf</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"recvmsg err\n"</span>);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> -<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>;}<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">printf</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"接收成功!\n"</span>);<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">printf</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"收到數(shù)據(jù)為: %s\n"</span>, recv_buf);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/* 關(guān)閉sockets */</span>close(sock[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]);close(sock[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>]);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li><li style="box-sizing: border-box; padding: 0px 5px;">58</li><li style="box-sizing: border-box; padding: 0px 5px;">59</li><li style="box-sizing: border-box; padding: 0px 5px;">60</li><li style="box-sizing: border-box; padding: 0px 5px;">61</li><li style="box-sizing: border-box; padding: 0px 5px;">62</li><li style="box-sizing: border-box; padding: 0px 5px;">63</li><li style="box-sizing: border-box; padding: 0px 5px;">64</li><li style="box-sizing: border-box; padding: 0px 5px;">65</li><li style="box-sizing: border-box; padding: 0px 5px;">66</li><li style="box-sizing: border-box; padding: 0px 5px;">67</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li><li style="box-sizing: border-box; padding: 0px 5px;">58</li><li style="box-sizing: border-box; padding: 0px 5px;">59</li><li style="box-sizing: border-box; padding: 0px 5px;">60</li><li style="box-sizing: border-box; padding: 0px 5px;">61</li><li style="box-sizing: border-box; padding: 0px 5px;">62</li><li style="box-sizing: border-box; padding: 0px 5px;">63</li><li style="box-sizing: border-box; padding: 0px 5px;">64</li><li style="box-sizing: border-box; padding: 0px 5px;">65</li><li style="box-sizing: border-box; padding: 0px 5px;">66</li><li style="box-sizing: border-box; padding: 0px 5px;">67</li></ul>執(zhí)行程序結(jié)果:
<code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">yu<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">@ubuntu</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:~/Linux/</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">217</span>/pro_pool/socketpair<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$ </span>gcc -o sendmsg sendmsg.c yu<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">@ubuntu</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:~/Linux/</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">217</span>/pro_pool/socketpair<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$ </span>./sendmsg 開始發(fā)送數(shù)據(jù): 發(fā)送的數(shù)據(jù)為<span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:</span> it is a test 發(fā)送成功! 接收成功! 收到數(shù)據(jù)為<span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:</span> it is a test</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li></ul>程序分析:由套接字sock[1]發(fā)數(shù)據(jù)到本地主機(jī),由套接字sock[0]接收發(fā)送過來的數(shù)據(jù)。
超強(qiáng)干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的Linux网络编程 -- socketpair的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 深入理解Nginx 模块开发与架构解析-
- 下一篇: epoll机制:epoll_create
