【问题标题】:C Sockets - Listened from a port, now how to send back to it?C Sockets - 从一个端口监听,现在如何发送回它?
【发布时间】:2013-07-31 00:58:22
【问题描述】:

我正在使用 C 中的套接字制作 Web 代理。基本上,我侦听给定的端口号,从中接收 HTML 请求,发出请求,然后将我得到的内容发送回它的来源。

我已经完成了第一部分。我能够读取请求并将其发送到必要的 Web 服务器,并且我得到了有效的响应。我只是不确定如何将该响应发送到请求它的端口。

(我正在使用 Netcat 测试我的代码以发出请求并获得响应,而目前我尝试发送的响应没有被 Netcat 打印。)

这是我的相关代码:

struct sockaddr_in port;
bzero((char *) &port, sizeof(port));
port.sin_family = AF_INET;
port.sin_port = htons(atoi(argv[1]));
port.sin_addr.s_addr = INADDR_ANY;
int socket;
int acceptSocket;
char response[RESPONSE_SIZE];

socket = Socket(AF_INET, SOCK_STREAM, 0);
Bind(socket, (struct sockaddr *) &port, sizeof(port));
Listen(socket, 0);
acceptSocket = Accept(socket, NULL, NULL);

if (acceptSocket >= 0)
  printf("Connection open on port %s\n", argv[1]);

if (!ForwardHTTPRequest(acceptSocket, response))
      printf("Forward error\n");

shutdown(socket, 0);
Connect(socket, (struct sockaddr *) &port, sizeof(port));
Send(socket, response, strlen(response), 0);

最后三行是我尝试发回响应。我关闭了套接字的读取端,连接以便发送,然后发送。但这并没有产生任何响应。

【问题讨论】:

  • 请注意:bzero() 函数是古老的,已被弃用,在当前版本的 POSIX.1 中甚至不包括在内。请改用memset()。 (如果您的代码中有bcopy(),请改用memcpy()memmove()...)此外,您的代码示例使用名为Socket()Bind()Listen()Connect()Accept()。这些是拼写错误,还是您实际上使用这些名称实现了功能? (你看,大小写有所不同。)
  • 调用你从acceptacceptSocket返回的套接字是有误导性的。您应该将其称为 clientSocket 或类似的名称,以表明它对应于您的客户端。

标签: c sockets


【解决方案1】:

acceptSocket 是您用于通信的套接字,会话已建立。只需在关闭之前在该套接字上发回一条消息。

关闭 控制 套接字是不寻常的,除非您绝对确定您不想再处理任何请求。服务器的基本工作流程是:

create listensocket
bind listensocket
while working:
    worksocket = accept listensocket
    read and write to worksocket as much as you want
    close worksocket
shutdown/close listensocket

(尽管为了响应性,worksocket 上完成的实际工作被转移到不同的线程或进程,以便服务器无需等待即可处理后续请求)。

【讨论】:

  • 我喜欢简单的问题。谢谢!
  • 或者在他的情况下,让它成为非阻塞的,一切都应该没问题。我根本不会涉及线程。
猜你喜欢
  • 1970-01-01
  • 2016-06-14
  • 2012-09-26
  • 1970-01-01
  • 2012-05-17
  • 1970-01-01
  • 2012-03-27
  • 2012-06-13
  • 2013-12-26
相关资源
最近更新 更多