NetSim Source Code Help
Loading...
Searching...
No Matches
Socket.c
Go to the documentation of this file.
1#define _CRT_SECURE_NO_WARNINGS
2#include <stdio.h>
3#include <stdlib.h>
4#include <string.h>
5#include <Ws2tcpip.h>
6#include <synchapi.h>
7#include <windows.h>
8#include <stdbool.h>
9#include <signal.h>
10#include "CLI.h"
11#pragma comment(lib,"ws2_32.lib")
12#pragma comment(lib,"Synchronization.lib")
13
14WSADATA wsa;
16#define DEFAULT_BUFLEN 1024
17#define DEFAULT_PORT "8999"
18
21
22void send_to_socket(ptrCLIENTINFO info,char* buf, int len)
23{
24 //fprintf(stderr, "\nSending %s\n", buf);
25 int iSendResult = send(info->CLIENT.sockClient.clientSocket, buf, len, 0);
26 if (iSendResult == SOCKET_ERROR)
27 {
28 printf("send failed with error: %d\n", WSAGetLastError());
29 closesocket(info->CLIENT.sockClient.clientSocket);
30 }
31}
32
34{
35 struct addrinfo hints;
36 int iResult;
37 struct addrinfo *result = NULL;
38
39 ZeroMemory(&hints, sizeof(hints));
40 hints.ai_family = AF_INET;
41 hints.ai_socktype = SOCK_STREAM;
42 hints.ai_protocol = IPPROTO_TCP;
43 hints.ai_flags = AI_PASSIVE;
44
45 // Resolve the server address and port
46 iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result);
47 if (iResult != 0)
48 {
49 fprintf(stderr, "getaddrinfo failed with error: %d\n", iResult);
50 WSACleanup();
51 return false;
52 }
53
54 // Create a SOCKET for connecting to server
55 listenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
56 if (listenSocket == INVALID_SOCKET)
57 {
58 fprintf(stderr, "socket failed with error: %ld\n", WSAGetLastError());
59 freeaddrinfo(result);
60 WSACleanup();
61 return false;
62 }
63
64 // Setup the TCP listening socket
65 iResult = bind(listenSocket, result->ai_addr, (int)result->ai_addrlen);
66 if (iResult == SOCKET_ERROR)
67 {
68 fprintf(stderr, "bind failed with error: %d\n", WSAGetLastError());
69 freeaddrinfo(result);
70 closesocket(listenSocket);
71 WSACleanup();
72 return false;
73 }
74
75 freeaddrinfo(result);
76
77 SOCKET clientSocket;
78 char recvbuf[DEFAULT_BUFLEN];
79 int recvbuflen = DEFAULT_BUFLEN;
80 while (1)
81 {
82 iResult = listen(listenSocket, SOMAXCONN);
83 if (iResult == SOCKET_ERROR)
84 {
85 fprintf(stderr, "listen failed with error: %d\n", WSAGetLastError());
86 closesocket(listenSocket);
87 WSACleanup();
88 return false;
89 }
90
91 // Accept a client socket
92 clientSocket = accept(listenSocket, NULL, NULL);
93 if (clientSocket == INVALID_SOCKET)
94 {
95 fprintf(stderr, "accept failed with error: %d\n", WSAGetLastError());
96 closesocket(listenSocket);
97 WSACleanup();
98 return false;
99 }
100
101 iResult = recv(clientSocket, recvbuf, recvbuflen, 0);
102
103 if (iResult > 0)
104 {
105 add_new_socket_client(clientSocket, recvbuf);
106 }
107 else
108 {
109 fprintf(stderr, "recv failed with error: %d\n", WSAGetLastError());
110 closesocket(clientSocket);
111 return false;
112 }
113 }
114}
115
117{
118 printf("\nInitialising Winsock...");
119 if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
120 {
121 fprintf(stderr, "Failed. Error Code : %d\n", WSAGetLastError());
122 return;
123 }
124 printf("Initialized.\n");
125
126 CreateThread(NULL, 1024, listen_for_client, NULL, false, &listenThreadId);
127
128}
129
131{
132 ptrCLIENTINFO clientInfo = lpParam;
133 SOCKCLIENTINFO sockClient = clientInfo->CLIENT.sockClient;
134 int iResult;
135 char recvbuf[DEFAULT_BUFLEN];
136 int recvbuflen = DEFAULT_BUFLEN;
137
138 // Receive until the peer shuts down the connection
139 do
140 {
141
142 iResult = recv(sockClient.clientSocket, recvbuf, recvbuflen, 0);
143 if (iResult > 0)
144 {
145 process_command(clientInfo, recvbuf, iResult);
146 WaitOnAddress(&sockClient.iswait,
147 &sockClient.dontUseMe,
148 sizeof sockClient.dontUseMe,
149 INFINITE);
150 send_to_socket(clientInfo, "__continue__", (int)(strlen("__continue__")) + 1);
151 }
152 else if (iResult == 0)
153 fprintf(stderr, "Connection closing...\n");
154 else
155 {
156 fprintf(stderr,"recv failed with error: %d\n", WSAGetLastError());
157 closesocket(sockClient.clientSocket);
158 return 1;
159 }
160
161 } while (iResult > 0);
162
163 // shutdown the connection since we're done
164 iResult = shutdown(sockClient.clientSocket, SD_BOTH);
165 if (iResult == SOCKET_ERROR)
166 {
167 fprintf(stderr, "shutdown failed with error: %d\n", WSAGetLastError());
168 closesocket(sockClient.clientSocket);
169 return 1;
170 }
171
172 // cleanup
173 closesocket(sockClient.clientSocket);
174 return 0;
175}
void process_command(ptrCLIENTINFO clientInfo, char *command, int len)
void * add_new_socket_client(SOCKET s, char *name)
#define LPVOID
Definition: Linux.h:81
#define WINAPI
Definition: Linux.h:80
#define DWORD
Definition: Linux.h:79
#define INFINITE
Definition: Linux.h:82
#define HANDLE
Definition: Linux.h:73
HANDLE listenThread
Definition: Socket.c:19
WSADATA wsa
Definition: Socket.c:14
SOCKET listenSocket
Definition: Socket.c:15
#define DEFAULT_PORT
Definition: Socket.c:17
void init_socket()
Definition: Socket.c:116
#define DEFAULT_BUFLEN
Definition: Socket.c:16
DWORD WINAPI command_recv_process(LPVOID lpParam)
Definition: Socket.c:130
DWORD WINAPI listen_for_client(LPVOID lpParam)
Definition: Socket.c:33
void send_to_socket(ptrCLIENTINFO info, char *buf, int len)
Definition: Socket.c:22
DWORD listenThreadId
Definition: Socket.c:20
union stru_clientInfo::client CLIENT
bool dontUseMe
Definition: CLI.h:60
SOCKET clientSocket
Definition: CLI.h:52
SOCKCLIENTINFO sockClient
Definition: CLI.h:74