Olá, preciso de criar uma função que deverá fazer a ligação ao porto 80 do servidor “servername” proceder ao envio de um pedido em que a lista de parâmetros/valores do pedido POST é definida com base nos parâmetros dela. Só que após a execução da função, o valor inserido nos parâmetros não está sendo inserido no formulário (PHP) do servidor, mesmo que estejam contidos no buffer.
#include <netdb.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int my_connect(char *servername, char *port); void recv_server_reply(int s); void submeter_dados(char *servername, char *uri, char *plate, char *owner, double value); char http_msg[] = "POST %sHTTP/1.1\r\n" "Host: %s\r\n" "Content-Type: application/x-www-form-urlencoded\r\n" "Content-Length: %ld\r\n" "Connection: close\r\n" "\r\n" "%s"; int main (int argc, char* const argv[]) { //enviar dados submeter_dados("servidor.pt", "/ficheiro/redirecionado/peloformulario", "PL1819", "John", 5000.0); return 0; } void recv_server_reply(int s) { char buf[4096]; printf("Reply from server: "); while(1) { int n = read(s, buf, 1); if(n <= 0) break; putchar(buf[0]); fflush(stdout); if(buf[0]=='\n') printf(": "); } printf("\n\n"); } int my_connect(char *servername, char *port) { //get server address using getaddrinfo struct addrinfo hints; struct addrinfo *addrs; memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_family = AF_INET; int r = getaddrinfo(servername, port, &hints, &addrs); if (r != 0) { fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(r)); exit(1); } //create socket int s = socket(AF_INET, SOCK_STREAM, 0); if (s == -1) { perror("socket"); exit(2); } //connect to server r = connect(s, addrs->ai_addr, addrs->ai_addrlen); if (r == -1) { perror("connect"); close(s); exit(3); } return s; } void submeter_dados(char *servername, char *uri, char *plate, char *owner, double value){ int sd = my_connect(severname, "80"); char params[4096]; char buffer[1000]; sprintf(params, "plate=%.6s&owner=%s&value=%.2lf", plate, owner, value); snprintf(buffer, sizeof(buffer), http_msg, uri, servername, strlen(params), params); write(sd, buffer, strlen(buffer)); recv_server_reply(sd); }
Obrigado pela ajuda!