Tag: http

C.循环压缩+发送(gzip)ZLIB

我目前正在用C构建一个HTTP服务器。 请注意这段代码: #define CHUNK 0x4000 z_stream strm; unsigned char out[CHUNK]; int ret; char buff[200]; strm.zalloc = Z_NULL; strm.zfree = Z_NULL; strm.opaque = Z_NULL; int windowsBits = 15; int GZIP_ENCODING = 16; ret = deflateInit2(&strm, Z_BEST_SPEED, Z_DEFLATED, windowsBits | GZIP_ENCODING, 1, Z_DEFAULT_STRATEGY); fill(buff); //fill buff with infos do { strm.next_in = (z_const unsigned char *)buff; strm.avail_in […]

在C:代理HTTP请求到另一台服务器

我正在尝试将HTTP请求代理到另一个HTTP服务器。 上游HTTP服务器的主机名和端口号分别为server_proxy_hostname和server_proxy_port。 第一步是对server_proxy_hostname进行DNS查找。 其次 ,我创建了一个网络套接字并将其连接到我从DNS获得的IP地址。 最后一步 :在两个套接字上等待新数据。 当数据到达时,我立即将其读取到缓冲区,然后将其写入另一个套接字。 这维持HTTP客户端和上游HTTP服务器之间的双向通信。 如果任何一个sockets关闭 ,我关闭另一个sockets 。 现在的问题是它无法正常工作。 (它超时) 我相信我获取IP地址的方式是正确的,所以问题必须是我的while循环(它永远不会终止?)或我调用connect()的部分。 我尝试为read()和select()添加错误终止,但这也不起作用。 void handle_proxy_request(int fd) { char * targetHostName = server_proxy_hostname; int targetPort = server_proxy_port; struct hostent *info; info = gethostbyname(targetHostName); struct in_addr ** ipAddresslist; ipAddresslist = (struct in_addr **) (info -> h_addr_list); struct in_addr * ipAddress = ipAddresslist[0]; printf(“ip address […]

简单的网络服务器不起作用

我正在尝试在C中编写一个Web服务器。我知道我可以使用许多不同的库,但我希望它只能用winsock运行。 服务器和客户端可以来回发送数据,但加载网页是不可能的。 每次我收到“服务器无法访问”消息,但在服务器上我收到正在发送正文的消息。 我究竟做错了什么? 编辑我正在使用chrome和microsoft edge #include #include #include #pragma comment(lib,”ws2_32.lib”) void error(const char* err){ printf(“ERROR: %s\n”, err); exit(1); } char* readline(SOCKET s){ FILE * f = tmpfile(); char rec; int i=0; while(recv(s, &rec, 1, 0)>0){ i++; if(rec!=’\r’ && rec!=’\n’) fwrite(&rec, 1, 1, f); if(rec==’\r’ || rec==’\n’) break; } if(i==0){ fclose(f); return NULL; } fseek(f, […]

http请求没有收到全部信息 – C.

连接到服务器后,我需要使用GET命令从中获取所有信息。 由于某种原因,我不允许在我的get命令之后输入\r\n ,因此我发送到服务器的命令类似于GET http://somethingrandom.com HTTP/1.0 。 在将请求发送到地址后,我没有收到与终端正常GET相同的输出: 更具体地说,我收到以下信息: http状态 一些奇怪的数据: 日期 服务器 最后修改 ETag的 接受-范围 内容长度 变化 连接 内容类型 我认为\r\n的作用是完全忽略这些信息。 (在此示例中,额外的标记信息)。 如果它与我的代码有关(最有可能),我会在之后提供它。

libcurl – PUT问题后的POST

我正在使用libcurl在C中编写一个http客户端。 但是,当重新使用相同的句柄传输PUT后跟POST时,我遇到了一个奇怪的问题。 下面的示例代码: #include void send_a_put(CURL *handle){ curl_easy_setopt(handle, CURLOPT_UPLOAD, 1L); //PUT curl_easy_setopt(handle, CURLOPT_INFILESIZE, 0L); curl_easy_perform(handle); } void send_a_post(CURL *handle){ curl_easy_setopt(handle, CURLOPT_POST, 1L); //POST curl_easy_setopt(handle, CURLOPT_POSTFIELDSIZE, 0L); curl_easy_perform(handle); } int main(void){ CURL *handle = curl_easy_init(); curl_easy_setopt(handle, CURLOPT_URL, “http://localhost:8888/”); curl_easy_setopt(handle, CURLOPT_HTTPHEADER, curl_slist_append(NULL, “Expect:”)); curl_easy_setopt(handle, CURLOPT_VERBOSE, 1L); //for debug send_a_put(handle); send_a_post(handle); curl_easy_cleanup(handle); return 0; } 问题是,发送PUT然后发送POST ,它发送2个PUT : […]

使用HTTP / POST传输大文件

如何在C(或C ++)中使用HTTP协议上传(非常)大文件? 我知道这不是上传大文件的正确方法,但这不是重点。 我已经看过有关C ++文件的POST传输的消息来源,但我注意到,每次,WHOLE二进制文件都包含在POST序列中(在“–bound”之间)。 因此,在深入和深入了解Webkit / Gecko源代码之前,有人知道它们是如何做的吗?

使用httpSendRequest c ++上传文件

我试图通过POST请求(c ++和winapi)将文件发送到HTTP服务器,步骤: // Read file into “buff” and file size into “buffSize” …. …. …. HINTERNET internetRoot; HINTERNET httpSession; HINTERNET httpRequest; internetRoot = InternetOpen(agent_info, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, NULL); //Connecting to the http server httpSession = InternetConnect(internetRoot, IP,PORT_NUMBER, NULL, NULL, INTERNET_SERVICE_HTTP, NULL, NULL); //Creating a new HTTP POST request to the default resource on the server […]

使用fork和dup的简单http通用服务器

我正在尝试编写一个非常基本的HTTP服务器。 我想将服务器和服务分成两个单独的可执行文件(类似于inetd)。 所以我有一个通用服务器,它使用exec分叉服务并执行其代码。 主循环如下: while(true) { int client_sock; if ((client_sock = accept(server_sock, (struct sockaddr *) NULL, NULL)) < 0) { return -1; } pid_t pid = fork(); if (pid == 0) { close(server_sock); close(0); dup(client_sock); close(1); dup(client_sock); execvp(argv[2], argv+2); return -1; } else if (pid < 0) { assert(false); } close(client_sock); } 该服务读取stdin,并在stdout上写入并处理简单的http请求。 当我使用nc连接到我的服务器时,一切似乎都工作正常。 nc接收并显示预期的http回复。 […]

用\ r \ n \ r \ n检测http头的结尾

使用recv我想获取http标头,以便我可以解析内容长度。 但是我在检测换行时遇到了问题。 或者实际上我甚至必须检测换行符,或者我第一次读入缓冲区时始终是完整的标题(假设我有足够长的缓冲区)。 这是用C写的。 编辑:查看一些相关问题我担心的一件事是“…”标题中断的“\ r \ n”可能会被两个不同的recv()调用拉入缓冲区,这会阻止你的代码识别标题中断。“

从CGI C模块返回http错误代码

我有一个用C语言编写的CGI模块,对于某些条件我想从这个模块返回HTTP错误400。 问题是 – 我不知道如何从模块返回HTTP错误。 看起来像我的模块中的’return(-1)’,返回500内部服务器错误。 我已经尝试过返回400等但是静脉。 我甚至试过“printf(”状态:400“);” 在返回-1之前(如此处所示: 如何从C ++ CGI程序返回500 HTTP状态 )但这不起作用。 对此有任何建议将不胜感激。 编辑:[已解决]我能够从python模块返回HTTP错误代码(稍后由此C CGI模块调用)。 所以没有尝试下面评论中提到的建议。 谢谢你提供帮助。