Created
September 25, 2018 23:04
-
-
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 file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /** | |
| 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