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