added send and recv builtins
This commit is contained in:
+11
-1
@@ -23,4 +23,14 @@ if net.connect(fd, { sin_family: net.AF_INET, sin_port: net.htons(port), sin_add
|
|||||||
return none;
|
return none;
|
||||||
}
|
}
|
||||||
|
|
||||||
print('Connected!\n');
|
print('Connected!\n');
|
||||||
|
|
||||||
|
buffer = newBuffer(16);
|
||||||
|
|
||||||
|
buffer[0] = 9;
|
||||||
|
buffer[1] = 7;
|
||||||
|
buffer[2] = 255;
|
||||||
|
|
||||||
|
n = net.send(fd, buffer, 0);
|
||||||
|
|
||||||
|
print('Sent ', n, ' bytes: ', buffer, '\n');
|
||||||
+18
-1
@@ -22,6 +22,8 @@ if net.listen(fd, backlog) != 0:
|
|||||||
return none;
|
return none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
buffer = newBuffer(16);
|
||||||
|
|
||||||
while true:
|
while true:
|
||||||
{
|
{
|
||||||
client_addr = {};
|
client_addr = {};
|
||||||
@@ -34,5 +36,20 @@ while true:
|
|||||||
print('client_fd = ', client_fd, '\n');
|
print('client_fd = ', client_fd, '\n');
|
||||||
print('client_addr = {', client_addr, '}\n');
|
print('client_addr = {', client_addr, '}\n');
|
||||||
|
|
||||||
# ..continue..
|
do
|
||||||
|
{
|
||||||
|
n = net.recv(client_fd, buffer, 0);
|
||||||
|
|
||||||
|
if n < 0:
|
||||||
|
print('Warning! Failed to read from socket!\n');
|
||||||
|
else if n == 0:
|
||||||
|
{
|
||||||
|
# Client disconnected.
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
print('Received ', n, ' bytes: ', buffer, '\n');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while n > 0;
|
||||||
}
|
}
|
||||||
+61
-1
@@ -22,6 +22,8 @@ static Object *bin_htonl(Runtime *runtime, Object **argv, unsigned int argc, Err
|
|||||||
static Object *bin_ntohl(Runtime *runtime, Object **argv, unsigned int argc, Error *error);
|
static Object *bin_ntohl(Runtime *runtime, Object **argv, unsigned int argc, Error *error);
|
||||||
static Object *bin_htons(Runtime *runtime, Object **argv, unsigned int argc, Error *error);
|
static Object *bin_htons(Runtime *runtime, Object **argv, unsigned int argc, Error *error);
|
||||||
static Object *bin_ntohs(Runtime *runtime, Object **argv, unsigned int argc, Error *error);
|
static Object *bin_ntohs(Runtime *runtime, Object **argv, unsigned int argc, Error *error);
|
||||||
|
static Object *bin_send(Runtime *runtime, Object **argv, unsigned int argc, Error *error);
|
||||||
|
static Object *bin_recv(Runtime *runtime, Object **argv, unsigned int argc, Error *error);
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@@ -59,6 +61,22 @@ static Object *select_(Object *self, Object *key, Heap *heap, Error *err)
|
|||||||
|
|
||||||
switch(PAIR(n, s[0]))
|
switch(PAIR(n, s[0]))
|
||||||
{
|
{
|
||||||
|
case PAIR(4, 's'):
|
||||||
|
{
|
||||||
|
if(!strcmp(s, "send"))
|
||||||
|
return Object_FromNativeFunction(bm->runtime, bin_send, 3, heap, err);
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
case PAIR(4, 'r'):
|
||||||
|
{
|
||||||
|
if(!strcmp(s, "recv"))
|
||||||
|
return Object_FromNativeFunction(bm->runtime, bin_recv, 3, heap, err);
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
case PAIR(10, 'I'):
|
case PAIR(10, 'I'):
|
||||||
{
|
{
|
||||||
if(!strcmp(s, "INADDR_ANY"))
|
if(!strcmp(s, "INADDR_ANY"))
|
||||||
@@ -669,5 +687,47 @@ static Object *bin_accept(Runtime *runtime, Object **argv, unsigned int argc, Er
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Object_FromInt(r, heap, error);
|
return Object_FromInt(r, heap, error);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Object *bin_send(Runtime *runtime, Object **argv, unsigned int argc, Error *error)
|
||||||
|
{
|
||||||
|
assert(argc == 3);
|
||||||
|
|
||||||
|
Heap *heap = Runtime_GetHeap(runtime);
|
||||||
|
|
||||||
|
int sockfd = Object_ToInt(argv[0], error);
|
||||||
|
if(error->occurred) return NULL;
|
||||||
|
|
||||||
|
int size;
|
||||||
|
void *addr = Object_GetBufferAddrAndSize(argv[1], &size, error);
|
||||||
|
if(addr == NULL) return NULL;
|
||||||
|
|
||||||
|
int flags = Object_ToInt(argv[2], error);
|
||||||
|
if(error->occurred) return NULL;
|
||||||
|
|
||||||
|
ssize_t r = send(sockfd, addr, size, flags);
|
||||||
|
|
||||||
|
return Object_FromInt(r, heap, error);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Object *bin_recv(Runtime *runtime, Object **argv, unsigned int argc, Error *error)
|
||||||
|
{
|
||||||
|
assert(argc == 3);
|
||||||
|
|
||||||
|
Heap *heap = Runtime_GetHeap(runtime);
|
||||||
|
|
||||||
|
int sockfd = Object_ToInt(argv[0], error);
|
||||||
|
if(error->occurred) return NULL;
|
||||||
|
|
||||||
|
int size;
|
||||||
|
void *addr = Object_GetBufferAddrAndSize(argv[1], &size, error);
|
||||||
|
if(addr == NULL) return NULL;
|
||||||
|
|
||||||
|
int flags = Object_ToInt(argv[2], error);
|
||||||
|
if(error->occurred) return NULL;
|
||||||
|
|
||||||
|
ssize_t r = recv(sockfd, addr, size, flags);
|
||||||
|
|
||||||
|
return Object_FromInt(r, heap, error);
|
||||||
}
|
}
|
||||||
@@ -48,6 +48,21 @@ Object *Object_NewBuffer(int size, Heap *heap, Error *error)
|
|||||||
return (Object*) obj;
|
return (Object*) obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void *Object_GetBufferAddrAndSize(Object *obj, int *size, Error *error)
|
||||||
|
{
|
||||||
|
if(obj->type != &t_buffer)
|
||||||
|
{
|
||||||
|
Error_Report(error, 0, "Not a buffer");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
BufferObject *buf = (BufferObject*) obj;
|
||||||
|
|
||||||
|
if(size)
|
||||||
|
*size = buf->size;
|
||||||
|
return buf->body;
|
||||||
|
}
|
||||||
|
|
||||||
static Object *select(Object *self, Object *key, Heap *heap, Error *error)
|
static Object *select(Object *self, Object *key, Heap *heap, Error *error)
|
||||||
{
|
{
|
||||||
assert(self != NULL);
|
assert(self != NULL);
|
||||||
|
|||||||
@@ -72,6 +72,7 @@ const Type* Object_GetType(const Object *obj);
|
|||||||
const char* Object_GetName(const Object *obj);
|
const char* Object_GetName(const Object *obj);
|
||||||
unsigned int Object_GetSize(const Object *obj, Error *err);
|
unsigned int Object_GetSize(const Object *obj, Error *err);
|
||||||
unsigned int Object_GetDeepSize(const Object *obj, Error *err);
|
unsigned int Object_GetDeepSize(const Object *obj, Error *err);
|
||||||
|
void *Object_GetBufferAddrAndSize(Object *obj, int *size, Error *error);
|
||||||
int Object_Hash (Object *obj, Error *err);
|
int Object_Hash (Object *obj, Error *err);
|
||||||
Object* Object_Copy (Object *obj, Heap *heap, Error *err);
|
Object* Object_Copy (Object *obj, Heap *heap, Error *err);
|
||||||
Object* Object_Call (Object *obj, Object **argv, unsigned int argc, Heap *heap, Error *err);
|
Object* Object_Call (Object *obj, Object **argv, unsigned int argc, Heap *heap, Error *err);
|
||||||
|
|||||||
Reference in New Issue
Block a user