1. 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數據。
2. linux 下調用recv函數,死循環在recv函數裡面,什麼原因
建議你用strace看那幾個線程確切是卡在哪裡
而且你描述的是,死循環。 recv函數怎麼會死循環?
還有,當你的系統壓力變大的時候, 會出現epoll提示某socket可用,但是等你去讀的時候該socket已經被關閉的情況,你看看這種情況會不會對你的程序造成影響。
----------------------------
man recv
RETURN VALUE
These calls return the number of bytes received, or -1 if an error occurred. The return value will be 0 when the peer has performed an
orderly shutdown.
你可以看到,當對端關閉socket的時候recv返回值是0。 那麼作為你的程序,你又沒有判斷這種情況呢? 你默認的如果是使用EPOLLET模式, 你肯定不停的讀socket直到EAGAIN出現,但是如果返回值0的話,並不會出現EAGAIN。
建議你還是多用strace來查詢問題所在,有時候比gdb更能直接找出原因。
、
還有再糾正一點,recv是一個linux系統調用,要麼是阻塞要麼是返回,不存在死循環的問題的, 死循環肯定是出在你的程序代碼中。 如果你覺得recv本身不退出又佔用大量cpu,那就是linux庫出bug或者是內核bug了。
3. linux 下socket的recv函數返回值問題
說清楚一點,是UDP還是TCP
不管怎麼說,在recv之前調用一下select(),檢查緩沖到底有沒有內容,如果有,再執行recv就不會有任何問題。而且 select的好處是,如果沒有接到別的東西,你可以sleep()一下,不佔用CPU
用下面的rcv代替你的recv函數吧,我在嵌入式系統開發時自己寫的一個標准常式,很可靠:
參數解釋:
sck - socket
buf - 接收緩沖區
size-緩沖區大小
time_out-等待時間(按秒計)如果超時則返回
返回值:收到位元組數,0表示超時等錯誤
int rcv(int sck, void * buf, int size, int time_out)
{
if (sck < 1 || !buf || size < 1) return 0;
timeval tv = { 0, 0}; timeval * ptv = 0;
if (time_out > 0) { tv.tv_sec = time_out; ptv = &tv; }
memset(buf, 0, size);
int r = 0; char * b = (char*) buf; int sz = size;
fd_set rd, er; int total = 0; time_t t0 = time(0); time_t t1 = 0;
do {
FD_ZERO(&rd); FD_SET(sck, &rd);
FD_ZERO(&er); FD_SET(sck, &er);
r = select(sck + 1, &rd, 0, &er, ptv);
if (r == -1) { nperror("select()"); return -1; }
if (FD_ISSET(sck, &er)) {
nperror("socket(shutdown)"); return -1;
}//end if
if (FD_ISSET(sck, &rd)) {
r = recv(sck, b, sz, 0);
if (r == -1) { nperror("recv()"); return -1; }
total += r; sz -= r; b+= r;
}//end if
if (time_out > 0)
t1 = time(0) - t0;
else
t1 = time_out - 1;
//end if
}while(sz && t1 < time_out);
return total;
}//end if
4. linux中的socket編程的問題,recv函數收到的全是0
send後,操作系統會決定是不是馬山發包還是繼續等待看看還有別的send,然後把他們一起打成一個包來發送。所以你recv是不知道要接收幾個包的。
5. 簡述linux下,從socket寫入和讀取的函數,read/write和send/recv函數的含義並解釋其介面意義簡答題
Ssize_t write(int fd,const void *buf,size_t nbytes);
write的返回值大於0,表示寫了部分數據或者是全部的數據,這樣用一個while循環不斷的寫入數據,但是循環過程中的buf參數和nbytes參數是我們自己來更新的,返回值小於0,此時出錯了,需要根據錯誤類型進行相應的處理
Ssize_t read(int fd,void *buf,size_t nbyte)
Read函數是負責從fd中讀取內容,當讀取成功時,read返回實際讀取到的位元組數,如果返回值是0,表示已經讀取到文件的結束了,小於0表示是讀取錯誤。
Recv函數和send函數
Recv函數和read函數提供了read和write函數一樣的功能,不同的是他們提供了四個參數。
Int
recv(int fd,void *buf,int len,int flags)
Int
send(int fd,void *buf,int len,int flags)
前面的三個參數和read、write函數是一樣的。第四個參數可以是0或者是一下組合:
MSG_DONTROUTE:不查找表
是send函數使用的標志,這個標志告訴IP,目的主機在本地網路上,沒有必要查找表,這個標志一般用在網路診斷和路由程序裡面。
MSG_OOB:接受或者發生帶外數據
表示可以接收和發送帶外數據。
MSG_PEEK:查看數據,並不從系統緩沖區移走數據
是recv函數使用的標志,表示只是從系統緩沖區中讀取內容,而不清楚系統緩沖區的內容。這樣在下次讀取的時候,依然是一樣的內容,一般在有過個進程讀寫數據的時候使用這個標志。
MSG_WAITALL:等待所有數據
是recv函數的使用標志,表示等到所有的信息到達時才返回,使用這個標志的時候,recv返回一直阻塞,直到指定的條件滿足時,或者是發生了錯誤。
6. linux epoll socket recv 不能獲取正確的數據
能多點信息嗎?
也不知道你epoll參數設好了沒,你用的tcp還是udp....
先別用epoll,等你正常send和recv之後,再用epoll或者poll。
這樣才能確定是send,recv的問題還是epoll阻塞的問題
7. Linux中C語言的一個函數的源代碼:socket 編程中的 recv() 函數。
你好
recv函數只是在用戶空間定義的。內核空間有與之對應的函數,也就回是說,執行答recv函數就會調用到內核中與它對應的函數,實際起作用的就是內核里的這個函數。
至於內核里調用的是那個函數,你不需要是找,那樣會把你看暈的,內核里的調用關系復雜的很,除非對內核非常了解的,才會找到到底是怎麼調用的,他也是只是找到怎麼調用的,至於為什麼這樣調用是極少人知道的。得問linux的開發者。因為內核的代碼量是太多了。有人花了三年時間才看完內核代碼。
souce insight只能查找內核里有的東西,屬於內核的。recv()函數是不屬於內核的,所以用這個是查找不到的
希望可以幫到你,望選為滿意答案
8. 簡述linux下,從socket寫入和讀取的函數,read/write和send/recv函數的含義並解釋其介面意義。
沒理解樓主意思,樓主可以搜搜IP/TCP編程模型(socket網路編程),大概就是要有一個sever端和一個client端,read/write一般是對本地文件的讀取/寫入,然後send/recv是sever端和client端互相發送數據使用的,具體程序網上搜搜這方面吧 我手頭沒有現成的 希望對你有幫助
9. linux中read,write和recv,send的區別
Linux的recv、send函數和read、write函數都可以用於套接字編程。
區別:
1、recv、send只用於套接字通信;
2、read、write是底層系統調用,只要是文件操作就都可以用, 比如套接字操作,套接字描述符屬於是文件描述符的一種,套接字本身在Linux上就叫做套接字文件。
所以read、write函數不光可以用於套接字編程,也可以用於讀取其他各種文件,比如用於文件編程讀寫普通文件。
10. 在linux中,用netstat會看到Send-Q和Recv-Q,通常為零,如果文件積壓過多,那麼Send-Q和Recv-Q數值會增大
Linux的CMD,你應該寫自己的函數來發送相應的數據類型來接受的結果集