我正在尝试将一些C代码转换为python。我需要了解原始C代码发出的POST请求的结构。我想将以下C代码转换为cURL命令:
void nonblock(int sock) {
int flags = fcntl(sock, F_GETFL, 0);
flags = flags | O_NONBLOCK;
fcntl(sock, F_SETFL, flags);
}
int pool() {
int sd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
nonblock(sd);
struct sockaddr_in servaddr;
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(poolport);
memcpy(&servaddr.sin_addr, poolip, sizeof(poolip));
pollcount++;
connect(sd, (struct sockaddr *)&servaddr, sizeof(servaddr));
char buffer[1000];
sprintf(buffer, "POST %s HTTP/1.1\r\ncontent-type: application/octet-stream\r\ncontent-length: %i\r\nhost: %s:%i\r\nconnection: close\r\n\r\n[\"mining_data\", \"%s\"]",
workPath,
(19 + (int)strlen(address)),
hostname,
poolport,
address
);
printf("1_____\n%s\n_____\n",
struct timeval tv;
tv.tv_sec = 4;
tv.tv_usec = 0;
fd_set my;
FD_ZERO(&my);
FD_SET(sd, &my);
select(sd+1, NULL, &my, NULL, &tv);
if(!FD_ISSET(sd, &my)) {
close(sd);
usleep(500000);
return -1;
}
send(sd, buffer, strlen(buffer), MSG_NOSIGNAL);
tv.tv_sec = 4;
tv.tv_usec = 0;
FD_ZERO(&my);
FD_SET(sd, &my);
select(sd+1, &my, NULL, NULL, &tv);
if(!FD_ISSET(sd, &my)) {
close(sd);
usleep(500000);
return -1;
}
int bytes = read(sd, buffer, 1000);
// I want what's in buffer here
close(sd);
...
}
缓冲区是:
POST /work HTTP/1.1
content-type: application/octet-stream
content-length: 107
host: veopool.pw:8880
connection: close
["mining_data", "BONJmlU2FUqYgUY60LTIumsYrW/c6MHte64y5KlDzXk5toyEMaBzWm8dHmdMfJmXnqvbYmlwim0hiFmYCCn3Rm0="]
我尝试在cURL中请求与以下相同的数据
curl -v -d '{"mining_data":"BONJmlU2FUqYgUY60LTIumsYrW/c6MHte64y5KlDzXk5toyEMaBzWm8dHmdMfJmXnqvbYmlwim0hiFmYCCn3Rm0="}' -H "content-length: 107" -H "content-type: application/octet-stream" -H "connection: close" -X POST http://veopool.pw:8880/work
几秒钟后,我得到:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Error</title>
</head>
<body>
<pre>Internal Server Error</pre>
</body>
</html>
* Closing connection 0
有人可以告诉我我在搞砸吗?