Jump to content
Gonzalez

[C] Multi-Threaded Server

Recommended Posts

Posted
/* 
* Multi-Threaded Server
* by; android @ blackhacking.com
*/

#include <stdio.h>
#include <Winsock2.h>
#include <Ws2tcpip.h>
#include <cstdlib>

void ListenThread(LPVOID listenParams);
int CommunicateThread(LPVOID params);

typedef struct {
int ListenSocket;
} ListenParameters;

typedef struct {
struct sockaddr_in client;
int socket;
} ConnectedSocket;

int main(int argc, char *argv[]) {
WSADATA wsaData;
int servSocket;
struct sockaddr_in serv;
ListenParameters listenParams;

char buf[1024] = {0};

unsigned short port = atoi(argv[1]);

if (argc != 1 || !port) {
printf("Usage: <server.exe> <port>\n");
return 0;
}

if (WSAStartup(MAKEWORD(2,2), &wsaData)) {
printf("WSAStartup failed!");
return 1;
}

serv.sin_family = AF_INET;
serv.sin_addr.S_un.S_addr = NULL;
serv.sin_port = htons(port);

servSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
bind(servSocket, (sockaddr *)&serv, sizeof(serv));

listenParams.ListenSocket = servSocket;

CreateThread(0, 0, (LPTHREAD_START_ROUTINE)&ListenThread, &listenParams, 0, 0);

while (true)
Sleep(5000);

closesocket(servSocket);
WSACleanup();
return 0;
}

void ListenThread(LPVOID params) {
ListenParameters listenParams = *(ListenParameters *)params;

struct sockaddr_in client;
int tempSock;
socklen_t clientSize;

clientSize = sizeof(client);
listen(listenParams.ListenSocket, SOMAXCONN);

while (true) {
tempSock = accept(listenParams.ListenSocket, (sockaddr *)&client, &clientSize);

if (tempSock == SOCKET_ERROR)
continue;

printf("%s:%d // Connection Initiated\n", inet_ntoa(client.sin_addr), client.sin_port);

ConnectedSocket socketStruct;

socketStruct.client = client;
socketStruct.socket = tempSock;

CreateThread(0, 0, (LPTHREAD_START_ROUTINE)&CommunicateThread, &socketStruct, 0, 0);
Sleep(50);
}
ExitThread(0);
}

int CommunicateThread(LPVOID params) {
ConnectedSocket connectedSocket = *(ConnectedSocket *)params;
int socket = connectedSocket.socket;
char * addr = inet_ntoa(connectedSocket.client.sin_addr);
short port = connectedSocket.client.sin_port;
char * reply = "Reply from server!\n";

send(socket, reply, strlen(reply), 0);
printf("%s:%d // Sent: %s\n", addr, port, reply);
printf("%s:%d // Connection Terminated", addr, port);

closesocket(socket);
ExitThread(0);
}

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...