Skip to content

Instantly share code, notes, and snippets.

@joaorbrandao
Created September 25, 2018 23:04
Show Gist options
  • Select an option

  • Save joaorbrandao/ac70032ccf7e95e316852e2ae3b8663f to your computer and use it in GitHub Desktop.

Select an option

Save joaorbrandao/ac70032ccf7e95e316852e2ae3b8663f to your computer and use it in GitHub Desktop.
Function to make a POST request to a server using windows sockets in C.
/**
This function makes a connection to the server,
sends the data and retreive the response.
Don't forget to include:
#include <winsock2.h>
And to add this to your code:
#pragma comment(lib,"ws2_32.lib") //Winsock Library
**/
unsigned char sendToServer(const char *address, int port, char *uri, char *data){
WSADATA wsa;
if (WSAStartup(MAKEWORD(2,2),&wsa) != 0){
fprintf(stderr, "ERROR: Failed to Initialize Socket %d \n", WSAGetLastError());
return 0;
}
SOCKET s;
struct sockaddr_in server;
//Create a TCP Socket
/*
AF_INET - This is IPv4
SOCK_STREAM - This means connection oriented TCP (SOCK_DGRAM - UDP)
0 - Use IPPROTO_TCP
*/
if((s = socket(AF_INET , SOCK_STREAM , 0 )) == INVALID_SOCKET){
fprintf(stderr, "ERROR: Could not create socket %d \n", WSAGetLastError());
return 0;
}
server.sin_addr.s_addr = inet_addr(address); //Set server address
server.sin_family = AF_INET; //Set IPv4
server.sin_port = htons(port); //Set server port
//Connect to remote server
printf("LOG: Connecting to server... \n");
if (connect(s, (struct sockaddr *)&server, sizeof(server)) != 0){
fprintf(stderr, "ERROR: Connecting to server \n");
closesocket(s);
return 0;
}
//Create HTTP Message
char *message;
if((message = (char *) calloc(2*strlen(data), sizeof(char))) == NULL)
perror("ERROR");
char *content;
if((content = (char *) calloc(strlen(data)+1, sizeof(char))) == NULL)
perror("ERROR");
char host[64];
host[0] = '\0';
sprintf(content, data);
sprintf(host, address, ":", port);
sprintf(message, "\
POST %s HTTP/1.1\r\n\
Host: %s\r\n\
Connection: keep-alive\r\n\
Content-Type: application/json; charset=utf-8;\r\n\
Content-Length: %d\r\n\
Pragma: no-cache\r\n\
Cache-Control: no-cache\r\n\r\n\
%s\r\n", uri, host, strlen(content), content);
//SEND DATA TO SERVER
if( send(s, message, strlen(message), 0) < 0){
fprintf(stderr, "ERROR: Failed sending message to server \n");
free(content);
free(message);
closesocket(s);
return 0;
}
printf("\tLOG:\t...Data sent to server!\n");
//GET DATA FROM SERVER
char server_reply[65536];
int recv_size;
if((recv_size = recv(s , server_reply , 65536 , 0)) == SOCKET_ERROR){
fprintf(stderr, "ERROR: Failed receiving message from the server \n");
free(content);
free(message);
closesocket(s);
return 0;
}
//Add a NULL terminating character to make it a proper string before printing
server_reply[recv_size] = '\0';
printf("LOG: Server response: \n %s \n", server_reply);
free(content);
free(message);
closesocket(s);
WSACleanup();
return 1;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment