c語言recv
A. c語言文件傳輸
伺服器端(發送文件):首先打開文件【fopen】,用rb方式打開,既可以發送文本文件,也可以發送二進制文件,在無錯時初始化套接字socket,即初始化socket庫【WSAStartup】,分配socket【socket】,填充伺服器的地址,即填充sockaddr_in結構,然後進行綁定【bind】,設置套接字為監聽套接字【listen】,接收連接【accept】,至此伺服器阻塞,等待客戶端的連接。
客戶端(接收文件):首先打開文件【fopen】,用wb方式打開,在無錯時初始化套接字socket,即初始化socket庫【WSAStartup】,分配socket【socket】,填充客戶端的地址,即填充sockaddr_in結構,然後進行綁定【bind】,再填充伺服器的地址結構,然後調用【connect】進行連接,當連接成功後,第一階段的工作便結束了。
第二階段,發送文件。
伺服器端:使用循環while,結束條件是(!feof(fp)),fp是文件指針,feof檢測當前的文件讀取指針是否到達文件尾部,若到達了就返回真,否則返回假。然後在循環內部依次調用【fread】、【send】進行發送。這里有一個問題需要注意,調用fread的時候有兩個參數是要每次讀多少位元組和讀多少次,將第一個設置為1,將第二個設置為緩沖區的大小,用一個變數記錄實際讀到多少位元組,即【fread】的返回值,然後將其傳遞給【send】,就可以實現發送文件了,在發送完成後斷開連接【closesocket】,關閉文件【fclose】。
客戶端:使用while死循環,調用【recv】接收文件,【fwrite】寫入文件,這里也有個和上面類似的問題,就是要將recv的返回值傳遞給fwrite的第三個參數,即受到了多少位元組,就向文件中寫多少位元組。當recv返回值為0時(連接斷開時)退出循環,【closesocket】關閉套接字,調用【fclose】關閉文件。
B. linux中C語言的一個函數的源代碼:socket 編程中的 recv() 函數。
1、recv是socket編程中最常用的函數之一,在阻塞狀態的recv有時候會返回不同的值,而對於錯誤值也有相應的錯誤碼,分別對應不同的狀態。
2、recv函數只是在用戶空間定義的。內核空間有與之對應的函數,也就是說,執行recv函數就會調用到內核中與它對應的函數,實際起作用的就是內核里的這個函數。至於內核里調用的是那個函數,內核里的調用關系復雜的很,除非對內核非常了解的,才會找到到底是怎麼調用的,他也是只是找到怎麼調用的。
C. c語言的recv()非阻塞方法怎麼弄哦
需要將recv設置超時,Linux下設置超時如下:
//設置發送超時
struct timeval timeout={3,0};//3s
setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&timeout,sizeof(struct timeval));
//設置接收超時
setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(struct timeval));
windows下設置超時如下:
int timeout = 3000; //3s
int ret=setsockopt(sock_fd,SOL_SOCKET,SO_SNDTIMEO,&timeout,sizeof(timeout));
int ret=setsockopt(sock_fd,SOL_SOCKET,SO_RCVTIMEO,&timeout,sizeof(timeout));
D. C語言/C++,用recv獲取網頁源代碼,中文為什麼是亂碼 代碼如下:
這種問題通常是你的代碼在處理字元串是弄錯了。。。
接收過來的內容應該沒問題吧。。。。
只是顯示的時候弄錯了吧。。
仔細檢查一下,中文字元佔2個位元組,指針頭別弄錯了,最後加上'\0'別加錯位置。。。
如果英文字元都不可以正確顯示的話,那可能是粘包。
還有是不是編碼問題。
E. C語言中SOCKET關於send和recv的問題,不懂別亂貼
說實在的這個問題非常簡單,不過你習慣太差,你把send和recv的返回值看看不就明白了!
前提是你描述的都是事實。
否則還可能有Socket問題。
如果是linux,strace一下就知道什麼問題了。
Windows的也很簡單。
前面的明顯不正確,send如果是TCP,(UDP 不應該用send),send返回時,消息已經發出了。