【问题标题】:gethostbyname, connecting to the internet at large?gethostbyname,连接到整个互联网?
【发布时间】:2012-03-14 20:11:49
【问题描述】:

我正在用 C 语言编写一个基本的代理服务器。

我正在用 firefox 进行测试,我已经让服务器成功接收到浏览器的请求。

但现在我需要将它们发送到 Internet 以获取浏览器想要的页面,我很犹豫。

这是我目前的连接代码。

我不确定端口 8080 是否正确,也不确定“gethostbyname”应该放什么。 这就是我希望得到一些建议的部分。

  int sock = socket( PF_INET, SOCK_STREAM, 0 );

  if ( sock < 0 )
  {
    perror( "socket() failed" );
    return EXIT_FAILURE;
  }

  struct sockaddr_in server;
  struct hostent * hp;

  server.sin_family = PF_INET;
  hp = gethostbyname( "localhost" );
  if ( hp == NULL )
  {
    perror( "Unknown host" );
    return EXIT_FAILURE;
  }

  bcopy( (char *)hp->h_addr, (char *)&server.sin_addr, hp->h_length );
  int port = 8080;
  server.sin_port = htons( port );

  if ( connect( sock, (struct sockaddr *)&server, sizeof( server ) ) < 0 )
  {
    perror( "connect() failed" );
    return EXIT_FAILURE;
  }

【问题讨论】:

  • 回答了我自己的问题--> 端口应该是 80。主机名可以在浏览器请求中找到,例如如果你想要cs.mit.edu/answers.txt,你的主机名是 www.cs.mit.edu

标签: c http proxy network-programming http-proxy


【解决方案1】:

整个 gethostbyname,到处复制(哈哈 - 即使使用过旧的 bcopy)...只需使用 getaddrinfo(为简洁起见,省略了广泛的错误检查):

int ret = getaddrinfo("localhost", "80" /* (or 8080, whichever applies) */, NULL, &res);
if (ret == 0) {
    const struct addrinfo *r;
    for (r = res; r != NULL || ret != 0; r = r->ai_next)
       ret = connect(fd, res->ai_addr, res->ai_addrlen);
}
freeaddrinfo(res);

【讨论】:

    猜你喜欢
    • 2015-09-12
    • 1970-01-01
    • 2014-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多