Refactored project structure, added multithreaded echo server and prime checking server, updated tests.
This commit is contained in:
68
server00.c
Normal file
68
server00.c
Normal file
@@ -0,0 +1,68 @@
|
||||
#include <stdio.h>
|
||||
#include <winsock2.h>
|
||||
#include <pthread.h>
|
||||
#include "server00.h"
|
||||
#include "data.h"
|
||||
|
||||
#define PORT 40000
|
||||
#define BUFFER_SIZE 1024
|
||||
|
||||
|
||||
|
||||
int main()
|
||||
{
|
||||
// load_file();
|
||||
|
||||
WSADATA WSAData;
|
||||
|
||||
SOCKET client;
|
||||
|
||||
SOCKADDR_IN serverAddr, clientAddr;
|
||||
|
||||
WSAStartup(MAKEWORD(2,0), &WSAData);
|
||||
SOCKET server = socket(AF_INET, SOCK_STREAM, 0);
|
||||
|
||||
serverAddr.sin_addr.s_addr = INADDR_ANY;
|
||||
serverAddr.sin_family = AF_INET;
|
||||
serverAddr.sin_port = htons(PORT);
|
||||
|
||||
bind(server, (SOCKADDR *)&serverAddr, sizeof(serverAddr));
|
||||
listen(server, 0);
|
||||
|
||||
printf("Listening for incoming connections...\n");
|
||||
|
||||
int clientAddrSize = sizeof(clientAddr);
|
||||
int connection_number = 0;
|
||||
char_array_t *reply = char_array_create(1024);
|
||||
while((client = accept(server, (SOCKADDR *)&clientAddr, &clientAddrSize)) != INVALID_SOCKET)
|
||||
{
|
||||
struct EchoArgs *args = malloc(sizeof(struct EchoArgs));
|
||||
args->client = client;
|
||||
args->connection = connection_number++;
|
||||
pthread_t thread;
|
||||
pthread_create(&thread, nullptr, echo,(void *) args);
|
||||
}
|
||||
}
|
||||
|
||||
void *echo(void *args) {
|
||||
const auto echoArgs = (struct EchoArgs *) args;
|
||||
char buffer[BUFFER_SIZE] = {0};
|
||||
char_array_t *reply = char_array_create(BUFFER_SIZE);
|
||||
int bytesReceived;
|
||||
int bytesTotal = 0;
|
||||
while ((bytesReceived = recv(echoArgs->client, buffer, sizeof(buffer), 0)) > 0) {
|
||||
// printf(" Client {%d} says: |%.1024s|\n", echoArgs->connection ,buffer);
|
||||
printf("Client sent {%d}: |%d| \n", echoArgs->connection, bytesReceived);
|
||||
|
||||
char_array_append(reply, buffer, bytesReceived);
|
||||
bytesTotal += bytesReceived;
|
||||
memset(buffer, 0, sizeof(buffer));
|
||||
Sleep(20);
|
||||
}
|
||||
printf("Total bytes received {%d}: %d\n", echoArgs->connection, bytesTotal);
|
||||
printf("Sending back {%d}: |%llu| \n", echoArgs->connection, reply->size);
|
||||
send(echoArgs->client, reply->data,reply->size,0);
|
||||
closesocket(echoArgs->client);
|
||||
free(echoArgs);
|
||||
return NULL;
|
||||
}
|
||||
Reference in New Issue
Block a user