Skip to content

Commit f5941fe

Browse files
v1.0.7
1 parent acaac08 commit f5941fe

File tree

7 files changed

+415
-104
lines changed

7 files changed

+415
-104
lines changed
4.11 KB
Binary file not shown.
512 Bytes
Binary file not shown.
0 Bytes
Binary file not shown.

PacletInfo.wl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ PacletObject[
77
"Creator" -> "Kirill Belov",
88
"License" -> "MIT",
99
"PublisherID" -> "KirillBelov",
10-
"Version" -> "1.0.7",
10+
"Version" -> "1.0.8",
1111
"WolframVersion" -> "12+",
1212
"PrimaryContext" -> "KirillBelov`CSockets`",
1313
"Extensions" -> {

ResourceDefinition.nb

Lines changed: 374 additions & 100 deletions
Large diffs are not rendered by default.

Scripts/Test.wls

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#!/usr/bin/env wolframscript
2+
(* ::Package:: *)
3+
4+
PacletDirectoryLoad[Directory[]]
5+
6+
<<KirillBelov`CSockets`
7+
8+
server = CSocketOpen[8000]
9+
10+
Print[server["DestinationHostname"]]

Source/csockets.c

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,8 @@ DLLEXPORT int socketOpen(WolframLibraryData libData, mint Argc, MArgument *Args,
252252
}
253253

254254
freeaddrinfo(address);
255+
libData->UTF8String_disown(host);
256+
libData->UTF8String_disown(port);
255257

256258
MArgument_setInteger(Res, listenSocket);
257259
return LIBRARY_NO_ERROR;
@@ -325,6 +327,8 @@ static void socketListenerTask(mint taskId, void* vtarg)
325327
libData->ioLibraryFunctions->DataStore_addInteger(ds, server->clients[i]);
326328
libData->ioLibraryFunctions->DataStore_addMNumericArray(ds, data);
327329
libData->ioLibraryFunctions->raiseAsyncEvent(taskId, "Received", ds);
330+
libData->numericarrayLibraryFunctions->MNumericArray_disown(data);
331+
libData->ioLibraryFunctions->deleteDataStore(ds);
328332
} else if (iResult == 0) {
329333
server->clients[i] = INVALID_SOCKET;
330334
}
@@ -435,6 +439,8 @@ DLLEXPORT int socketConnect(WolframLibraryData libData, mint Argc, MArgument *Ar
435439
#endif
436440

437441
MArgument_setInteger(Res, connectSocket);
442+
libData->UTF8String_disown(host);
443+
libData->UTF8String_disown(port);
438444
return LIBRARY_NO_ERROR;
439445
}
440446

@@ -520,6 +526,7 @@ DLLEXPORT int socketBinaryWrite(WolframLibraryData libData, mint Argc, MArgument
520526
}
521527

522528
MArgument_setInteger(Res, clientId);
529+
libData->numericarrayLibraryFunctions->MNumericArray_disown(mArr);
523530
return LIBRARY_NO_ERROR;
524531
}
525532

@@ -538,6 +545,7 @@ DLLEXPORT int socketWriteString(WolframLibraryData libData, mint Argc, MArgument
538545
}
539546

540547
MArgument_setInteger(Res, socketId);
548+
libData->UTF8String_disown(data);
541549
return LIBRARY_NO_ERROR;
542550
}
543551

@@ -581,6 +589,10 @@ DLLEXPORT int socketReadMessage(WolframLibraryData libData, mint Argc, MArgument
581589
return LIBRARY_FUNCTION_ERROR;
582590
}
583591

592+
#ifdef _DEBUG
593+
printf("[socketReadMessage]\n\tsocket id = %d received = %d bytes\n\n", socketId, iResult);
594+
#endif
595+
584596
return LIBRARY_NO_ERROR;
585597
}
586598

@@ -597,6 +609,10 @@ DLLEXPORT int socketPort(WolframLibraryData libData, mint Argc, MArgument *Args,
597609
getsockname(socketId, (struct sockaddr *)&sin, &addrlen);
598610
port = ntohs(sin.sin_port);
599611

612+
#ifdef _DEBUG
613+
printf("[socketHostname]\n\tsocket id = %d hostname = %d\n\n", socketId, port);
614+
#endif
615+
600616
MArgument_setInteger(Res, port);
601617
return LIBRARY_NO_ERROR;
602618
}
@@ -607,14 +623,20 @@ DLLEXPORT int socketPort(WolframLibraryData libData, mint Argc, MArgument *Args,
607623

608624
DLLEXPORT int socketHostname(WolframLibraryData libData, mint Argc, MArgument *Args, MArgument Res) {
609625
SOCKET socketId = MArgument_getInteger(Args[0]);
610-
struct sockaddr_in sin;
611-
char str[INET_ADDRSTRLEN];
626+
struct sockaddr_in sin;
627+
//char str[INET_ADDRSTRLEN];
628+
char *str;
629+
str = (void*)malloc(INET_ADDRSTRLEN * sizeof(char));
612630
int addrlen = sizeof(sin);
613631

614632
getsockname(socketId, (struct sockaddr *)&sin, &addrlen);
615633
struct in_addr ip = sin.sin_addr;
616634
inet_ntop(AF_INET, &ip, str, INET_ADDRSTRLEN);
617635

636+
#ifdef _DEBUG
637+
printf("[socketHostname]\n\tsocket id = %d hostname = %s\n\n", socketId, str);
638+
#endif
639+
618640
MArgument_setUTF8String(Res, str);
619641
return LIBRARY_NO_ERROR;
620642
}
@@ -639,9 +661,14 @@ DLLEXPORT int socketClients(WolframLibraryData libData, mint Argc, MArgument *Ar
639661
libData->MTensor_new(MType_Integer, rank, dims, &data);
640662
mint *out;
641663
out = libData->MTensor_getIntegerData(data);
642-
for (int i = 0; i < 1; i++){
664+
for (int i = 0; i < servers[serverId]->clientsLength; i++){
643665
out[i] = servers[serverId]->clients[i];
644666
}
667+
668+
#ifdef _DEBUG
669+
printf("[socketHostname]\n\tsocket id = %d number of connected clients = %d\n\n", socketId, servers[serverId]->clientsLength);
670+
#endif
671+
645672
MArgument_setMTensor(Res, data);
646673
return LIBRARY_NO_ERROR;
647674
}

0 commit comments

Comments
 (0)