我正在使用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);


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

最佳答案

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上完成的实际工作分配到其他线程或进程,以便服务器无需等待即可处理后续请求)。

关于c - C套接字-从端口监听,现在如何发送回去?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17959903/

10-14 22:09
查看更多