如何读取客户端C的GET请求
How to read GET request from client C
我的程序建立了一个 HTTP 服务器。在调用 listen()
和 accept()
之后,如何读取这样的 GET 请求:
GET /path HTTP/1.1\r\n\r\n
假设您正在使用阻塞套接字,首先您需要知道是否有数据可供读取。您可以使用 select api 来完成。
接下来接受returns一个socket FD给你。使用该套接字 FD 可以接收数据。
接受代码示例
struct sockaddr_in client_addr;
int addr_len;
int new_fd;
addr_len = sizeof(struct sockaddr_in);
new_fd = accept(socket_fd, (struct sockaddr *)&client_addr,(socklen_t *)&addr_len);
Select 并阅读示例
struct timeval timeout;
timeout.tv_sec = 0;
timeout.tv_usec = 100;
ret_value = select(max_fd + 1, READ_FD_SETS, NULL , NULL , &timeout);
if ((ret_value <= 0) && (errno!=EINTR))
{
//error
}
else
{
//read data now
rc = recv(new_fd, buffer, buffer length, 0)
}
注意:如果你想要更好的性能,你可能喜欢在 epoll 套接字上进行研发。
我的程序建立了一个 HTTP 服务器。在调用 listen()
和 accept()
之后,如何读取这样的 GET 请求:
GET /path HTTP/1.1\r\n\r\n
假设您正在使用阻塞套接字,首先您需要知道是否有数据可供读取。您可以使用 select api 来完成。
接下来接受returns一个socket FD给你。使用该套接字 FD 可以接收数据。
接受代码示例
struct sockaddr_in client_addr;
int addr_len;
int new_fd;
addr_len = sizeof(struct sockaddr_in);
new_fd = accept(socket_fd, (struct sockaddr *)&client_addr,(socklen_t *)&addr_len);
Select 并阅读示例
struct timeval timeout;
timeout.tv_sec = 0;
timeout.tv_usec = 100;
ret_value = select(max_fd + 1, READ_FD_SETS, NULL , NULL , &timeout);
if ((ret_value <= 0) && (errno!=EINTR))
{
//error
}
else
{
//read data now
rc = recv(new_fd, buffer, buffer length, 0)
}
注意:如果你想要更好的性能,你可能喜欢在 epoll 套接字上进行研发。