mesytec-mnode/demo/stream/platform/windows/server.c
Florian Lüke b6a2ffe5d0 Squashed 'external/nng/' content from commit 29b73962
git-subtree-dir: external/nng
git-subtree-split: 29b73962b939a6fbbf6ea8d5d7680bb06d0eeb99
2024-12-28 04:48:21 +01:00

87 lines
2 KiB
C

// Copyright 2020 Hugo Lindström <hugolm84@gmail.com>
// This software is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
// file was obtained (LICENSE.txt). A copy of the license may also be
// found online at https://opensource.org/licenses/MIT.
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
void
wsa_fatal(const char *func)
{
fprintf(stderr, "%s: %d\n", func, WSAGetLastError());
exit(1);
}
int
server(int portno)
{
WSADATA wsa;
SOCKET s, new_socket;
struct sockaddr_in server, client;
int c;
char * message;
printf("Initialising Winsock...\n");
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) {
wsa_fatal("Failed to call WSAStartup");
}
printf("Initialised WSA.\n");
// Create a socket
if ((s = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) {
wsa_fatal("Could not create socket");
}
printf("Socket created.\n");
// Prepare the sockaddr_in structure
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons(portno);
// Bind
if (bind(s, (struct sockaddr *) &server, sizeof(server)) ==
SOCKET_ERROR) {
wsa_fatal("Bind failed");
}
printf("Bind done\n");
// Listen to incoming connections
listen(s, 3);
// Accept and incoming connection
printf("Waiting for incoming connections...\n");
c = sizeof(struct sockaddr_in);
while ((new_socket = accept(s, (struct sockaddr *) &client, &c)) !=
INVALID_SOCKET) {
printf("Connection accepted\n");
// Reply to the client
message = "Hello Client!";
if (send(new_socket, message, (int) strlen(message), 0) ==
SOCKET_ERROR) {
wsa_fatal("Failed to send message to client!");
}
}
if (new_socket == INVALID_SOCKET) {
wsa_fatal("accept failed");
}
if (closesocket(s) == SOCKET_ERROR) {
wsa_fatal("Failed to close socket");
}
if (WSACleanup() == SOCKET_ERROR) {
wsa_fatal("Failed to WSACleanup");
}
return 0;
}