[working] wysyla i odbiera dane

This commit is contained in:
2019-12-26 15:11:55 +01:00
parent fc65d4b146
commit dcfb945c0b
38 changed files with 442 additions and 18 deletions

View File

@@ -1,2 +1 @@
 client.cpp  Client.vcxproj -> C:\Users\bartool\MyData\MyCode\Cpp\VisualStudio_lap\LanChat\Debug\Client.exe
Client.vcxproj -> C:\Users\bartool\MyData\MyCode\Cpp\VisualStudio_lap\LanChat\Debug\Client.exe

Binary file not shown.

Binary file not shown.

View File

@@ -1,5 +1,7 @@
//Client //Client
#include <SocketLibrary/SocketLibrary.h> #include <SocketLibrary/SocketLibrary.h>
//#include <string>
#include <iostream>
using namespace SocketLibrary; using namespace SocketLibrary;
@@ -8,10 +10,33 @@ int main()
if (Network::Initialize() == true) if (Network::Initialize() == true)
{ {
Log::Print("[CLIENT] Winsok zostal zainicjolizowany. Mozemy dzialac."); Log::Print("[CLIENT] Winsok zostal zainicjolizowany. Mozemy dzialac.");
Socket socket;
if (socket.Create() == Result::Success)
{
Log::Print("[CLIENT] Utworzylem socket.");
if (socket.Connect(Endpoint("127.0.0.1", 54000)) == Result::Success)
{
Log::Print("[CLIENT] Polaczylem sie serverem.");
std::string outString = "Wysylam z klienta.";
char buffer[256];
strcpy_s(buffer, "witam z klienta!\0");
while (true)
{
socket.SendAll(outString.data(), outString.size());
//socket.SendAll(buffer, 256);
std::cout << "wyslalem 256 bajtow" << std::endl;
Sleep(1000);
}
}
socket.Close();
}
} }
Network::Shutdown(); Network::Shutdown();
system("pause");
return 0; return 0;
} }

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,2 +1 @@
 server.cpp  Server.vcxproj -> C:\Users\bartool\MyData\MyCode\Cpp\VisualStudio_lap\LanChat\Debug\Server.exe
Server.vcxproj -> C:\Users\bartool\MyData\MyCode\Cpp\VisualStudio_lap\LanChat\Debug\Server.exe

Binary file not shown.

Binary file not shown.

View File

@@ -1,6 +1,6 @@
//Server //Server
#include <SocketLibrary/SocketLibrary.h> #include <SocketLibrary/SocketLibrary.h>
#include <iostream>
using namespace SocketLibrary; using namespace SocketLibrary;
int main() int main()
@@ -8,15 +8,41 @@ int main()
if (Network::Initialize() == true) if (Network::Initialize() == true)
{ {
Log::Print("[SERVER] Winsok zostal zainicjolizowany. Mozemy dzialac."); Log::Print("[SERVER] Winsok zostal zainicjolizowany. Mozemy dzialac.");
Socket socket;
if (socket.Create() == Result::Success) Socket socketTCP(Protocol::TCP);
Socket socketUDP(Protocol::UDP);
if (socketTCP.Create() == Result::Success)
{ {
socketUDP.Create();
socketUDP.Bind(Endpoint("0.0.0.0", 54001));
Log::Print("[SERVER] Utworzylem gniazdo."); Log::Print("[SERVER] Utworzylem gniazdo.");
socket.Close(); if (socketTCP.BindAndListen(Endpoint("127.0.0.1", 54000), 5) == Result::Success)
{
Log::Print("[SERVER] sukces");
Socket newConnection;
if (socketTCP.Accpet(newConnection) == Result::Success)
{
Log::Print("[SERVER] accept: sukces");
std::string buffer = "";
int size = 0;
while (true)
{
newConnection.ReciveAll(buffer, size);
std::cout << "[" << size << "] "<< buffer << std::endl;
buffer = "";
}
newConnection.Close();
} }
else else
{ {
Log::PrintError("[SERVER] Nie udalo mi sie utworzyc gniazda.", -1); Log::PrintError("[SERVER] accept: porazka", -1);
}
}
socketTCP.Close();
}
else
{
Log::PrintError("[SERVER] porazka", -1);
} }
} }

View File

@@ -1,2 +1,3 @@
 Socket.cpp  Socket.cpp
C:\Users\bartool\MyData\MyCode\Cpp\VisualStudio_lap\LanChat\SocketLibrary\Socket.cpp(239,27): warning C4018: '<': signed/unsigned mismatch
SocketLibrary.vcxproj -> C:\Users\bartool\MyData\MyCode\Cpp\VisualStudio_lap\LanChat\Debug\SocketLibrary.lib SocketLibrary.vcxproj -> C:\Users\bartool\MyData\MyCode\Cpp\VisualStudio_lap\LanChat\Debug\SocketLibrary.lib

View File

@@ -0,0 +1,79 @@
#include "Endpoint.h"
//#include <WS2tcpip.h>
#include "Log.h"
#include <assert.h>
using namespace SocketLibrary;
Endpoint::Endpoint(const char* ip, unsigned short port)
{
this->_port = port;
in_addr addr;
int result = inet_pton(AF_INET, ip, &addr);
if (result == 1)
{
if (addr.S_un.S_addr != INADDR_NONE)
{
_ip_string = ip;
_hostname = ip;
_ipversion = IPVersion::IPv4;
_socketaddr.sin_family = AF_INET;
_socketaddr.sin_port = htons(_port);
memcpy(&_socketaddr.sin_addr, &addr, sizeof(in_addr));
return;
}
}
else
{
std::string invalidIP = ip;
Log::PrintError("To nie jest prawidlowy adres IP. [" + invalidIP + "]", result);
}
}
Endpoint::Endpoint(sockaddr* addr)
{
assert(addr->sa_family == AF_INET);
sockaddr_in* newaddr = (sockaddr_in*)addr;
_ipversion = IPVersion::IPv4;
_port = ntohs(newaddr->sin_port);
_ip_string.resize(16);
inet_ntop(AF_INET, &newaddr->sin_addr, &_ip_string[0], 16);
_hostname = _ip_string;
}
IPVersion Endpoint::GetIpVersion()
{
return _ipversion;
}
std::string Endpoint::GetHostName()
{
return _hostname;
}
std::string Endpoint::GetIpString()
{
return _ip_string;
}
unsigned short Endpoint::GetPort()
{
return _port;
}
sockaddr_in Endpoint::GetSocketaddrIP()
{
return _socketaddr;
}
void SocketLibrary::Endpoint::Print()
{
Log::Print("Hostname: " + _hostname);
Log::Print("IP: " + _ip_string);
Log::Print("Port: " + std::to_string(_port));
Log::Print("Family: " + std::to_string(_socketaddr.sin_family));
}

26
SocketLibrary/Endpoint.h Normal file
View File

@@ -0,0 +1,26 @@
#pragma once
#include <string>
#include <WS2tcpip.h>
#include "ipVersion.h"
namespace SocketLibrary
{
class Endpoint
{
public:
Endpoint(const char* ip, unsigned short port);
Endpoint(sockaddr* addr);
IPVersion GetIpVersion();
std::string GetHostName();
std::string GetIpString();
unsigned short GetPort();
sockaddr_in GetSocketaddrIP();
void Print();
private:
IPVersion _ipversion = IPVersion::Unknown;
std::string _hostname = "";
std::string _ip_string = "";
unsigned short _port = 0;
sockaddr_in _socketaddr = {};
};
}

12
SocketLibrary/Protocol.h Normal file
View File

@@ -0,0 +1,12 @@
#pragma once
namespace SocketLibrary
{
enum class Protocol
{
Unknown,
TCP,
UDP
};
}

View File

@@ -4,13 +4,18 @@
namespace SocketLibrary namespace SocketLibrary
{ {
Socket::Socket(IPVersion ipversion, SOCKET socket) Socket::Socket(IPVersion ipversion, Protocol protocol, SOCKET socket)
:_ipversion(ipversion),_socket(socket) :_ipversion(ipversion), _socket(socket), _protocol(protocol)
{ {
assert(_ipversion == IPVersion::IPv4); assert(_ipversion == IPVersion::IPv4);
} }
Socket::Socket(Protocol protocol)
:_ipversion(IPVersion::IPv4), _protocol(protocol), _socket(INVALID_SOCKET)
{
assert(_ipversion == IPVersion::IPv4);
}
Result Socket::Create() Result Socket::Create()
{ {
@@ -18,23 +23,59 @@ namespace SocketLibrary
if (_socket != INVALID_SOCKET) if (_socket != INVALID_SOCKET)
{ {
Log::PrintError("Gniazdo juz istnieje.", -1);
return Result::Fail; return Result::Fail;
} }
else
{
Log::Print("Gniazdo nie istnieje. Tworze gniazdo...");
}
switch (_protocol)
{
case SocketLibrary::Protocol::Unknown:
Log::PrintError("Nie mozna utworzyc gniazda o nieznamym typie.", -1);
return Result::Fail;
break;
case SocketLibrary::Protocol::TCP:
_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); _socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
break;
case SocketLibrary::Protocol::UDP:
_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
break;
default:
break;
}
if (_socket == INVALID_SOCKET) if (_socket == INVALID_SOCKET)
{ {
int error = WSAGetLastError(); int error = WSAGetLastError();
Log::PrintError("Nie udalo sie utworzyc gniazda", error); Log::PrintError("Nie udalo sie utworzyc gniazda", error);
return Result::Fail; return Result::Fail;
} }
else
{
Log::Print("Gniazdo zostalo utworzone. [SOCKET:" + std::to_string(_socket) + "]");
}
Log::Print("Gniazdo zostalo utworzone."); switch (_protocol)
{
case SocketLibrary::Protocol::TCP:
if (SetSocketOption(SocketOption::TCP_NoDelay, TRUE) == Result::Success) if (SetSocketOption(SocketOption::TCP_NoDelay, TRUE) == Result::Success)
{ {
Log::Print("NoDelay zostalo wlaczone na gniezdzie."); Log::Print("NoDelay zostalo wlaczone na gniezdzie TCP.");
} }
break;
case SocketLibrary::Protocol::UDP:
if (SetSocketOption(SocketOption::UDP_Broadcast, TRUE) == Result::Success)
{
Log::Print("UDP_Broadcast zostalo wlaczone na gniezdzie UDP.");
}
break;
default:
break;
}
return Result::Success; return Result::Success;
} }
@@ -46,6 +87,10 @@ namespace SocketLibrary
Log::PrintError("Niemozna zamknac nieistniejacego gniazda.", -1); Log::PrintError("Niemozna zamknac nieistniejacego gniazda.", -1);
return Result::Fail; return Result::Fail;
} }
else
{
Log::Print("Zamykam gniazdo [SOCKET:" + std::to_string(_socket) + "]");
}
int result = closesocket(_socket); int result = closesocket(_socket);
if (result != 0) if (result != 0)
@@ -54,11 +99,161 @@ namespace SocketLibrary
Log::PrintError("Nie udalo sie zamknac gniazda.", error); Log::PrintError("Nie udalo sie zamknac gniazda.", error);
return Result::Fail; return Result::Fail;
} }
else
{
Log::Print("Gniazdo zostalo zamkniete.");
}
_socket = INVALID_SOCKET; _socket = INVALID_SOCKET;
return Result::Success; return Result::Success;
} }
Result Socket::Bind(Endpoint endpoint)
{
sockaddr_in addr = endpoint.GetSocketaddrIP();
int result = bind(_socket, (sockaddr*)(&addr), sizeof(sockaddr_in));
if (result != 0)
{
int error = WSAGetLastError();
Log::PrintError("Nie udalo sie powiazac gniazda z portem.", error);
return Result::Fail;
}
else
{
Log::Print("Udalo sie zwiazac gniazdo z wybranym portem. [PORT]:" + std::to_string(endpoint.GetPort())
+ " [SOCKET]:" + std::to_string(_socket));
}
return Result::Success;
}
Result Socket::BindAndListen(Endpoint endpoint, int waitConnection)
{
if (Bind(endpoint) != Result::Success)
{
return Result::Fail;
}
int result = listen(_socket, waitConnection);
if (result != 0)
{
int error = WSAGetLastError();
Log::PrintError("Nie udalo sie ustawic gniazda w tryb nasluchu", error);
return Result::Fail;
}
else
{
Log::Print("Gniazdo jest od teraz w trybie nasluchu.");
}
return Result::Success;
}
Result Socket::Accpet(Socket& outSocket)
{
sockaddr_in addr = {};
int len = sizeof(sockaddr_in);
SOCKET acceptedConnection = accept(_socket, (sockaddr*)(&addr), &len);
if (acceptedConnection == INVALID_SOCKET)
{
int error = WSAGetLastError();
Log::PrintError("Wystapil problem przy akceptacji polaczenia.", error);
return Result::Fail;
}
else
{
Log::Print("Zaakceptowano nowe poleczenie [SOCKET:" + std::to_string(acceptedConnection) + "]");
}
Endpoint newConnectionEndpoint((sockaddr*)&addr);
newConnectionEndpoint.Print();
outSocket = Socket(IPVersion::IPv4, Protocol::TCP, acceptedConnection);
return Result::Success;
}
Result Socket::Connect(Endpoint endpoint)
{
sockaddr_in addr = endpoint.GetSocketaddrIP();
int result = connect(_socket, (sockaddr*)(&addr), sizeof(sockaddr_in));
if (result != 0)
{
int error = WSAGetLastError();
Log::PrintError("Nie mozna nawiazac polaczenia z " + endpoint.GetIpString(), error);
return Result::Fail;
}
else
{
Log::Print("Nawiazano nowe polaczenie z " + endpoint.GetIpString());
}
return Result::Success;
}
Result Socket::SendAll(const void* data, int numberOfBytes)
{
int totalBytesSent = 0;
uint32_t numberBytesToSend = numberOfBytes;
numberBytesToSend = htonl(numberBytesToSend);
Result result = Send(&numberBytesToSend, sizeof(uint32_t), totalBytesSent);
if (totalBytesSent != sizeof(uint32_t))
{
Log::PrintError("Nie mozna wyslac dlugosci strumienia danych.", -1);
return Result::Fail;
}
totalBytesSent = 0;
while (totalBytesSent < numberOfBytes)
{
int bytesLeft = numberOfBytes - totalBytesSent;
int bytesSent = 0;
char* bufferOffset = (char*)data + totalBytesSent;
result = Send(bufferOffset, bytesLeft, bytesSent);
if (result == Result::Fail)
{
Log::PrintError("Wyslalem " + std::to_string(totalBytesSent) + " z " + std::to_string(numberOfBytes) + " bajtow.", -1);
return Result::Fail;
}
totalBytesSent += bytesSent;
}
return Result::Success;
}
Result Socket::ReciveAll(std::string& output, int& numberOfBytes)
{
int totalBytesRecive = 0;
uint32_t numberBytesToRecive = 0;
Result result = Recive(&numberBytesToRecive, sizeof(uint32_t), totalBytesRecive);
if (totalBytesRecive != sizeof(uint32_t))
{
Log::PrintError("Nie mozna odebrac dlugosci strumienia dancyh.", -1);
Result::Fail;
}
totalBytesRecive = 0;
numberBytesToRecive = ntohl(numberBytesToRecive);
output.resize(numberBytesToRecive + 1);
while (totalBytesRecive < numberBytesToRecive)
{
int bytesLeft = numberBytesToRecive - totalBytesRecive;
int bytesRecive = 0;
char* bufferOffset = &output[0] + totalBytesRecive;
Result result = Recive(bufferOffset, bytesLeft, bytesRecive);
if (result == Result::Fail)
{
Log::PrintError("Odebralem " + std::to_string(totalBytesRecive) + " z " + std::to_string(numberOfBytes) + " bajtow.", -1);
return Result::Fail;
}
totalBytesRecive += bytesRecive;
}
numberOfBytes = totalBytesRecive;
return Result::Success;
}
SOCKET Socket::GetSocket() SOCKET Socket::GetSocket()
{ {
return _socket; return _socket;
@@ -68,6 +263,40 @@ namespace SocketLibrary
{ {
return _ipversion; return _ipversion;
} }
Result Socket::Send(const void* data, int size, int& bytesSent)
{
bytesSent = send(_socket, (const char*)data, size, NULL);
if (bytesSent == SOCKET_ERROR)
{
int error = WSAGetLastError();
Log::PrintError("Wystapil problem podczas wysylania dancyh.", error);
return Result::Fail;
}
return Result::Success;
}
Result Socket::Recive(void* buffor, int size, int& bytesRecived)
{
bytesRecived = recv(_socket, (char*)buffor, size, NULL);
if (bytesRecived == 0)
{
Log::PrintError("Polaczenie zostalo zamkniete.", -1);
// TODO - zamknac gniazdo
return Result::Fail;
}
if (bytesRecived == SOCKET_ERROR)
{
int error = WSAGetLastError();
Log::PrintError("Wystapil problem podczas odbierania dancyh.", error);
return Result::Fail;
}
return Result::Success;
}
Result Socket::SetSocketOption(SocketOption option, BOOL value) Result Socket::SetSocketOption(SocketOption option, BOOL value)
{ {
int result = 0; int result = 0;
@@ -76,6 +305,9 @@ namespace SocketLibrary
case SocketOption::TCP_NoDelay: case SocketOption::TCP_NoDelay:
result = setsockopt(_socket, IPPROTO_TCP, TCP_NODELAY, (const char*)&value, sizeof(value)); result = setsockopt(_socket, IPPROTO_TCP, TCP_NODELAY, (const char*)&value, sizeof(value));
break; break;
case SocketOption::UDP_Broadcast:
result = setsockopt(_socket, SOL_SOCKET, SO_BROADCAST, (const char*)&value, sizeof(value));
break;
default: default:
return Result::Fail; return Result::Fail;
} }

View File

@@ -2,22 +2,34 @@
#include <WinSock2.h> #include <WinSock2.h>
#include "ipVersion.h" #include "ipVersion.h"
#include "Protocol.h"
#include "Result.h" #include "Result.h"
#include "SocketOption.h" #include "SocketOption.h"
#include "Endpoint.h"
namespace SocketLibrary namespace SocketLibrary
{ {
class Socket class Socket
{ {
public: public:
Socket(IPVersion ipversion = IPVersion::IPv4, SOCKET socket = INVALID_SOCKET); //(..., SocketHandle handle) Socket(IPVersion ipversion = IPVersion::IPv4, Protocol protocol = Protocol::TCP, SOCKET socket = INVALID_SOCKET); //(..., SocketHandle handle)
Socket(Protocol protocol);
Result Create(); Result Create();
Result Close(); Result Close();
Result Bind(Endpoint endpoint);
Result BindAndListen(Endpoint endpoint, int waitConnection = 5);
Result Accpet(Socket& outSocket);
Result Connect(Endpoint endpoint);
Result SendAll(const void * data, int numberOfBytes);
Result ReciveAll(std::string& output, int& numberOfBytes);
SOCKET GetSocket(); //SocketHandle GetHandle() SOCKET GetSocket(); //SocketHandle GetHandle()
IPVersion GetIpVersion(); IPVersion GetIpVersion();
private: private:
Result Send(const void * data, int size, int& bytesSent);
Result Recive(void * buffor, int size, int & bytesRecived);
Result SetSocketOption(SocketOption option, BOOL value); Result SetSocketOption(SocketOption option, BOOL value);
IPVersion _ipversion = IPVersion::IPv4; IPVersion _ipversion = IPVersion::IPv4;
Protocol _protocol = Protocol::TCP;
SOCKET _socket = INVALID_SOCKET; SOCKET _socket = INVALID_SOCKET;
}; };

View File

@@ -142,15 +142,18 @@
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="Endpoint.h" />
<ClInclude Include="ipVersion.h" /> <ClInclude Include="ipVersion.h" />
<ClInclude Include="Log.h" /> <ClInclude Include="Log.h" />
<ClInclude Include="Network.h" /> <ClInclude Include="Network.h" />
<ClInclude Include="Protocol.h" />
<ClInclude Include="Result.h" /> <ClInclude Include="Result.h" />
<ClInclude Include="Socket.h" /> <ClInclude Include="Socket.h" />
<ClInclude Include="SocketLibrary.h" /> <ClInclude Include="SocketLibrary.h" />
<ClInclude Include="SocketOption.h" /> <ClInclude Include="SocketOption.h" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="Endpoint.cpp" />
<ClCompile Include="Log.cpp" /> <ClCompile Include="Log.cpp" />
<ClCompile Include="Network.cpp" /> <ClCompile Include="Network.cpp" />
<ClCompile Include="Socket.cpp" /> <ClCompile Include="Socket.cpp" />

View File

@@ -36,6 +36,12 @@
<ClInclude Include="SocketOption.h"> <ClInclude Include="SocketOption.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="Endpoint.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Protocol.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="Network.cpp"> <ClCompile Include="Network.cpp">
@@ -47,5 +53,8 @@
<ClCompile Include="Socket.cpp"> <ClCompile Include="Socket.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="Endpoint.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@@ -5,5 +5,6 @@ namespace SocketLibrary
enum class SocketOption enum class SocketOption
{ {
TCP_NoDelay, TCP_NoDelay,
UDP_Broadcast,
}; };
} }