X-Git-Url: http://nitlanguage.org diff --git a/lib/socket/socket_c.nit b/lib/socket/socket_c.nit index ea562b0..6842554 100644 --- a/lib/socket/socket_c.nit +++ b/lib/socket/socket_c.nit @@ -125,9 +125,9 @@ extern class NativeSocket `{ int* `} return connect(*self, (struct sockaddr*)addrIn, sizeof(*addrIn)); `} - fun write(buffer: String): Int - import String.to_cstring, String.length `{ - return write(*self, (char*)String_to_cstring(buffer), String_length(buffer)); + # Write `length` bytes from `buffer` + fun write(buffer: NativeString, length: Int): Int `{ + return write(*self, buffer, length); `} # Write `value` as a single byte @@ -136,14 +136,9 @@ extern class NativeSocket `{ int* `} return write(*self, &byt, 1); `} - fun read: String import NativeString.to_s_with_length, NativeString `{ - char *c = new_NativeString(1024); - int n = read(*self, c, 1023); - if(n < 0) { - return NativeString_to_s_with_length("",0); - } - c[n] = 0; - return NativeString_to_s_with_length(c, n); + # Read `length` bytes into `buffer`, returns the number of bytes read + fun read(buffer: NativeString, length: Int): Int `{ + return read(*self, buffer, length); `} # Sets an option for the socket @@ -169,6 +164,15 @@ extern class NativeSocket `{ int* `} return filedesc.check_response(result) end + # Poll this socket with `POLLHUP|POLLERR` + # + # A return value of 0 means there is no errors. + fun poll_hup_err: Int `{ + struct pollfd fd = {*self, POLLHUP|POLLERR, 0}; + int res = poll(&fd, 1, 0); + return res; + `} + # Call to the poll function of the C socket # # Signature: @@ -207,7 +211,7 @@ extern class NativeSocket `{ int* `} return new SocketAcceptResult(s, addrIn) end - # Set wether this socket is non blocking + # Set whether this socket is non blocking fun non_blocking=(value: Bool) `{ int flags = fcntl(*self, F_GETFL, 0); if (flags == -1) flags = 0; @@ -221,6 +225,22 @@ extern class NativeSocket `{ int* `} } fcntl(*self, F_SETFL, flags); `} + + # Send `len` bytes from `buf` to `dest_addr` + fun sendto(buf: NativeString, len: Int, flags: Int, dest_addr: NativeSocketAddrIn): Int `{ + return sendto(*self, buf, len, flags, (struct sockaddr*)dest_addr, sizeof(struct sockaddr_in)); + `} + + # Receive a message into `buf` of maximum `len` bytes + fun recv(buf: NativeString, len: Int, flags: Int): Int `{ + return recv(*self, buf, len, flags); + `} + + # Receive a message into `buf` of maximum `len` bytes and store sender info into `src_addr` + fun recvfrom(buf: NativeString, len: Int, flags: Int, src_addr: NativeSocketAddrIn): Int `{ + socklen_t srclen = sizeof(struct sockaddr_in); + return recvfrom(*self, buf, len, flags, (struct sockaddr*)src_addr, &srclen); + `} end # Result of a call to `NativeSocket::accept` @@ -233,38 +253,47 @@ class SocketAcceptResult var addr_in: NativeSocketAddrIn end +# Socket address in the Internet namespace, pointer to a `struct sockaddr_in` extern class NativeSocketAddrIn `{ struct sockaddr_in* `} - new `{ - struct sockaddr_in *sai = NULL; - sai = malloc(sizeof(struct sockaddr_in)); - return sai; - `} - new with_port(port: Int, family: NativeSocketAddressFamilies) `{ + # `NULL` pointer + new nul `{ return NULL; `} + + # `malloc` a new instance + new `{ struct sockaddr_in *sai = NULL; sai = malloc(sizeof(struct sockaddr_in)); - sai->sin_family = family; - sai->sin_port = htons(port); - sai->sin_addr.s_addr = INADDR_ANY; return sai; `} - new with_hostent(hostent: NativeSocketHostent, port: Int) `{ - struct sockaddr_in *sai = NULL; - sai = malloc(sizeof(struct sockaddr_in)); - sai->sin_family = hostent->h_addrtype; - sai->sin_port = htons(port); - memcpy((char*)&sai->sin_addr.s_addr, (char*)hostent->h_addr, hostent->h_length); - return sai; + # Set `address` and `family` from `hostent` (to use with `Sys::gethostbyname`) + fun fill_from_hostent(hostent: NativeSocketHostent) `{ + self->sin_family = hostent->h_addrtype; + memcpy((char*)&self->sin_addr.s_addr, + (char*)hostent->h_addr, + hostent->h_length); `} + # Internet address as then IPV4 numbers-and-dots notation fun address: NativeString `{ return (char*)inet_ntoa(self->sin_addr); `} + # Set `address` to `INADDR_ANY` + fun address_any `{ self->sin_addr.s_addr = INADDR_ANY; `} + + # Set `address` to `INADDR_BROADCAST` + fun address_broadcast `{ self->sin_addr.s_addr = INADDR_BROADCAST; `} + + # Address family fun family: NativeSocketAddressFamilies `{ return self->sin_family; `} + # Address family + fun family=(value: NativeSocketAddressFamilies) `{ self->sin_family = value; `} + + # Port fun port: Int `{ return ntohs(self->sin_port); `} - fun destroy `{ free(self); `} + # Port + fun port=(value: Int) `{ self->sin_port = htons(value); `} end # Host entry information, a pointer to a `struct hostent` @@ -400,6 +429,7 @@ extern class NativeSocketProtocolFamilies `{ int `} new pf_key `{ return PF_KEY; `} new pf_inet6 `{ return PF_INET6; `} new pf_max `{ return PF_MAX; `} + new ipproto_udp `{ return IPPROTO_UDP; `} end # Level on which to set options