user-0 提问: 请问:udp中,当port设置为0时,为什么sendto错误?怎么才可以自动分配端口并且sendto可用?

回复:
user: user-1
content: 引用 4 楼 u013024958 的回复:[quote=引用 1 楼 wangzuxi 的回复:] [quote=引用 楼主 u013024958 的回复:] 请问:   udp中,当port设置为0时,为什么sendto错误?怎么才可以自动分配端口并且sendto可用?    如下 1.当sin_port = htons(0);时, sendto失败:  bind成功:    2.当指定sin_port时: 发送成功:   bind失败:    要如何才能两个都成功呢?   (找不到关于网络编程的板块,只能放在c了....) 调用sendto说明你是client，你要给server发数据，你想如果不指定对方端口怎么能发送呢。 [/quote]但是sin_port = htons(0)不是自动分配端口号吗？我是已经把服务器的信息传递给客户端了（如果自动分配了的话，不是也该传过去了吗？）。。。[/quote] sin_port = htons(0)对于指定源端口来说是自动分配，源端口本来就是自动分配的，没必要再这么做，目的端口肯定不能自动分配，你在sendto的目的地址信息写这个肯定不对。 你对UDP理解还不透，首先，肯定得有一端先在一个端口上bind，即server端创建socket之后，要在这个socket上bind一个端口号，这个端口号必须是一个未被占用的端口号，不能自动分配；然后，另一端，也就是client端创建socket之后，就可以调用sendto发送数据给server，调用sendto也得给参数说明这个数据要发给谁，这个谁就是由IP和port来决定的，显然server和client的port一样才能通信。

user: user-1
content: 引用 6 楼 u013024958 的回复:[quote=引用 5 楼 wangzuxi 的回复:] [quote=引用 4 楼 u013024958 的回复:] [quote=引用 1 楼 wangzuxi 的回复:] [quote=引用 楼主 u013024958 的回复:] 请问:   udp中,当port设置为0时,为什么sendto错误?怎么才可以自动分配端口并且sendto可用?    如下 1.当sin_port = htons(0);时, sendto失败:  bind成功:    2.当指定sin_port时: 发送成功:   bind失败:    要如何才能两个都成功呢?   (找不到关于网络编程的板块,只能放在c了....) 调用sendto说明你是client，你要给server发数据，你想如果不指定对方端口怎么能发送呢。 [/quote]但是sin_port = htons(0)不是自动分配端口号吗？我是已经把服务器的信息传递给客户端了（如果自动分配了的话，不是也该传过去了吗？）。。。[/quote] sin_port = htons(0)对于指定源端口来说是自动分配，源端口本来就是自动分配的，没必要再这么做，目的端口肯定不能自动分配，你在sendto的目的地址信息写这个肯定不对。 你对UDP理解还不透，首先，肯定得有一端先在一个端口上bind，即server端创建socket之后，要在这个socket上bind一个端口号，这个端口号必须是一个未被占用的端口号，不能自动分配；然后，另一端，也就是client端创建socket之后，就可以调用sendto发送数据给server，调用sendto也得给参数说明这个数据要发给谁，这个谁就是由IP和port来决定的，显然server和client的port一样才能通信。[/quote]server端创建socket之后，要在这个socket上bind一个端口号，这个端口号必须是一个未被占用的端口号，不能自动分配...为什么不能自动分配呢?你说的源端口和这个端口不一样的吗?不是只有一处地方(sin_port那里)填充服务器的端口吗?如果不一样,源端口本来就自动分配,那sin_port = htons(0);自动分配的是什么端口呢?很菜,请见谅.[/quote] sendto肯定要指定目的IP和目的端口，你说这个目的端口能自动分配？ 你先弄清楚什么是源IP、源端口、目的IP、目的端口吧。

user: user-0
content: 引用 5 楼 wangzuxi 的回复:[quote=引用 4 楼 u013024958 的回复:] [quote=引用 1 楼 wangzuxi 的回复:] [quote=引用 楼主 u013024958 的回复:] 请问:   udp中,当port设置为0时,为什么sendto错误?怎么才可以自动分配端口并且sendto可用?    如下 1.当sin_port = htons(0);时, sendto失败:  bind成功:    2.当指定sin_port时: 发送成功:   bind失败:    要如何才能两个都成功呢?   (找不到关于网络编程的板块,只能放在c了....) 调用sendto说明你是client，你要给server发数据，你想如果不指定对方端口怎么能发送呢。 [/quote]但是sin_port = htons(0)不是自动分配端口号吗？我是已经把服务器的信息传递给客户端了（如果自动分配了的话，不是也该传过去了吗？）。。。[/quote] sin_port = htons(0)对于指定源端口来说是自动分配，源端口本来就是自动分配的，没必要再这么做，目的端口肯定不能自动分配，你在sendto的目的地址信息写这个肯定不对。 你对UDP理解还不透，首先，肯定得有一端先在一个端口上bind，即server端创建socket之后，要在这个socket上bind一个端口号，这个端口号必须是一个未被占用的端口号，不能自动分配；然后，另一端，也就是client端创建socket之后，就可以调用sendto发送数据给server，调用sendto也得给参数说明这个数据要发给谁，这个谁就是由IP和port来决定的，显然server和client的port一样才能通信。[/quote]server端创建socket之后，要在这个socket上bind一个端口号，这个端口号必须是一个未被占用的端口号，不能自动分配...为什么不能自动分配呢?你说的源端口和这个端口不一样的吗?不是只有一处地方(sin_port那里)填充服务器的端口吗?如果不一样,源端口本来就自动分配,那sin_port = htons(0);自动分配的是什么端口呢?很菜,请见谅.

user: user-0
content: 引用 1 楼 wangzuxi 的回复:[quote=引用 楼主 u013024958 的回复:] 请问:   udp中,当port设置为0时,为什么sendto错误?怎么才可以自动分配端口并且sendto可用?    如下 1.当sin_port = htons(0);时, sendto失败:  bind成功:    2.当指定sin_port时: 发送成功:   bind失败:    要如何才能两个都成功呢?   (找不到关于网络编程的板块,只能放在c了....) 调用sendto说明你是client，你要给server发数据，你想如果不指定对方端口怎么能发送呢。 [/quote]但是sin_port = htons(0)不是自动分配端口号吗？我是已经把服务器的信息传递给客户端了（如果自动分配了的话，不是也该传过去了吗？）。。。

user: user-0
content: 不是..是用c写一个聊天小软件.......总是遇到很多问题....

user: user-2
content: 你这是什么？是python吗？百度一下呗

user: user-1
content: 引用 楼主 u013024958 的回复:请问:   udp中,当port设置为0时,为什么sendto错误?怎么才可以自动分配端口并且sendto可用?    如下 1.当sin_port = htons(0);时, sendto失败:  bind成功:    2.当指定sin_port时: 发送成功:   bind失败:    要如何才能两个都成功呢?   (找不到关于网络编程的板块,只能放在c了....) 调用sendto说明你是client，你要给server发数据，你想如果不指定对方端口怎么能发送呢。