-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathmruby_socket.cpp
executable file
·112 lines (94 loc) · 2.67 KB
/
mruby_socket.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
bool initWSA() {
WSADATA wsadata;
int error = WSAStartup(0x0202, &wsadata);
if (error) return false;
return true;
}
mrb_value mruby__gtav__socket_init(mrb_state *mrb, mrb_value self) {
return mrb_bool_value(initWSA());
}
mrb_value mruby__gtav__socket_listen(mrb_state *mrb, mrb_value self) {
mrb_int port;
mrb_get_args(mrb, "i", &port);
SOCKET ss;
SOCKADDR_IN addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
ss = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
u_long nonblocking = 1;
ioctlsocket(ss, FIONBIO, &nonblocking);
char message[128];
//fprintf(stdout, "socket %i\n", ss);
int bi = bind(ss, (LPSOCKADDR)&addr, sizeof(addr));
//fprintf(stdout, "bind %i\n", bi);
if (bi < 0) {
sprintf(message, "bind error %i", bi);
mrb_raise(mrb, mrb_class_get(mrb, "RuntimeError"), message);
return mrb_nil_value();
}
int li = listen(ss, 3);
//fprintf(stdout, "listen %i\n", li);
if (li < 0) {
sprintf(message, "listen error %i", li);
mrb_raise(mrb, mrb_class_get(mrb, "RuntimeError"), message);
return mrb_nil_value();
}
return mrb_fixnum_value(ss);
}
mrb_value mruby__gtav__socket_accept(mrb_state *mrb, mrb_value self) {
SOCKET ss;
mrb_get_args(mrb, "i", &ss);
char message[128];
SOCKET sss = accept(ss, NULL, NULL);
if (sss == INVALID_SOCKET) {
return mrb_nil_value();
}
else if (sss < 0) {
sprintf(message, "accept error %i", sss);
mrb_raise(mrb, mrb_class_get(mrb, "RuntimeError"), message);
return mrb_nil_value();
}
else {
// TODO: do we need to set nonblocking?
return mrb_fixnum_value(sss);
}
}
static char recvbuffer[4096];
mrb_value mruby__gtav__socket_read(mrb_state *mrb, mrb_value self) {
SOCKET ss;
mrb_get_args(mrb, "i", &ss);
int ri = recv(ss, recvbuffer, sizeof(recvbuffer), 0);
if (ri < 0) {
return mrb_fixnum_value(ri);
}
else {
mrb_value ret = mrb_str_new_cstr(mrb, recvbuffer);
memset(&recvbuffer[0], 0, sizeof(recvbuffer));
return ret;
}
}
mrb_value mruby__gtav__socket_write(mrb_state *mrb, mrb_value self) {
SOCKET ss;
char *str;
int str_len;
mrb_value rstr;
mrb_get_args(mrb, "is", &ss, &str, &str_len);
//mrb_get_args(mrb, "iS", &ss, &rstr);
//str = RSTRING_PTR(rstr);
//str_len = RSTRING_LEN(rstr);
fprintf(stdout, "mruby__gtav__socket_write %i\n", str_len);
int wi = send(ss, str, str_len, NULL);
if (wi < 0) {
return mrb_fixnum_value(wi);
}
else {
return mrb_true_value();
}
}
mrb_value mruby__gtav__socket_close(mrb_state *mrb, mrb_value self) {
SOCKET ss;
mrb_get_args(mrb, "i", &ss);
closesocket(ss);
return mrb_true_value();
}