110 lines
2.5 KiB
C++
110 lines
2.5 KiB
C++
#include "stdafx.h"
|
|
#include "Sockets.h"
|
|
|
|
SceNetId Sockets::Connect(SceNetInAddr_t address, uint16_t port, int timeOutSeconds)
|
|
{
|
|
// Set up socket params.
|
|
SceNetSockaddrIn addr = { 0 };
|
|
addr.sin_family = SCE_NET_AF_INET;
|
|
addr.sin_addr.s_addr = address;
|
|
addr.sin_port = sceNetHtons(port);
|
|
|
|
// Create socket.
|
|
auto sock = sceNetSocket("SendEventSock", SCE_NET_AF_INET, SCE_NET_SOCK_STREAM, SCE_NET_IPPROTO_TCP);
|
|
if (sock < 0)
|
|
{
|
|
klog("Sockets::Connect() Failed to allocate sock: %llX %llX\n", sock, *sceNetErrnoLoc());
|
|
return -1;
|
|
}
|
|
|
|
// Set connection/transmission time out.
|
|
int sock_timeout = timeOutSeconds * 1000000;
|
|
sceNetSetsockopt(sock, SCE_NET_SOL_SOCKET, SCE_NET_SO_CONNECTTIMEO, &sock_timeout, sizeof(sock_timeout));
|
|
sceNetSetsockopt(sock, SCE_NET_SOL_SOCKET, SCE_NET_SO_SNDTIMEO, &sock_timeout, sizeof(sock_timeout));
|
|
sceNetSetsockopt(sock, SCE_NET_SOL_SOCKET, SCE_NET_SO_RCVTIMEO, &sock_timeout, sizeof(sock_timeout));
|
|
|
|
// Connect to the socket.
|
|
auto res = sceNetConnect(sock, (SceNetSockaddr*)&addr, sizeof(addr));
|
|
if (!res)
|
|
return sock;
|
|
else
|
|
{
|
|
klog("Sockets::Connect() sceNetConnect(): %llX %llX\n", res, *sceNetErrnoLoc());
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
bool Sockets::SendInt(SceNetId Sock, int val)
|
|
{
|
|
auto res = sceNetSend(Sock, &val, sizeof(int), 0);
|
|
if (res <= 0)
|
|
{
|
|
klog("SendInt(): Failed to send %llX\n", res);
|
|
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool Sockets::RecvInt(SceNetId Sock, int* val)
|
|
{
|
|
auto res = sceNetRecv(Sock, val, sizeof(int), 0);
|
|
if (res <= 0)
|
|
{
|
|
klog("RecvInt(): Failed to recv %llX\n", res);
|
|
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool Sockets::SendLargeData(SceNetId Sock, unsigned char* data, size_t dataLen)
|
|
{
|
|
unsigned char* CurrentPosition = data;
|
|
size_t DataLeft = dataLen;
|
|
int res = 0;
|
|
|
|
while (DataLeft > 0)
|
|
{
|
|
size_t DataChunkSize = std::min((size_t)8192, DataLeft);
|
|
|
|
res = sceNetSend(Sock, CurrentPosition, DataChunkSize, 0);
|
|
|
|
if (res < 0)
|
|
{
|
|
klog("SendLargeData() Error: %llX(%llX)\n", res, *sceNetErrnoLoc());
|
|
return false;
|
|
}
|
|
|
|
DataLeft -= res;
|
|
CurrentPosition += res;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool Sockets::RecvLargeData(SceNetId Sock, unsigned char* data, size_t dataLen)
|
|
{
|
|
size_t DataLeft = dataLen;
|
|
int Received = 0;
|
|
int res = 0;
|
|
|
|
while (DataLeft > 0)
|
|
{
|
|
size_t DataChunkSize = std::min((size_t)8192, DataLeft);
|
|
res = sceNetRecv(Sock, data + Received, DataChunkSize, 0);
|
|
|
|
if (res < 0)
|
|
{
|
|
klog("RecvLargeData() Error: %llX(%llX)\n", res, *sceNetErrnoLoc());
|
|
return false;
|
|
}
|
|
|
|
Received += res;
|
|
DataLeft -= res;
|
|
}
|
|
|
|
return true;
|
|
} |