C套接字 - 从端口收听,现在如何发送回去?

时间:2013-07-31 00:58:23

标签: c sockets

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

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

1 个答案:

答案 0 :(得分: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上完成的实际工作是针对不同的线程或进程,因此服务器可以处理后续请求而无需等待。)