Socket Handles to C

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Socket Handles to C

Sean P. DeNigris
Administrator
How do Socket handles map to C socket IDs? I'm wrapping libssh2 via Native Boost and I'd much rather create sockets via Smalltalk than C, but I'm not sure how to pass the handle to a C function expecting a C socket ID. Maybe I'm missing something really simple? Thanks.
Cheers,
Sean
Reply | Threaded
Open this post in threaded view
|

Re: Socket Handles to C

Igor Stasenko



On 9 April 2014 16:59, Sean P. DeNigris <[hidden email]> wrote:
How do Socket handles map to C socket IDs? I'm wrapping libssh2 via Native
Boost and I'd much rather create sockets via Smalltalk than C, but I'm not
sure how to pass the handle to a C function expecting a C socket ID. Maybe
I'm missing something really simple? Thanks.


socket plugin using own data structure for socket handles,
it includes different kind of internal information, including OS-specific socket handle.
 
typedef struct
{
  int   sessionID;
  int   socketType;  /* 0 = TCP, 1 = UDP */
  void  *privateSocketPtr;
}  SQSocket, *SocketPtr;

extracting the OS-specific handle could be problematic, since it is in
that opaque void  *privateSocketPtr; field.

Then:

sqUnixSocket.c

typedef struct privateSocketStruct
{
  int s;            /* Unix socket */
  int connSema;            /* connection io notification semaphore */
  int readSema;            /* read io notification semaphore */
  int writeSema;        /* write io notification semaphore */
  int sockState;        /* connection + data state */
  int sockError;        /* errno after socket error */
  union sockaddr_any peer;    /* default send/recv address for UDP */
  socklen_t peerSize;        /* dynamic sizeof(peer) */
  union sockaddr_any sender;    /* sender address for last UDP receive */
  socklen_t senderSize;        /* dynamic sizeof(sender) */
  int multiListen;        /* whether to listen for multiple connections */
  int acceptedSock;        /* a connection that has been accepted */
} privateSocketStruct;


so, to extract OS-level socked handle *on unix*, you have to

handle = ( (privateSocketStruct*) sqsocket.privateSocketPtr) -> s.

where sqsocket is SQSocket.


there's even macros for that:

/*** Accessors for private socket members from a Squeak socket pointer ***/

#define _PSP(S)        (((S)->privateSocketPtr))
#define PSP(S)        ((privateSocketStruct *)((S)->privateSocketPtr))

#define SOCKET(S)        (PSP(S)->s)
#define SOCKETSTATE(S)        (PSP(S)->sockState)
#define SOCKETERROR(S)        (PSP(S)->sockError)
#define SOCKETPEER(S)        (PSP(S)->peer)
#define SOCKETPEERSIZE(S)    (PSP(S)->peerSize)



-----
Cheers,
Sean
--
View this message in context: http://forum.world.st/Socket-Handles-to-C-tp4753619.html
Sent from the Pharo Smalltalk Users mailing list archive at Nabble.com.




--
Best regards,
Igor Stasenko.