首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数不工作。

函数不工作。
EN

Stack Overflow用户
提问于 2013-09-04 20:50:12
回答 2查看 1.5K关注 0票数 0

我有开放源码cod (这是链接)访问了cod的这一部分的proxy.c

代码语言:javascript
复制
 while(1) 
    {
        // receive a dns request from the client
        printf("wait for a dns request from the client\n");
        len = recvfrom(sock, buffer->buffer, 2048, 0, (struct sockaddr *)&dns_client, &dns_client_size);
        printf("dns request received\n");


        // fork so we can keep receiving requests
        if (fork() != 0) { continue; }

        // the tcp query requires the length to precede the packet, so we put the length there
        query = malloc(len + 3);
        query[0] = 0;
        query[1] = len;
        memcpy(query + 2, buffer->buffer, len);

        // forward the packet to the tcp dns server
        fprintf(LOG_FILE, "tcp query call\n");
        tcp_query(query, buffer, len + 2);

        // send the reply back to the client (minus the length at the beginning)
        sendto(sock, buffer->buffer + 2, buffer->length - 2, 0, (struct sockaddr *)&dns_client, sizeof(dns_client));

        free(buffer->buffer);
        free(buffer);
        free(query);

        exit(0);

,recvfrom()函数不能工作,我不能继续并显示"dns请求接收\n“是什么问题?然后,当我使用netstat -upan inn命令lin时,我看到了以下内容

主动因特网连接(服务器和已建立) Proto Recv-Q Send本地地址外部地址状态PID/程序名udp 0 127.0.0.1:951 0.0.0.0:* 1623/rpc.statd udp 54721 0.0.0.0:54721 0.0.0.0:* 2214/avahi-守护进程: udp 0 0.0.0.0:45085 0.0.0.0:* 1623/rpc.statd udp 0 0 127.0.0.1:53 0.0.0.0:* 4084/dns_proxy udp 0 0 0.0.0.0:68 0.0.0.0:* 1628/dhclient udp 00.0.0.0:111 0.0.0.0:* 1582/rpcbind udp 0 0 0.0.0.0:631 0.0.0.0:* 2323/cupsd udp 0 0 0.0.0:5353 0.0.0.0:* 2214/avahi-守护进程: udp 0 0.0 0.0.0:42756 0.0 0.0:* 1628/dhclient udp 00.0.0.0:1900 0.0.0.0:* 3306/minissdpd udp 0 0 0.0.0.0:908 0.0.0.0:* 1582/rpcbind udp6 0 0::111::* 1582/rpcbind udp6 0 0:34443::* 1623/rpc.statd udp6 0::5353:*2214/avahi: udp6 0::62844::* 1628/dhclient udp6 0::54654::54654::*2214/: udp6 0::908:* 1582/rpcbind

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-05 08:56:28

类似的修改(在recvfrom()之后添加printf )对我来说很好。除了印刷之外,你对程序做了什么其他的修改吗?

以下是我测试它的步骤:

  1. git克隆回购
  2. 将printfs添加到源
  3. 制作
  4. 编辑dns_proxy.conf以记录/dev/null以外的其他地方
  5. 在另一个终端中,ssh someuser@a.box.somewhere -D localhost:9050
  6. sudo ./dns代理
  7. 使用:主机ftp.funet.fi进行测试

顺便说一下。在桌面上添加建议的printf()会产生大量的输出,在桌面上有其他应用程序,比如www浏览器或电子邮件客户端,所以要小心。也许您可以使用其他源使用的日志记录约定。

代码语言:javascript
复制
if (LOG == 1) { fprintf(LOG_FILE, "Using DNS server: %s\n", inet_ntoa(*(struct in_addr *)&remote_dns)); }

BTW2。如果您已经手动创建或编辑了/etc/rupv.conf,请记住在运行dns_proxy之前对它进行备份。使用尾部"your_dns_proxy_logfile.log“来查看发生了什么。

BTW3。那个程序不太好用。它泄露了fds,在string_value()中有一个单独的,而udp_listener()不检查recvfrom()的返回值就执行malloc()memcpy()。在我的机器上,它经常出现分段故障。不过,似乎起不了什么作用。

编辑这里是我对原版所做的一些修改。https://github.com/thuovila/dns-tcp-socks-proxy/经过这些修改后,它不会对每个中断的recvfrom()进行分段错误。这些变化已合并到上游回购。

票数 1
EN

Stack Overflow用户

发布于 2013-09-04 20:56:40

可能一开始就没有数据可接收。无法看到"dns请求已接收\n“的事实意味着recvfrom()调用处于阻塞状态,等待接收数据。您需要调查hte发送者是否正在发送数据。接下来,您可能应该重新检查sock是否绑定在正确的端口上。您可能希望共享发件人的代码以及发生绑定的recvfrom代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18623532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档