【发布时间】:2018-09-15 02:08:56
【问题描述】:
我正在尝试创建一个代理服务器,目前想知道为什么我正在测试它的 iPhone 发送一个 CONNECT 请求,得到“HTTP 200 连接已建立”的响应,之后通常不会响应。 (有时它会立即响应“0”或NULL)
我实际上并没有连接到 iPhone 想要去的地方,但我正在发回一个响应,表明代理已连接
终端输出:
./proxy 9000
此时我在 iPhone 代理设置中输入我的本地 ip
示例输出:
REC:
CONNECT clientmetrics.kik.com:443 HTTP/1.1
Host: clientmetrics.kik.com
User-Agent: Kik/14.4.0.11622 CFNetwork/897.15 Darwin/17.5.0
Connection: keep-alive
Proxy-Connection: keep-alive
Sent:
HTTP/1.1 200 Connection Established
REC:
// Typically \0 or a 0, or no recv takes place
代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<netdb.h>
#include<netinet/in.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<unistd.h>
if(argc == 2) {
int main(int argc, char* argv[]) {
system("clear");
// Set up socket, family, port, ip address
int serversocket = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in serverinfo;
serverinfo.sin_family = AF_INET;
serverinfo.sin_addr.s_addr = INADDR_ANY;
serverinfo.sin_port = htons(atoi(argv[1]));
// bind server info to socket
if(bind(serversocket, (struct sockaddr*)&serverinfo, sizeof(serverinfo)) == -1) {
printf("failed to bind port to socket, change port\n");
return -1;
}
// accept a connection
listen(serversocket, 1);
int clientsocket = accept(serversocket, NULL, NULL);
// recv and print client message
char buffer[2048];
memset(buffer, 0, sizeof(buffer));
if(recv(clientsocket, buffer, sizeof(buffer), 0) == -1) {
printf("Failed in recv function\n");
} else {
printf("REC\n%s\n", buffer);
}
// send Connection Established
char* sendbuffer = "HTTP/1.1 200 Connection Established";
if(send(clientsocket, sendbuffer, sizeof(sendbuffer), 0) == -1) {
printf("Failed in send function\n");
} else {
printf("Sent:\n%s\n", sendbuffer);
// Recv response from iPhone
memset(buffer, 0, sizeof(buffer));
if(recv(clientsocket, buffer, sizeof(buffer), 0) == -1) {
printf("Failed in recv function\n");
} else {
printf("REC:\n%s\n", buffer);
}
}
} else {
printf("Usage: ./proxy <port>\n");
return 0;
}
}
【问题讨论】:
-
'printf("REC:\n%s\n", buffer);'缓冲区不保证 NUL 终止,任何接收到的数据也不保证不包含嵌入的 NUL。
-
在将 HTTP 200 发送到 iPhone 后,接收数据可能需要大约 20 秒,当我使用从 start 到 2048 的 for 循环打印响应时 - 所有值都是 NULL,所以缓冲区是没有被任何 iPhone 数据改变
标签: c iphone http proxy http-proxy