c - 如何读取客户端C的GET请求

标签 c network-programming httprequest

我的程序建立了一个HTTP服务器。调用 listen()accept() 后,如何读取如下所示的 GET 请求:

GET /path HTTP/1.1\r\n\r\n

最佳答案

假设您使用阻塞套接字,首先您需要知道数据是否可供读取。您可以使用 select api 来完成此操作。

接下来accept返回一个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);

选择并阅读示例

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 套接字上进行研发。

关于c - 如何读取客户端C的GET请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31900473/

相关文章:

c - 数据包嗅探器 : IP Header, 服务类型在 C 中输出 0

c# - C#“使用” block 并捕获异常

angular - 尽管请求处理成功,但从发布请求中获得空响应

go - 使用 golang 对每个请求的上下文超时实现

c - 如何在 C 中从文件读入无符号字符缓冲区并从中写入文件

c - 这个按位左移是做什么的?

c - C中的数组桶排序

c - 带有循环的 Swift 3.1 模式

ubuntu - Ubuntu 中的 FFmpeg RTP 网络问题

c - 为什么 getsockopt() 没有返回 TCP_MAXSEG 的预期值?