58 lines
1.9 KiB
C
58 lines
1.9 KiB
C
#include "../network_internal.h"
|
|
|
|
ktid_define(knPackage);
|
|
ktid_define(knPackageQueueElem);
|
|
ktid_define(knChannel);
|
|
ktid_define(knSocketChanneled);
|
|
|
|
Maybe knSocketChanneled_open(){
|
|
knSocketChanneled* newSocket=malloc(sizeof(knSocketChanneled));
|
|
newSocket->localEndpoint=knIPV4Endpoint_create(knIPV4Address_fromBytes(0,0,0,0),0);
|
|
newSocket->remoteEndpoint=newSocket->localEndpoint;
|
|
newSocket->channels=NULL;
|
|
newSocket->channelsAmount=0;
|
|
return SUCCESS(UniHeapPtr(knSocketChanneled, newSocket));
|
|
}
|
|
|
|
Maybe knSocketChanneled_close(knSocketChanneled* socket){
|
|
int result=
|
|
#if KN_USE_WINSOCK
|
|
closesocket
|
|
#else
|
|
close
|
|
#endif
|
|
(socket->socketfd);
|
|
if(result==-1) {
|
|
safethrow("can't close socket",;);
|
|
}
|
|
else return MaybeNull;
|
|
}
|
|
|
|
knChannel* __createChannel(){
|
|
knChannel* ch=malloc(sizeof(knChannel));
|
|
ch->queueStart=NULL;
|
|
return ch;
|
|
}
|
|
|
|
Maybe knSocketChanneled_createChannel(knSocketChanneled* socket){
|
|
if(socket->channelsAmount == 65535)
|
|
safethrow("max amount of channels",;);
|
|
u16 channelsAmountPrev=socket->channelsAmount;
|
|
socket->channelsAmount++;
|
|
if(channelsAmountPrev==0)
|
|
socket->channels=malloc(sizeof(knChannel*));
|
|
else
|
|
socket->channels=realloc(socket->channels, socket->channelsAmount*sizeof(knChannel*));
|
|
socket->channels[channelsAmountPrev]=__createChannel();
|
|
return SUCCESS(UniUInt64(channelsAmountPrev));
|
|
}
|
|
|
|
Maybe knSocketChanneled_listen(knSocketChanneled* socket, knIPV4Endpoint localEndp);
|
|
|
|
Maybe knSocketChanneled_connect(knSocketChanneled* socket, knIPV4Endpoint remoteEndp);
|
|
|
|
Maybe knSocketChanneled_accept(knSocketChanneled* socket);
|
|
|
|
Maybe knSocketChanneled_send(knSocketChanneled* socket, u16 destinationIndex, u8* data, u32 dataLength);
|
|
|
|
Maybe knSocketChanneled_receive(knSocketChanneled* socket, u16 destinationIndex, u8* buffer, u32 bufferLength); |