无忧启动论坛

标题: 懂 C 语言 的大佬 帮个忙 [打印本页]

作者: winpefk    时间: 2023-8-31 16:14
标题: 懂 C 语言 的大佬 帮个忙
本帖最后由 winpefk 于 2023-8-31 16:17 编辑

这坨我写的东西
for (unsigned int i=0;i < get_max_threads();i++){
                int g=bind(fd_inet4[i*2],(struct sockaddr *)&inet4tab,sizeof(inet4tab));

                int h=bind(fd_inet6[i*2],(struct sockaddr *)&inet6tab,sizeof(inet6tab));

                int e=bind(fd_inet4,(struct sockaddr *)&inet4tab,sizeof(inet4tab));

                int f=bind(fd_inet6,(struct sockaddr *)&inet6tab,sizeof(inet6tab));

                if ( e == -1 || f == -1 ||g == -1||h == -1){
                        printf("[E] Crash ! ========================\n");
                        printf("[E] Bind failed !\n");
                        printf("[E] Status : i = %d,fd_inet4(udp) = %d,fd_inet6 (udp) = %d\n",i,e>
                        printf("[E] Status : fd_inet4(tcp) = %d , fd_inet6(tcp) = %d\n",g,h);
                        printf("[E] Crash ! ========================\n");
                        return -1;
                }
        }

啥问题?

注:get_max_threads() 开启 openmp 则返回8
本文中所有变量都已经申请足够的内存,不存在越界

fd_inet4 && fd_inet6 :顾名思义,套接字 fd
inet4tab:没错,是: 0.0.0.0:1053 字符串转换的表

(我摊牌了,现在初二,暑假最后一天)
初学网络操作,随便喷。AI 没问到结果。

可能发在这个区不太合适,待会儿我copy一下到综合区,请删贴


作者: winpefk    时间: 2023-8-31 16:15
一直是 后两个bind 返回 -1,如果不设置reuseport,只有第一个返回0,其他 -1
作者: slore    时间: 2023-8-31 18:48
本帖最后由 slore 于 2023-8-31 18:55 编辑


  1.                 int e=bind(fd_inet4[get_max_threads() + i],(struct sockaddr *)&inet4tab,sizeof(inet4tab));
  2.                 int f=bind(fd_inet6[get_max_threads() + i],(struct sockaddr *)&inet6tab,sizeof(inet6tab));
  3.                 int e=bind(fd_inet4[i],(struct sockaddr *)&inet4tab,sizeof(inet4tab));
  4.                 int f=bind(fd_inet6[i],(struct sockaddr *)&inet6tab,sizeof(inet6tab));
复制代码


吧。

IPv4, IPv6, TCP, UDP分别绑定。
不过UDP绑定时, inet4tab 还得重新更新协议类型,sin_family, sin_port吧。
作者: ppowers    时间: 2023-8-31 20:15
说明你没有仔细阅读bind()函数的用法和返回信息。返回-1,说明你的端口已经绑定过了,不能重新绑定。
调试C程序需要耐心,而且要随时关注函数的返回值。如果返回-1,请调用另一个函数可以获得错误的详细信息以确定是不是端口被占用。具体你可以百度下C语言bind()的用法。
作者: 879792799    时间: 2023-9-1 08:42
不懂帮顶  都是大神啊!
作者: azure911    时间: 2023-9-1 10:56
初中生都在学C了啊,没学Python吗?
作者: liangzr1976    时间: 2023-9-1 11:22
azure911 发表于 2023-9-1 10:56
初中生都在学C了啊,没学Python吗?

面向的对象及内容不一样吧?
C好像偏向系统及应用的底层设计。
python好像比较偏向网络应用数据处理
作者: dvs909    时间: 2023-9-2 19:36
都这么卷了吗,初中都在学c
作者: winpefk    时间: 2023-9-2 21:21
ppowers 发表于 2023-8-31 20:15
说明你没有仔细阅读bind()函数的用法和返回信息。返回-1,说明你的端口已经绑定过了,不能重新绑定。
调 ...

我tcp绑定完了,udp再绑定同样的端口,是这个问题吗
作者: winpefk    时间: 2024-2-7 09:28
slore 发表于 2023-8-31 18:48
吧。

IPv4, IPv6, TCP, UDP分别绑定。

感谢
作者: yyz2191958    时间: 2024-2-8 20:07
进来学习




欢迎光临 无忧启动论坛 (http://wuyou.net/) Powered by Discuz! X3.3