Ⅰ linux Ubuntu 中,寫了一個簡單的UDP協議,只用了sendto 與recvfrom ,出錯了
在網路的編輯選項裡面有可以寫代碼的,最起碼代碼格式整齊,容易閱讀。版
客戶端的權serv_addr.sin_addr.s_addr=INADDR_ANY這里使用伺服器的固定地址試試。廣播模式這個地址好像是用255.255.255.0的(區域網下)。
Ⅱ Linux udp通信不成功
server端綁定地址錯誤。通常是
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
Ⅲ 使用recvfrom接收UDP包在Windows和Linux平台的不同表現
操作系統的UDP接收流程如下:收到一個UDP包後,驗證沒有錯誤後,放入一個包隊列中,隊列中的每一個元素就是一個完整的UDP包。當應用程序通過recvfrom()讀取時,OS把相應的一個完整UDP包取出,然後拷貝到用戶提供的內存中,物理用戶提供的內存大小是多少,OS都會完整取出一個UDP包。如果用戶提供的內存小於這個UDP包的大小,那麼在填充慢內存後,UDP包剩餘的部分就會被丟棄,以後再也無法取回。
這與TCP接收完全不同,TCP沒有完整包的概念,也沒有邊界,OS只會取出用戶要求的大小,剩餘的仍然保留在OS中,下次還可以繼續取出。
socket編程雖然是事實上的標准,而且不同平台提供的介面函數也非常類似,但畢竟它不存在嚴格的標准。所以各個平台的實現也不完全兼容。下面就從recvfrom()這個函數看看Window平台和Linux平台的不同。
Windows平台的表現
int
WSAAPI
recvfrom(
_In_ SOCKET s,
_Out_writes_bytes_to_(len, return) __out_data_source(NETWORK) char FAR * buf,
_In_ int len,
_In_ int flags,
_Out_writes_bytes_to_opt_(*fromlen, *fromlen) struct sockaddr FAR * from,
_Inout_opt_ int FAR * fromlen
);
再看MSDN說明:
If the datagram or message is larger than the buffer specified, the buffer is filled with the first part of the datagram, and recvfrom generates the error WSAEMSGSIZE. For unreliable protocols (for example, UDP) the excess data is lost.
可以看出,buf大小小於UDP包大小的時候,recvfrom()會返回-1,並設置錯誤WSAEMSGSIZE。
實際編程測試驗證確實是這樣的表現。
Linux平台的表現
__extern_always_inline ssize_t
recvfrom (int __fd, void *__restrict __buf, size_t __n, int __flags,
__SOCKADDR_ARG __addr, socklen_t *__restrict __addr_len)
可以看出與Windows平台的函數原型相同。但是在其man手冊里,沒有看到UDP包大於接收緩沖區情況的特殊說明。
寫代碼測試表明,buf小於UDP包大小的時候,recvfrom()仍然返回復制到緩沖區的位元組數,調用者無法得知UDP包被截斷的情況。
Ⅳ Linux下udp套接字sendto函數錯誤
希望能夠多貼一些代碼出來,幫助分析。
1.檢查一下sendto的參數,其中的指針參數是否初始化正確?
2.請檢查一下recvfrom的函數聲明,第6個參數的原型。
Ⅳ linux下設置recvfrom為非阻塞
可以使用
1 select pselect
2 poll
3可以使用fcntl給文件描述符添加O—UNBLOCK
Ⅵ 關於linux下udp的問題...
首先:udp是不需要accept的,因為他不是連接的,不需要accept;
也就是說你在bind好了內過後就直接while(1)就可以容了。
這個裡面用的函數有些變化,發送用 sendto, 接收用 recvfrom
這兩個函數你可以直接在終端下面輸入: man sendto 以及 man recvfrom查看他們的參數以及返回值問題。
ps:在Linux下面編程要多看看它的函數:
http://man.chinaunix.net/develop/c&c++/linux_c/default.htm
這其中就包括了Linux下面常用的c函數, 你可以去看看
Ⅶ linux網路編程中 如何退出接受數據等待。。。recv recvfrom。。。
先用select或者poll或者epoll對你的socket進行監聽...
上面幾個API都可以設置超時時間,時間比較精確.
他們的作用都是監聽文件描述符上的事件(可讀,可寫等等),你的sockfd也是一個文件描述符...
具體用法自己查吧...
Ⅷ linux udp 校驗怎麼設置
Linux中是有UDP校驗的,API不需要設置
如果recvfrom收到數據說明已經校驗成功,沒收到數據的情況很多,其中一種是校驗失敗。
Ⅸ Linux下的recvfrom為什麼一直阻塞
UDP的client端是需要bind的,server端不需要bind,
關於阻塞的問題,應該在於你的socket的屬性,設置成O_NONBLOCK就可以了。
Ⅹ linux下udp編程如何同時獲取源IP和埠及目的IP和埠
http://www.cnblogs.com/kissazi2/p/3158603.html