當前位置:首頁 » 操作系統 » linuxsend

linuxsend

發布時間: 2022-04-30 02:34:48

A. 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。

B. WINDOWS下的send,recv與LINUX下的send,recv有什麼區別

1、recv和send函數提供了和read和write差不多的功能。但是他們提供了第四個參數來控制讀寫操作.int recv(int sockfd,void *buf,int len,int flags)
int send(int sockfd,void *buf,int len,int flags)
前面的三個參數和read,write相同,第四個參數能夠是0或是以下的組合:
_______________________________________________________________
| MSG_DONTROUTE | 不查找路由表 |
| MSG_OOB | 接受或發送帶外數據 |
| MSG_PEEK | 查看數據,並不從系統緩沖區移走數據 |
| MSG_WAITALL | 等待任何數據 |
|————————————————————–|
如果flags為0,則和read,write一樣的操作。
2、在unix中,所有的設備都可以看成是一個文件,所以我們可以用read來讀取socket數據。

C. linux socket send函數問題

SockSrv.c錯了,
服務端發送數據的字元串長度都亂寫,長度是多少就填多少,不要亂填,亂填會讀取字元串後面的內存裡面的數據的
write(connfd,"test",4);
len = send(connfd,"test\n",5,0);

D. 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 傳給系統調用的參數不正確。

E. linux 下writev和send的區別

Linux的recv、send函數和read、write函數都可以用於套接字編程。不同的是recv、send只用於套接字通信;而read、write是底層系統調用,只要是文件操作就都可以用, 比如套接字操作,套接字描述符屬於是文件描述符的一種,

F. linux中read,write和recv,send的區別

Linux的recv、send函數和read、write函數都可以用於套接字編程。
區別:
1、recv、send只用於套接字通信;
2、read、write是底層系統調用,只要是文件操作就都可以用, 比如套接字操作,套接字描述符屬於是文件描述符的一種,套接字本身在Linux上就叫做套接字文件。
所以read、write函數不光可以用於套接字編程,也可以用於讀取其他各種文件,比如用於文件編程讀寫普通文件。

G. linux中網路都斷開了,但是send函數還是一直在發數據

1 確認鏈路是否連通狀態,最好加心跳機制, 如果一定時間沒有收到心跳包,或者沒有回復心跳
就應認為此鏈路已經壞掉了,需要關閉,重新連接!

2 至於發送數據,應該檢查對應的api的返回值,是否已經成功發送或者接受定長數據!
沒有完成應該重新發送或者接受

3 網路數據問題,可以用抓包工具直接抓包看數據,可以看的比較透徹
工具 Linux下用tcpmp,windows用wirekshark

H. 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信號,進程對該信號的處理是進程終止。

I. 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.使用信號量(互斥條件)。

總之:要保證中斷是安全的

J. linux在send之前是否要做位元組序轉換,就是send是否有幫我們完成位元組序轉換的工作

send不做轉化的,send是按照char*的形式發送的,如果你需要發送整形的數據的話,如果不能確保客戶端的位元組序和服務端的相同,建議在發送前hton,接收後ntoh

熱點內容
小說分銷系統源碼 發布:2024-10-05 07:13:54 瀏覽:631
主板能存儲數據嗎 發布:2024-10-05 07:13:22 瀏覽:89
安卓文件管理器在哪裡打開手機 發布:2024-10-05 07:12:19 瀏覽:224
個人網站源碼html 發布:2024-10-05 06:59:47 瀏覽:409
安卓fc下載游戲在哪個文件夾 發布:2024-10-05 06:51:05 瀏覽:765
演算法狼人殺 發布:2024-10-05 06:50:21 瀏覽:346
ibm伺服器怎麼做raid5 發布:2024-10-05 06:46:20 瀏覽:854
wifi如何換密碼 發布:2024-10-05 06:25:39 瀏覽:549
ubuntu遠程訪問mysql 發布:2024-10-05 06:17:29 瀏覽:223
centos配置後怎麼做 發布:2024-10-05 06:08:59 瀏覽:70