Add basic sockets
This commit is contained in:
parent
3599be9c61
commit
cebbb1dc19
@ -59,10 +59,13 @@
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
<LanguageStandard>stdcpp20</LanguageStandard>
|
||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
</Link>
|
||||
<PreBuildEvent>
|
||||
<Command>PreBuild.bat</Command>
|
||||
@ -78,6 +81,8 @@
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
<LanguageStandard>stdcpp20</LanguageStandard>
|
||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
@ -85,6 +90,7 @@
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<EntryPointSymbol>mainCRTStartup</EntryPointSymbol>
|
||||
<AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
</Link>
|
||||
<PreBuildEvent>
|
||||
<Command>PreBuild.bat</Command>
|
||||
@ -94,11 +100,22 @@
|
||||
<ClCompile Include="src\Application.cpp" />
|
||||
<ClCompile Include="src\Chat.cpp" />
|
||||
<ClCompile Include="src\main.cpp" />
|
||||
<ClCompile Include="src\pch.cpp">
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
|
||||
<PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
</PrecompiledHeaderFile>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
|
||||
<PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
</PrecompiledHeaderFile>
|
||||
</ClCompile>
|
||||
<ClCompile Include="src\StrConv.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="resource.h" />
|
||||
<ClInclude Include="src\Application.h" />
|
||||
<ClInclude Include="src\Chat.h" />
|
||||
<ClInclude Include="src\pch.h" />
|
||||
<ClInclude Include="src\StrConv.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ResourceCompile Include="WinChat.rc" />
|
||||
|
@ -1,10 +1,6 @@
|
||||
#include "pch.h"
|
||||
#include "Application.h"
|
||||
|
||||
#include <iostream>
|
||||
#include <format>
|
||||
|
||||
#include <CommCtrl.h>
|
||||
|
||||
#include "../resource.h"
|
||||
#include "Chat.h"
|
||||
|
||||
@ -33,7 +29,10 @@ namespace wc {
|
||||
}
|
||||
|
||||
void Application::run() {
|
||||
//First, run the main dialog to get needed input...
|
||||
//First, start a thread to listen for incoming connections...
|
||||
std::thread listenThread(&Application::startListen, this);
|
||||
|
||||
//Then, run the main dialog to get needed input...
|
||||
INT_PTR result = NULL;
|
||||
MainDlgInput* input = new MainDlgInput{ this, -1, -1 };
|
||||
while (result = DialogBoxParam(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DIALOGMAIN), nullptr, (DLGPROC)mainDlgProc, reinterpret_cast<LPARAM>(input))) {
|
||||
@ -50,6 +49,76 @@ namespace wc {
|
||||
//And repeat until the user exits from the main dialog.
|
||||
input = new MainDlgInput{ this, x, y };
|
||||
}
|
||||
|
||||
listenThread.join();
|
||||
}
|
||||
|
||||
void Application::startListen() {
|
||||
WSADATA data = { };
|
||||
if (WSAStartup(MAKEWORD(2, 2), &data) != 0) {
|
||||
std::cerr << std::format("Error: could not initialize WinSock 2!\n");
|
||||
std::exit(1);
|
||||
}
|
||||
|
||||
if (LOBYTE(data.wVersion) != 2 || HIBYTE(data.wVersion) != 2) {
|
||||
std::cerr << std::format("Error: WinSock version 2.2 not available!\n");
|
||||
std::exit(1);
|
||||
}
|
||||
|
||||
addrinfo hints = { };
|
||||
addrinfo* hostInfo = nullptr;
|
||||
hints.ai_family = AF_UNSPEC;
|
||||
hints.ai_socktype = SOCK_STREAM;
|
||||
hints.ai_flags = AI_PASSIVE;
|
||||
getaddrinfo(nullptr, "9430", &hints, &hostInfo);
|
||||
|
||||
SOCKET sock = socket(hostInfo->ai_family, hostInfo->ai_socktype, hostInfo->ai_protocol);
|
||||
if (sock == INVALID_SOCKET) {
|
||||
std::cerr << std::format("Error: could not create network socket!\n");
|
||||
std::exit(1);
|
||||
}
|
||||
|
||||
if (bind(sock, hostInfo->ai_addr, static_cast<int>(hostInfo->ai_addrlen)) != 0) {
|
||||
std::cerr << std::format("Error: could not bind network socket!\n");
|
||||
std::exit(1);
|
||||
}
|
||||
|
||||
freeaddrinfo(hostInfo);
|
||||
listen(sock, 1);
|
||||
|
||||
sockaddr_storage remoteAddr = { };
|
||||
int remoteSize = sizeof(remoteAddr);
|
||||
SOCKET conSock = accept(sock, reinterpret_cast<sockaddr*>(&remoteAddr), &remoteSize);
|
||||
if (conSock == INVALID_SOCKET) {
|
||||
std::cerr << std::format("Error: could not accept connection!\n");;
|
||||
std::exit(1);
|
||||
}
|
||||
|
||||
std::string remoteStr;
|
||||
remoteStr.resize(INET6_ADDRSTRLEN);
|
||||
void* addrLocation = nullptr;
|
||||
if (remoteAddr.ss_family == AF_INET) {
|
||||
addrLocation = reinterpret_cast<void*>(&reinterpret_cast<sockaddr_in*>(&remoteAddr)->sin_addr);
|
||||
}
|
||||
else if (remoteAddr.ss_family = AF_INET6) {
|
||||
addrLocation = reinterpret_cast<void*>(&reinterpret_cast<sockaddr_in6*>(&remoteAddr)->sin6_addr);
|
||||
}
|
||||
inet_ntop(remoteAddr.ss_family, addrLocation, remoteStr.data(), INET6_ADDRSTRLEN);
|
||||
std::cout << std::format("Connected to: {}\n", remoteStr);
|
||||
|
||||
std::string buf(1000, 0);
|
||||
|
||||
int bytesRecvd = 1;
|
||||
while (bytesRecvd = recv(conSock, buf.data(), 1000, 0)) {
|
||||
buf.resize(bytesRecvd);
|
||||
std::cout << std::format("Remote: {}\n", buf);
|
||||
buf.resize(1000);
|
||||
}
|
||||
|
||||
closesocket(conSock);
|
||||
|
||||
closesocket(sock);
|
||||
WSACleanup();
|
||||
}
|
||||
|
||||
BOOL CALLBACK Application::mainDlgProc(HWND dlg, UINT msg, WPARAM wParam, LPARAM lParam) {
|
||||
|
@ -12,7 +12,7 @@ namespace wc {
|
||||
|
||||
~Application();
|
||||
private:
|
||||
|
||||
void startListen();
|
||||
static BOOL CALLBACK mainDlgProc(HWND dlg, UINT msg, WPARAM wParam, LPARAM lParam);
|
||||
|
||||
const std::wstring m_appName;
|
||||
|
@ -1,14 +1,43 @@
|
||||
#include "pch.h"
|
||||
#include "Chat.h"
|
||||
|
||||
#include <format>
|
||||
#include "StrConv.h"
|
||||
|
||||
namespace wc {
|
||||
Chat::Chat(std::wstring address, std::wstring screenname) {
|
||||
MessageBox(nullptr, std::format(L"Address: {}\nScreen Name: {}", address, screenname).c_str(), L"Alert", MB_OK);
|
||||
Chat::Chat(std::wstring address, std::wstring screenname)
|
||||
: m_address(address)
|
||||
, m_screenname(screenname)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void Chat::run() {
|
||||
addrinfo hints = { };
|
||||
addrinfo* destInfo = nullptr;
|
||||
hints.ai_family = AF_UNSPEC;
|
||||
hints.ai_socktype = SOCK_STREAM;
|
||||
getaddrinfo(toStr(m_address).c_str(), "9430", &hints, &destInfo);
|
||||
|
||||
SOCKET sock = socket(destInfo->ai_family, destInfo->ai_socktype, destInfo->ai_protocol);
|
||||
if (sock == INVALID_SOCKET) {
|
||||
std::cerr << std::format("Error: could not create network socket!\n");
|
||||
std::exit(1);
|
||||
}
|
||||
|
||||
if (connect(sock, destInfo->ai_addr, static_cast<int>(destInfo->ai_addrlen)) != 0) {
|
||||
std::cerr << std::format("Error: could not connect to destination!\n");
|
||||
std::exit(1);
|
||||
}
|
||||
|
||||
freeaddrinfo(destInfo);
|
||||
|
||||
std::string data;
|
||||
while (data != "end") {
|
||||
std::getline(std::cin, data);
|
||||
send(sock, data.data(), static_cast<int>(data.size()), 0);
|
||||
}
|
||||
|
||||
closesocket(sock);
|
||||
}
|
||||
|
||||
Chat::~Chat() {
|
||||
|
@ -12,6 +12,7 @@ namespace wc {
|
||||
|
||||
~Chat();
|
||||
private:
|
||||
|
||||
const std::wstring m_address;
|
||||
const std::wstring m_screenname;
|
||||
};
|
||||
}
|
16
WinChat/src/StrConv.cpp
Normal file
16
WinChat/src/StrConv.cpp
Normal file
@ -0,0 +1,16 @@
|
||||
#include "pch.h"
|
||||
#include "StrConv.h"
|
||||
|
||||
namespace wc {
|
||||
std::string toStr(const std::wstring& in) {
|
||||
std::string out;
|
||||
out.resize(in.size() + 1);
|
||||
size_t tempSize = 0;
|
||||
wcstombs_s(&tempSize, out.data(), out.size(), in.c_str(), out.size());
|
||||
return out;
|
||||
}
|
||||
|
||||
std::wstring toWideStr(const std::string& in){
|
||||
return std::wstring(in.begin(), in.end());
|
||||
}
|
||||
}
|
7
WinChat/src/StrConv.h
Normal file
7
WinChat/src/StrConv.h
Normal file
@ -0,0 +1,7 @@
|
||||
#pragma once
|
||||
#include <string>
|
||||
|
||||
namespace wc {
|
||||
std::string toStr(const std::wstring& in);
|
||||
std::wstring toWideStr(const std::string& in);
|
||||
}
|
@ -1,5 +1,4 @@
|
||||
#include <iostream>
|
||||
|
||||
#include "pch.h"
|
||||
#include "version.h"
|
||||
#include "Application.h"
|
||||
|
||||
|
1
WinChat/src/pch.cpp
Normal file
1
WinChat/src/pch.cpp
Normal file
@ -0,0 +1 @@
|
||||
#include "pch.h"
|
13
WinChat/src/pch.h
Normal file
13
WinChat/src/pch.h
Normal file
@ -0,0 +1,13 @@
|
||||
#pragma once
|
||||
|
||||
//STL
|
||||
#include <iostream>
|
||||
#include <format>
|
||||
#include <thread>
|
||||
|
||||
//Windows
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <Windows.h>
|
||||
#include <CommCtrl.h>
|
||||
#include <WinSock2.h>
|
||||
#include <WS2tcpip.h>
|
Loading…
x
Reference in New Issue
Block a user