Re: [問題] socket.sendto 用法

作者: LiloHuang (十年一刻)   2014-07-24 22:55:40
首先 SOCK_DGRAM 的連線就是走 UDP 沒錯,如果要走 TCP 則是 SOCK_STREAM
在設定廣播的 flag 之後,這邊使用的是 <broadcast> 字串,這是一個特殊的 host
這個部份就是把 s_addr 設定為 INADDR_BROADCAST 的意思
可參照 https://docs.python.org/2/library/socket.html 網頁的文字說明
或詳閱 http://svn.python.org/projects/python/trunk/Modules/socketmodule.c
if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
// 此部分省略
#ifdef HAVE_SOCKADDR_SA_LEN
sin->sin_len = sizeof(*sin);
#endif
sin->sin_addr.s_addr = INADDR_BROADCAST;
return sizeof(sin->sin_addr);
}
※ 引述《erttyy8821 (俠)》之銘言:
: 小弟剛接觸Python 不久
: 用的是Python 2.6
: 今天遇到些socket的問題
: 已經先google過但沒找到相過的答案
: 我想問的是
: test = ('<broadcast>', 5566)
: s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
: s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
: s.sendto("Hi", test)
: 這樣一個socket的連線 走的會是UDP嘛?
: 另外<broadcast> 指的是全部廣播
: 但就我在java上的認知
: socket全部廣播不是要先分組嘛?
: 但我在相關的code上面沒有看到關於分組的訊息
: 所以這邊指的廣播會是所有的ip走一次嘛 還是有其他的限定範圍?
作者: erttyy8821 (俠)   2014-07-24 23:07:00
太感謝了!!!!

Links booklink

Contact Us: admin [ a t ] ucptt.com