Я пытаюсь написать клиента REST в C. В настоящее время он является автономным, но позже я планирую его перенести на нашу кодовую базу.Клиент REST в C
Я тестирую это на centos 6.5 с gcc.
Я начал с кода в https://gist.github.com/nolim1t/126991 в качестве ссылки. Это было предложено в quora несколькими членами.
Я изменил приведенный выше код в соответствии с моими потребностями. Когда я попробовал это, я не могу получить действительный ответ от остального сервера.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <netinet/tcp.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
int socket_connect(char *host, in_port_t port){
struct hostent *hp;
struct sockaddr_in addr;
int on = 1, sock;
if((hp = gethostbyname(host)) == NULL){
herror("gethostbyname");
exit(1);
}
bcopy(hp->h_addr, &addr.sin_addr, hp->h_length);
addr.sin_port = htons(port);
addr.sin_family = AF_INET;
sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (const char *)&on, sizeof(int));
if(sock == -1){
perror("setsockopt");
exit(1);
}
if(connect(sock, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) == -1){
perror("connect");
exit(1);
}
return sock;
}
#define BUFFER_SIZE 1024
int main(int argc, char *argv[]){
int fd;
int cx;
char inputBuffer[BUFFER_SIZE];
char buffer[BUFFER_SIZE];
if(argc < 4){
fprintf(stderr, "Usage: %s <hostname> <port> <other-args>\n", argv[0]);
exit(1);
}
fd = socket_connect(argv[1], atoi(argv[2]));
if(fd)
{
printf("socket success\n");
}
cx = snprintf(inputBuffer, BUFFER_SIZE, "GET %s\r\n", argv[3]);
// snprintf(inputBuffer, argv[3], strlen(argv[3]));
write(fd, inputBuffer, cx); // write(fd, char[]*, len);
bzero(buffer, BUFFER_SIZE);
printf("reading response\n");
while(read(fd, buffer, BUFFER_SIZE - 1) != 0){
fprintf(stderr, "%s", buffer);
bzero(buffer, BUFFER_SIZE);
}
shutdown(fd, SHUT_RDWR);
close(fd);
return 0;
}
Это остальное как URL, что я доступ: http://maps.googleapis.com/maps/api/geocode/json?address=chicago
Когда я иду к нему через браузер я могу получить доступ к данным JSON/ответ. Однако, когда я использую программу C, я получаю следующий вывод.
#./rest maps.googleapis.com 80 /maps/api/geocode/json?address=chicago
socket success
reading response
И он остается там на неопределенный срок.
У меня есть пакеты захвата и поток tcp, когда я получаю доступ через программу C, а также через браузер.
Edit:
Спасибо за ответы. Моя оригинальная программа сработала. Отладил это и обнаружил, что корпоративный брандмауэр блокировал пакеты, и поэтому я так и не получил ответа.
Для ответа, отправленного @eyllanesc - Этот код работает частично. По какой-то неизвестной причине пакет FIN с сервера не приходит сразу. Он всегда занимает 4 минуты с момента отправки первого пакета данных. Так что программа держится на 4 минуты, прежде чем она закончится. Спасибо за усилия, хотя.
Не повторяется, './ your_prog maps.googleapis .com 80 "/ maps/api/geocode/json? address = chicago" 'выплюнуть правильный результат – deamentiaemundi
Спасибо. Да, это была проблема с окружающей средой. –