sendlinux
① linux 下writev和send的區別
Linux的recv、send函數和read、write函數都可以用於套接字編程。不同的是recv、send只用於套接字通信;而read、write是底層系統調用,只要是文件操作就都可以用, 比如套接字操作,套接字描述符屬於是文件描述符的一種,
② linux send 是可重入函數嗎
可重入函數(即可以被中斷的函數)可以被一個以上的任務調用,而不擔心數據破壞。可重入函數在任何時候都可以被中斷,而一段時間之後又可以恢復運行,而相應的數據不會破壞或者丟失。
可重入函數使用的變數有兩種情況:
1.使用局部變數,變數保存在CPU寄存器中或者堆棧中;
2.使用全局變數,但是這時候要注意保護全局變數(防止任務中斷後被其它任務改變變數)。
?
1
2
3
4
5
void strcpy(*dest,*src)
{
while(* dest++ = *src ++){;}
*dest = NUL;
}
分析:上面的函數用於字元串復制,而參數是存放在堆棧中的,故而改函數可以被多任務調用,而不必擔心各個任務調用期間會互相破壞對方的指針。
基本上下面的函數都是不可重入的:
1.函數內使用了靜態的數據。
2.函數內使用了malloc()或者free()函數的。
3.函數內調用了標準的I/O函數的。
?
1
2
3
4
5
6
7
int temp;
void swap(int *ex1,int *ex2)
{
temp = *ex1;//(1)
*ex1 = *ex2;
*ex2 = temp;
}
分析:該函數中的全局變數temp是的函數變成了一個不可重入的函數,因為在多任務系統中,假如在任務1中調用swap函數,而程序執行到(1)處時被中斷,進而執行其它的任務2,而剛好任務2也調用了swap函數,則temp里存的值則會被任務2改變。從而回到任務1被中斷處繼續執行的時候,temp里存的值已經不再是原來存的temp值了,進而產生了錯誤。
常用的可重入函數的方法有:
1.不要使用全局變數,防止別的代碼覆蓋這些變數的值。
2.調用這類函數之前先關掉中斷,調用完之後馬上打開中斷。防止函數執行期間被中斷進入別的任務執行。
3.使用信號量(互斥條件)。
總之:要保證中斷是安全的
③ 請教linux下socket編程中send函數如何強制其將數據發出去
在多線程編程中其中使用一個線程來accept要連接的客戶端。同時在接受client的請求之後新建一個線程來進行具體的操作。其操作包括向client端發送一定位元組的數據,使用send()函數來進行操作。如果在發送過程中出現任何一個client端的斷線,則整個程序都會退出。
ssize_t send(int sockfd, const void *buff, size_t nbytes, int flags);
關於Linux命令的介紹,看看《linux就該這么學》,具體關於這一章地址3w(dot)linuxprobe/chapter-02(dot)html
上面為send函數原型,在通常的使用中flags參數一般設置為0.此時如果客戶端斷開,繼續往裡邊寫數據的話,會引發一個信號SIGPIPE,此信號會引發線程的退出、
解決的方法:1)可以將flags參數設置為MSG_NOSIGNAL。2)設置SIG_IGN信號處理函數。
④ linux中read,write和recv,send的區別
Linux的recv、send函數和read、write函數都可以用於套接字編程。
區別:
1、recv、send只用於套接字通信;
2、read、write是底層系統調用,只要是文件操作就都可以用, 比如套接字操作,套接字描述符屬於是文件描述符的一種,套接字本身在Linux上就叫做套接字文件。
所以read、write函數不光可以用於套接字編程,也可以用於讀取其他各種文件,比如用於文件編程讀寫普通文件。
⑤ linux 網路編程 send 做了什麼操作
send解析
sockfd:指定發送端套接字描述符。
buff: 存放要發送數據的緩沖區
nbytes: 實際要改善的數據的位元組數
flags: 一般設置為0
1) send先比較發送數據的長度nbytes和套接字sockfd的發送緩沖區的長度,如果nbytes > 套接字sockfd的發送緩沖區的長度, 該函數返回SOCKET_ERROR;
2) 如果nbtyes <= 套接字sockfd的發送緩沖區的長度,那麼send先檢查協議是否正在發送sockfd的發送緩沖區中的數據,如果是就等待協議把數據發送完,如果協議還沒有開始發送sockfd的發送緩沖區中的數據或者sockfd的發送緩沖區中沒有數據,那麼send就比較sockfd的發送緩沖區的剩餘空間和nbytes
3) 如果 nbytes > 套接字sockfd的發送緩沖區剩餘空間的長度,send就一起等待協議把套接字sockfd的發送緩沖區中的數據發送完
4) 如果 nbytes < 套接字sockfd的發送緩沖區剩餘空間大小,send就僅僅把buf中的數據到剩餘空間里(注意並不是send把套接字sockfd的發送緩沖區中的數據傳到連接的另一端的,而是協議傳送的,send僅僅是把buf中的數據到套接字sockfd的發送緩沖區的剩餘空間里)。
5) 如果send函數成功,就返回實際的位元組數,如果send在數據時出現錯誤,那麼send就返回SOCKET_ERROR; 如果在等待協議傳送數據時網路斷開,send函數也返回SOCKET_ERROR。
6) send函數把buff中的數據成功到sockfd的改善緩沖區的剩餘空間後它就返回了,但是此時這些數據並不一定馬上被傳到連接的另一端。如果協議在後續的傳送過程中出現網路錯誤的話,那麼下一個socket函數就會返回SOCKET_ERROR。(每一個除send的socket函數在執行的最開始總要先等待套接字的發送緩沖區中的數據被協議傳遞完畢才能繼續,如果在等待時出現網路錯誤那麼該socket函數就返回SOCKET_ERROR)
7) 在unix系統下,如果send在等待協議傳送數據時網路斷開,調用send的進程會接收到一個SIGPIPE信號,進程對該信號的處理是進程終止。
⑥ send的Linux C 函數
經套接字傳送消息
相關函數
sendto,sendmsg,recv,recvfrom,recvmsg,socket
表頭文件
#include < sys/socket.h >
定義函數
ssize_t send (int s,const void *msg,size_t len,int flags);
參數說明
第一個參數指定發送端套接字描述符;
第二個參數指明一個存放應用程式要發送數據的緩沖區;
第三個參數指明實際要發送的數據的字元數;
第四個參數一般置0。
函數說明
send() 用來將數據由指定的 socket 傳給對方主機。使用 send 時套接字必須已經連接。send 不包含傳送失敗的提示信息,如果檢測到本地錯誤將返回-1。因此,如果send 成功返回,並不必然表示連接另一端的進程接收數據。所保證的僅是當send 成功返回時,數據已經無錯誤地發送到網路上。
對於支持為報文設限的協議,如果單個報文超過協議所支持的最大尺寸,send 失敗並將 errno 設為 EMSGSIZE ;對於位元組流協議,send 會阻塞直到整個數據被傳輸。
flags 參數有如下的選擇:
MSG_DONTROUTE 勿將數據路由出本地網路
MSG_DONTWAIT 允許非阻塞操作(等價於使用O_NONBLOCK)
MSG_EOR 如果協議支持,此為記錄結束
MSG_OOB 如果協議支持,發送帶外數據
MSG_NOSIGNAL 禁止向系統發送異常信息
返回值
成功則返回實際傳送出去的字元數,失敗返回-1,錯誤原因存於errno 中。
錯誤代碼
EBADF 參數 s 非法的 socket 處理代碼。
EFAULT 參數中有一指針指向無法存取的內存空間。
WNOTSOCK 參數 s 為一文件描述詞,非 socket。
EINTR 被信號所中斷。
EAGAIN 此動作會令進程阻斷,但參數 s 的 socket 為不可阻斷的。
ENOBUFS 系統的緩沖內存不足。
EINVAL 傳給系統調用的參數不正確。