gpt4 book ai didi

C SOCKS5 代理接口(interface)未从代理服务器接收任何内容。

转载 作者:行者123 更新时间:2023-11-30 17:25:34 30 4
gpt4 key购买 nike

我做了一个简单的SOCKS5代理RFC 1928使用 C 套接字与 localhost:9050 上运行的 Tor 守护进程进行通信。它编译并工作正常,但它被卡住了,因为它没有recv()任何东西。

代码如下:

#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <netinet/in.h>

int main(int argc, char** argv) {

struct addrinfo hints, *res;
int sockfd;
memset(&hints,0,sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
getaddrinfo("localhost","9050",&hints,&res);

sockfd = socket(res->ai_family,res->ai_socktype,res->ai_protocol);
int connected = connect(sockfd,res->ai_addr,res->ai_addrlen);
if (connected == -1) {
perror("Error");
}
char buffer[256];
char msginit[256];
msginit[0] = '\5'; //Protocol number
msginit[1] = '\2'; //# of authentication methods
msginit[2] = '\0'; //no authentication
msginit[3] = '\2'; //user+pass auth

//get dest
memset(&hints,0,sizeof hints);
memset(res,0,sizeof *res);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
getaddrinfo("duckduckgo.com","80",&hints,&res);
struct sockaddr_in *ip = (struct sockaddr_in *)res->ai_addr;
uint32_t* addr=&(ip->sin_addr.s_addr);

//copy dest to request
memcpy (msginit+4,addr,sizeof (uint32_t));

send(sockfd, (void *)msginit, (size_t)strlen(msginit),0);
printf("Sent.\n");
recv(sockfd,buffer,256,0); //This is where it gets stuck!
printf("%s\n",buffer);
}

最佳答案

我下面的回复是错误的。更深入地研究它,有一个握手过程以及更多需要发生的事情。我将在接下来的几天内回复我的想法。 (这也是我自己正在努力的事情)

<小时/>

按照您的代码,您只会从响应中提取前 256 个字节。

有几个选项,具体取决于您想要数据的速度。最后,您可能不会看到太大的差异(如果有的话)。但你确实有选择。

1 - 进行recv 调用,立即开始一个循环,直到获得完整响应为止。如果您需要尽快获取数据,我建议您使用此方法。确保那里有一个 sleep/usleep 调用,否则 CPU 会非常困难。

它可能看起来像这样:

send(sockfd, (void *)msginit, (size_t)strlen(msginit),0);
printf("Sent.\n");
while (len_recv = recv(sockfd,buffer,256,0)){
if (len_recv > 0){
// there was an error. handle it here.
}
// copy your buffer if you need to, otherwise...
printf("%s",buffer);
usleep(10000);
}

2 - 使用 MSG_WAITALL 选项,该选项将阻塞接收调用,直到从请求的服务器接收到整个消息,然后从套接字中提取所有数据。这就是我每天处理数百万个套接字请求的方法。

len_recv = recv(sockfd,buffer,256,MSG_WAITALL);
if (len_recv > 0){
// start a while loop like above
// copy the buffer if you need to, or...
printf("%s",buffer);
}

就我个人而言,在运行速度相当快(每天数亿个请求)的代码中,我使用 MSG_WAITALL 选项和足够大的缓冲区来满足我的需要,这样我就不会循环我的 recv 调用。这可能对您不起作用,但好处是您不必考虑循环中的额外 cpu 周期。如果您正在执行大量请求或需要解析数据而不仅仅是转储输出,这尤其方便。

如果您可以向我提供有关如何使用此功能的更多详细信息,我可以整理更完整且经过测试的代码示例,以及更直接的建议。

关于C SOCKS5 代理接口(interface)未从代理服务器接收任何内容。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27030959/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com