metalsvm/kernel/client.c
Carl-Benedikt Krüger b89c4096a5 ...
2011-08-03 13:54:36 +02:00

120 lines
2.8 KiB
C

#include "client.h"
#include "../drivers/net/util.h"
#define SOCKET_ERROR -1
int cli_sendBuffer(Client* cli,void* pBuffer, unsigned int bufferlen)
{
int iResult;
ClientEventArgs e;
//abfragen ob client existiert!! wichtig
if (cli->sSocket != SOCKET_ERROR)
{
iResult= send(cli->sSocket,(char*)pBuffer,bufferlen,0);
if (cli->_OnWrite != 0)
{
e.dwLen = iResult;
e.pBuffer = pBuffer;
cli->_OnWrite(&e);
}
return iResult;
}
else
return -3;
}
int cli_ConnectTo(Client* cli,char * pAdresse,unsigned short Port,int webAdresse)
{
ClientEventArgs e;
cli->sSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // Einen Socket erstellen
cli->wPort=Port;
cli->adAddr.sin_port = htons(cli->wPort);
if (cli->sSocket == SOCKET_ERROR)
return -2;
if (webAdresse) //Fall es sich um eine Internet Adresse Handelt
return -1;
else //Fall es sich um eine LAN Adresse im 127.0.0.1 Stil handelt
cli->adAddr.sin_addr.s_addr = inet_addr(pAdresse);
if (connect(cli->sSocket,(const struct sockaddr*)&cli->adAddr, sizeof(cli->adAddr))==0)
{
create_kernel_task(&cli->bThread,cli_WaitForPacket,cli);
if (cli->_OnConnect != 0)
{
e.dwLen = 0;
e.pBuffer = 0;
cli->_OnConnect(&e);
}
return 0;
}
else
return -1;
};
int cli_DisconnectFrom(Client* cli)
{
shutdown(cli->sSocket,2);
closesocket(cli->sSocket);
cli->sSocket = SOCKET_ERROR;
return 0;
}
void cli_WaitForPacket(Client* cli)
{
int iResult=1;
char pTmpBuffer[DEF_BUFFERSIZE+1];
ClientEventArgs e;
while (iResult > 0)
{
iResult = recv(cli->sSocket ,pTmpBuffer, DEF_BUFFERSIZE, 0);
if (iResult > 0)
{
pTmpBuffer[iResult]='\0';
if (cli->_OnRead != 0)
{
e.dwLen = iResult;
e.pBuffer = pTmpBuffer;
cli->_OnRead( &e);
}
}
else //Verbindung geschlossen
{
cli->sSocket=SOCKET_ERROR;
if (cli->_OnDisconnect != 0)
{
e.dwLen = 0;
e.pBuffer = 0;
cli->_OnDisconnect( &e);
}
}
}
};
int cli_init(Client* cli)
{
cli->_OnConnect = 0;
cli->_OnWrite = 0;
cli->_OnRead = 0;
cli->_OnDisconnect = 0;
cli->adAddr.sin_addr.s_addr = INADDR_ANY; // IP'S die der Client annehmen soll
cli->adAddr.sin_family = AF_INET; // AdressFamilie (TCP/IP)
// adAddr.sin_port = htons(iPort); // Port auf dem der Client erreichbar seien soll
return NULL;
}
int cli_destroy(Client* cli)
{
closesocket(cli->sSocket);;
return NULL;
}