146 lines
No EOL
3.6 KiB
C++
146 lines
No EOL
3.6 KiB
C++
#include <iostream>
|
|
#include <stdio.h>
|
|
#include <WS2tcpip.h>
|
|
#include <ctime>
|
|
|
|
#pragma warning(disable : 4996) //_CRT_SECURE_NO_WARNINGS
|
|
#pragma comment(lib,"ws2_32.lib")
|
|
|
|
#define DEFAULT_PORT "6327"
|
|
#define DEFAULT_BUFLEN 512
|
|
WSADATA wsaData;
|
|
int wsRes, sendRes;
|
|
SOCKET listener = INVALID_SOCKET;
|
|
SOCKET client = INVALID_SOCKET;
|
|
char recvbuf[DEFAULT_BUFLEN];
|
|
int recvbuflen = DEFAULT_BUFLEN;
|
|
|
|
int main() {
|
|
wsRes = WSAStartup(MAKEWORD(2, 2), &wsaData);
|
|
if (wsRes != 0) {
|
|
std::cerr << "Errot at StartUP\n";
|
|
return 1;
|
|
}
|
|
struct addrinfo* result = NULL;
|
|
struct addrinfo hints;
|
|
ZeroMemory(&hints, sizeof(hints));
|
|
hints.ai_family = AF_INET;
|
|
hints.ai_socktype = SOCK_STREAM;
|
|
hints.ai_protocol = IPPROTO_TCP;
|
|
hints.ai_flags = AI_PASSIVE;
|
|
|
|
wsRes = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result);
|
|
if (wsRes != 0) {
|
|
std::cerr << "Errot at getaddrinfo\n";
|
|
WSACleanup();
|
|
return 1;
|
|
}
|
|
|
|
listener = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
|
|
if (listener == SOCKET_ERROR) {
|
|
std::cerr << "Error creating socket\n";
|
|
freeaddrinfo(result);
|
|
WSACleanup();
|
|
return 1;
|
|
}
|
|
|
|
wsRes = bind(listener, result->ai_addr, result->ai_addrlen);
|
|
if (wsRes == SOCKET_ERROR) {
|
|
std::cerr << "Error binding socket\n";
|
|
freeaddrinfo(result);
|
|
WSACleanup();
|
|
return 1;
|
|
}
|
|
|
|
freeaddrinfo(result);
|
|
|
|
wsRes = listen(listener, SOMAXCONN);
|
|
if (wsRes == SOCKET_ERROR) {
|
|
std::cerr << "Error listening\n";
|
|
closesocket(listener);
|
|
WSACleanup();
|
|
return 1;
|
|
}
|
|
std::cout << "Started listening on port " << DEFAULT_PORT << "!\n";
|
|
sockaddr_in client_s;
|
|
int clientSize = sizeof(client_s);
|
|
|
|
client = accept(listener, NULL, NULL);
|
|
if (client == SOCKET_ERROR) {
|
|
std::cerr << "Error accepting\n";
|
|
closesocket(listener);
|
|
WSACleanup();
|
|
return 1;
|
|
}
|
|
|
|
char host[NI_MAXHOST]; // Client's remote name
|
|
char service[NI_MAXSERV]; // Service (i.e. port) the client is connect on
|
|
|
|
ZeroMemory(host, NI_MAXHOST); // same as memset(host, 0, NI_MAXHOST);
|
|
ZeroMemory(service, NI_MAXSERV);
|
|
|
|
if (getnameinfo((sockaddr*)& client_s, sizeof(client), host, NI_MAXHOST, service, NI_MAXSERV, 0) == 0)
|
|
{
|
|
std::cout << host << " connected on port " << service << std::endl;
|
|
}
|
|
else
|
|
{
|
|
inet_ntop(AF_INET, &client_s.sin_addr, host, NI_MAXHOST);
|
|
std::cout << host << " connected on port " <<
|
|
ntohs(client_s.sin_port) << std::endl;
|
|
}
|
|
|
|
|
|
|
|
std::string yourname = "Logged in!\n";
|
|
sendRes = send(client, yourname.c_str(), yourname.size(), 0);
|
|
if (sendRes == SOCKET_ERROR) {
|
|
std::cout << "send failed with error:" << WSAGetLastError() << "\n";
|
|
closesocket(client);
|
|
WSACleanup();
|
|
return 1;
|
|
}
|
|
char* name;
|
|
while (true) {
|
|
memset(recvbuf, 0, DEFAULT_BUFLEN);
|
|
wsRes = recv(client, recvbuf, recvbuflen, 0);
|
|
if (wsRes > 0) {
|
|
|
|
std::cout <<"Bytes received: " << wsRes << std::endl;
|
|
if (recvbuf =="exit") {
|
|
std::string message = "Shut it down!";
|
|
sendRes = send(client, message.c_str(), message.size(), 0);
|
|
if (sendRes == SOCKET_ERROR) {
|
|
std::cout << "send failed with error:" << WSAGetLastError() << "\n";
|
|
closesocket(client);
|
|
WSACleanup();
|
|
return 1;
|
|
}
|
|
std::cout << "Shutting down.\n";
|
|
closesocket(client);
|
|
WSACleanup();
|
|
return 1;
|
|
}
|
|
else {
|
|
std::cout <<"\""<< recvbuf <<"\""<< std::endl;
|
|
}
|
|
}
|
|
else if (wsRes == 0) {
|
|
sendRes = send(client, recvbuf, wsRes, 0);
|
|
if (sendRes == SOCKET_ERROR) {
|
|
std::cout << "send failed with error:" << WSAGetLastError() << "\n";
|
|
closesocket(client);
|
|
WSACleanup();
|
|
return 1;
|
|
}
|
|
}
|
|
else {
|
|
printf("recv failed with error: %d\n", WSAGetLastError());
|
|
closesocket(client);
|
|
WSACleanup();
|
|
return 1;
|
|
}
|
|
}
|
|
closesocket(listener);
|
|
return 0;
|
|
} |