sctp-socket 0.0.5 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/.github/FUNDING.yml +4 -0
- data/CHANGES.md +9 -0
- data/README.md +7 -6
- data/examples/client_example.rb +31 -2
- data/examples/server_example.rb +21 -1
- data/ext/sctp/extconf.rb +24 -1
- data/ext/sctp/socket.c +127 -50
- data/sctp-socket.gemspec +11 -1
- data.tar.gz.sig +0 -0
- metadata +12 -4
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6a4c2e587ffc98a2c81d1d2a267fa4936539dc2456a9106a0146f31275e6db21
|
4
|
+
data.tar.gz: e5aa191fd3beb57240128ef58ef82df8f3b6beba3c25a5b357bc9b5effc7c238
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d023d5c17b03912812d02c8cb58279b5c874c45c481bdc1cd685dd89e8f2d62565512675d2cdc89f5e6b8107dce42634a3a1b4a063df8a6b32fed6762029adb4
|
7
|
+
data.tar.gz: 900e6fb83030d63453d99f9046942b2e6dfaee4340615d668669a922abc5628f58056aa464c9f36fe974ac0cccec4f3699fee7211778b6e49f49d856d7ea002d
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/.github/FUNDING.yml
ADDED
data/CHANGES.md
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
## 0.0.6 - 24-May-2024
|
2
|
+
* Fixup the sendv method and add some documentation.
|
3
|
+
* Added documentation to the get_status method.
|
4
|
+
* Update the example server and client code, including comments for how to
|
5
|
+
setup multiple dummy IP addresses locally for testing.
|
6
|
+
* Some warning cleanup and build improvements.
|
7
|
+
* Added SCTP_BINDX constants.
|
8
|
+
* Started adding some real specs.
|
9
|
+
|
1
10
|
## 0.0.5 - 15-Dec-2021
|
2
11
|
* Add handling for Linux platforms that don't support the sctp_sendv function
|
3
12
|
and/or the SCTP_SEND_FAILED_EVENT notification.
|
data/README.md
CHANGED
@@ -2,18 +2,20 @@
|
|
2
2
|
|
3
3
|
A Ruby interface for SCTP sockets.
|
4
4
|
|
5
|
-
WARNING: THIS IS CURRENTLY AN ALPHA PRODUCT. NOT RECOMMENDED FOR PRODUCTION USE AT THIS TIME.
|
6
|
-
|
7
5
|
## Prerequisites
|
8
6
|
|
9
7
|
You will need the sctp development headers installed.
|
10
8
|
|
11
|
-
On some systems, such as RHEL8, you may need to enable the sctp module.
|
9
|
+
On some systems, such as RHEL8 or later, you may need to enable the sctp module.
|
12
10
|
|
13
11
|
## Installation
|
14
12
|
|
15
13
|
`gem install sctp-socket`
|
16
14
|
|
15
|
+
## Installing the Trusted Cert
|
16
|
+
|
17
|
+
`gem cert --add <(curl -Ls https://raw.githubusercontent.com/djberg96/sctp-socket/main/certs/djberg96_pub.pem)`
|
18
|
+
|
17
19
|
## About SCTP
|
18
20
|
|
19
21
|
The Stream Control Transmission Protocol (SCTP) is a message oriented, reliable
|
@@ -62,8 +64,7 @@ end
|
|
62
64
|
Currently this has only been developed and tested on Linux. Other platforms
|
63
65
|
will probably only be supported via community contributions.
|
64
66
|
|
65
|
-
|
66
|
-
available. Use the sendmsg method instead.
|
67
|
+
The sendv method is not available on some Linux variants. Use the sendmsg method instead.
|
67
68
|
|
68
69
|
Please report any issues on the github project page.
|
69
70
|
|
@@ -81,7 +82,7 @@ Apache-2.0
|
|
81
82
|
|
82
83
|
## Copyright
|
83
84
|
|
84
|
-
(C) 2020, Daniel J. Berger
|
85
|
+
(C) 2020-2024, Daniel J. Berger
|
85
86
|
Al Rights Reserved
|
86
87
|
|
87
88
|
## Author
|
data/examples/client_example.rb
CHANGED
@@ -1,11 +1,40 @@
|
|
1
1
|
require 'socket'
|
2
2
|
require 'sctp/socket'
|
3
3
|
|
4
|
+
# Adjust as needed. Server server_example.rb for creating
|
5
|
+
# fake network interfaces for testing.
|
6
|
+
addresses = ['1.1.1.1', '1.1.1.2']
|
7
|
+
|
4
8
|
begin
|
5
9
|
port = 62324
|
6
10
|
socket = SCTP::Socket.new
|
7
|
-
|
8
|
-
|
11
|
+
|
12
|
+
# Optional, but could bind to a subset of available addresses
|
13
|
+
p socket.bind(:addresses => addresses)
|
14
|
+
|
15
|
+
# Initial connection
|
16
|
+
p socket.connect(:addresses => addresses, :port => port)
|
17
|
+
|
18
|
+
# Try a sendv
|
19
|
+
p socket.sendv(:message => ["Hello ", "World!"])
|
20
|
+
|
21
|
+
# Send messages on separate streams of the same connection
|
22
|
+
arr = []
|
23
|
+
|
24
|
+
0.upto(4) do |n|
|
25
|
+
arr << Thread.new do |t|
|
26
|
+
puts "Stream: #{n}"
|
27
|
+
bytes_sent = socket.sendmsg(
|
28
|
+
:message => "Hello World: #{n+1}",
|
29
|
+
:addresses => addresses.shuffle,
|
30
|
+
:stream => n,
|
31
|
+
:port => port
|
32
|
+
)
|
33
|
+
puts "Bytes Sent: #{bytes_sent}"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
arr.map(&:join)
|
9
38
|
ensure
|
10
39
|
socket.close if socket
|
11
40
|
end
|
data/examples/server_example.rb
CHANGED
@@ -1,11 +1,31 @@
|
|
1
1
|
require 'sctp/socket'
|
2
2
|
|
3
|
+
# rake compile + ruby -Ilib to run local version
|
4
|
+
puts "VERSION: #{SCTP::Socket::VERSION}"
|
5
|
+
|
6
|
+
# To test multiple IP addresses locally:
|
7
|
+
#
|
8
|
+
# sudo apt install iproute2
|
9
|
+
# Add 'dummy' to /etc/modules
|
10
|
+
#
|
11
|
+
# sudo ip link add dummy1 type dummy
|
12
|
+
# sudo ip link add dummy2 type dummy
|
13
|
+
#
|
14
|
+
# sudo ip addr add 1.1.1.1/24 dev dummy1
|
15
|
+
# sudo ip addr add 1.1.1.2/24 dev dummy2
|
16
|
+
#
|
17
|
+
# sudo ip link set dummy1 up
|
18
|
+
# sudo ip link set dummy2 up
|
19
|
+
|
3
20
|
# Adjust IP addresses as needed
|
21
|
+
addresses = ['1.1.1.1', '1.1.1.2']
|
22
|
+
|
4
23
|
begin
|
5
24
|
port = 62324
|
6
25
|
socket = SCTP::Socket.new
|
7
|
-
socket.bind(:port => port, :addresses =>
|
26
|
+
socket.bind(:port => port, :addresses => addresses)
|
8
27
|
socket.set_initmsg(:output_streams => 5, :input_streams => 5, :max_attempts => 4)
|
28
|
+
socket.subscribe(:data_io => true, :shutdown => true, :send_failure => true, :partial_delivery => true)
|
9
29
|
socket.listen
|
10
30
|
|
11
31
|
while true
|
data/ext/sctp/extconf.rb
CHANGED
@@ -1,6 +1,29 @@
|
|
1
1
|
require 'mkmf'
|
2
2
|
|
3
|
-
|
3
|
+
dir_config('sctp')
|
4
|
+
|
5
|
+
unless have_header('netinet/sctp.h')
|
6
|
+
os = IO.readlines('/etc/os-release').first.split('=').last
|
7
|
+
msg = "\nSCTP HEADERS NOT FOUND. PLEASE INSTALL THEM FIRST LIKE SO:\n\n"
|
8
|
+
|
9
|
+
if os =~ /red|fedora|centos/i
|
10
|
+
msg << "#####################################################################################\n"
|
11
|
+
msg << "# dnf install lksctp-tools #\n"
|
12
|
+
msg << "# dnf install kernel-modules-extra #\n"
|
13
|
+
msg << "# #\n"
|
14
|
+
msg << "# sed -e '/blacklist sctp/s/^b/#b/g' -i /etc/modprobe.d/sctp-blacklist.conf #\n"
|
15
|
+
msg << "# sed -e '/blacklist sctp/s/^b/#b/g' -i /etc/modprobe.d/sctp_diag-blacklist.conf #\n"
|
16
|
+
msg << "# #\n"
|
17
|
+
msg << "# sudo systemctl restart systemd-modules-load.service #\n"
|
18
|
+
msg << "#####################################################################################\n"
|
19
|
+
else
|
20
|
+
msg << "sudo apt-get install libsctp-dev lksctp-tools\n\n"
|
21
|
+
end
|
22
|
+
|
23
|
+
warn msg
|
24
|
+
exit
|
25
|
+
end
|
26
|
+
|
4
27
|
have_library('sctp')
|
5
28
|
have_func('sctp_sendv', 'netinet/sctp.h')
|
6
29
|
have_struct_member('struct sctp_event_subscribe', 'sctp_send_failure_event', 'netinet/sctp.h')
|
data/ext/sctp/socket.c
CHANGED
@@ -26,27 +26,10 @@ VALUE v_sctp_default_send_params_struct;
|
|
26
26
|
#if defined(_SC_IOV_MAX)
|
27
27
|
#define IOV_MAX (sysconf(_SC_IOV_MAX))
|
28
28
|
#else
|
29
|
-
// Assume infinity, or let the syscall return with error
|
30
29
|
#define IOV_MAX INT_MAX
|
31
30
|
#endif
|
32
31
|
#endif
|
33
32
|
|
34
|
-
#define ARY2IOVEC(iov,ary) \
|
35
|
-
do { \
|
36
|
-
VALUE *cur; \
|
37
|
-
struct iovec *tmp; \
|
38
|
-
long n; \
|
39
|
-
cur = RARRAY_PTR(ary); \
|
40
|
-
n = RARRAY_LEN(ary); \
|
41
|
-
iov = tmp = alloca(sizeof(struct iovec) * n); \
|
42
|
-
for (; --n >= 0; tmp++, cur++) { \
|
43
|
-
if (TYPE(*cur) != T_STRING) \
|
44
|
-
rb_raise(rb_eArgError, "must be an array of strings"); \
|
45
|
-
tmp->iov_base = RSTRING_PTR(*cur); \
|
46
|
-
tmp->iov_len = RSTRING_LEN(*cur); \
|
47
|
-
} \
|
48
|
-
} while (0)
|
49
|
-
|
50
33
|
// TODO: Yes, I know I need to update the signature.
|
51
34
|
VALUE convert_sockaddr_in_to_struct(struct sockaddr_in* addr){
|
52
35
|
char ipbuf[INET6_ADDRSTRLEN];
|
@@ -202,6 +185,8 @@ static VALUE rsctp_bind(int argc, VALUE* argv, VALUE self){
|
|
202
185
|
port = sin.sin_port;
|
203
186
|
}
|
204
187
|
|
188
|
+
rb_iv_set(self, "@port", INT2NUM(port));
|
189
|
+
|
205
190
|
return INT2NUM(port);
|
206
191
|
}
|
207
192
|
|
@@ -350,19 +335,58 @@ static VALUE rsctp_getlocalnames(VALUE self){
|
|
350
335
|
}
|
351
336
|
|
352
337
|
#ifdef HAVE_SCTP_SENDV
|
353
|
-
|
354
|
-
|
355
|
-
|
338
|
+
/*
|
339
|
+
* Transmit a message to an SCTP endpoint using a gather-write. The following
|
340
|
+
* hash of options is permitted:
|
341
|
+
*
|
342
|
+
* * message - An array of strings that will be joined into a single message.
|
343
|
+
* * addresses - An array of IP addresses to setup an association to send the message.
|
344
|
+
* * info_type - The type of information provided. The default is SCTP_SENDV_SNDINFO.
|
345
|
+
*
|
346
|
+
* Example:
|
347
|
+
*
|
348
|
+
* socket = SCTP::Socket.new
|
349
|
+
*
|
350
|
+
* socket.sendv
|
351
|
+
* :message => ['Hello ', 'World.'],
|
352
|
+
* :addresses => ['10.0.5.4', '10.0.6.4'],
|
353
|
+
* :info_type => SCTP::Socket:::SCTP_SENDV_SNDINFO
|
354
|
+
* )
|
355
|
+
*
|
356
|
+
* CAVEAT: Currently addresses does not work, and info_type is not yet supported.
|
357
|
+
*
|
358
|
+
* Returns the number of bytes sent.
|
359
|
+
*/
|
360
|
+
static VALUE rsctp_sendv(VALUE self, VALUE v_options){
|
361
|
+
VALUE v_msg, v_message, v_addresses;
|
362
|
+
struct iovec iov[IOV_MAX];
|
363
|
+
struct sockaddr_in* addrs;
|
356
364
|
struct sctp_sndinfo info;
|
357
|
-
int sock_fd, num_bytes, size;
|
365
|
+
int i, sock_fd, num_bytes, size, num_ip;
|
358
366
|
|
359
|
-
Check_Type(
|
360
|
-
bzero(&addrs, sizeof(addrs));
|
367
|
+
Check_Type(v_options, T_HASH);
|
361
368
|
|
362
|
-
|
369
|
+
bzero(&iov, sizeof(iov));
|
370
|
+
bzero(&info, sizeof(info));
|
371
|
+
|
372
|
+
v_message = rb_hash_aref2(v_options, "message");
|
373
|
+
v_addresses = rb_hash_aref2(v_options, "addresses");
|
374
|
+
|
375
|
+
if(!NIL_P(v_message))
|
376
|
+
Check_Type(v_message, T_ARRAY);
|
377
|
+
|
378
|
+
if(!NIL_P(v_addresses)){
|
379
|
+
Check_Type(v_addresses, T_ARRAY);
|
380
|
+
num_ip = RARRAY_LEN(v_addresses);
|
381
|
+
addrs = (struct sockaddr_in*)alloca(sizeof(struct sockaddr_in) * num_ip);
|
382
|
+
}
|
383
|
+
else{
|
384
|
+
addrs = NULL;
|
385
|
+
num_ip = 0;
|
386
|
+
}
|
363
387
|
|
364
|
-
|
365
|
-
size = RARRAY_LEN(
|
388
|
+
sock_fd = NUM2INT(rb_iv_get(self, "@sock_fd"));
|
389
|
+
size = RARRAY_LEN(v_message);
|
366
390
|
|
367
391
|
if(!size)
|
368
392
|
rb_raise(rb_eArgError, "Must contain at least one message");
|
@@ -370,17 +394,41 @@ static VALUE rsctp_sendv(VALUE self, VALUE v_messages){
|
|
370
394
|
if(size > IOV_MAX)
|
371
395
|
rb_raise(rb_eArgError, "Array size is greater than IOV_MAX");
|
372
396
|
|
373
|
-
ARY2IOVEC(iov, v_messages);
|
374
|
-
|
375
397
|
info.snd_flags = SCTP_UNORDERED;
|
376
398
|
info.snd_assoc_id = NUM2INT(rb_iv_get(self, "@association_id"));
|
377
399
|
|
400
|
+
if(!NIL_P(v_addresses)){
|
401
|
+
int i, port;
|
402
|
+
VALUE v_address, v_port;
|
403
|
+
|
404
|
+
v_port = NUM2INT(rb_iv_get(self, "@port"));
|
405
|
+
|
406
|
+
if(NIL_P(v_port))
|
407
|
+
port = 0;
|
408
|
+
else
|
409
|
+
port = NUM2INT(v_port);
|
410
|
+
|
411
|
+
for(i = 0; i < num_ip; i++){
|
412
|
+
v_address = RARRAY_PTR(v_addresses)[i];
|
413
|
+
addrs->sin_family = NUM2INT(rb_iv_get(self, "@domain"));
|
414
|
+
addrs->sin_port = htons(port);
|
415
|
+
addrs->sin_addr.s_addr = inet_addr(StringValueCStr(v_address));
|
416
|
+
addrs += sizeof(struct sockaddr_in);
|
417
|
+
}
|
418
|
+
}
|
419
|
+
|
420
|
+
for(i = 0; i < size; i++){
|
421
|
+
v_msg = RARRAY_PTR(v_message)[i];
|
422
|
+
iov[i].iov_base = StringValueCStr(v_msg);
|
423
|
+
iov[i].iov_len = RSTRING_LEN(v_msg);
|
424
|
+
}
|
425
|
+
|
378
426
|
num_bytes = sctp_sendv(
|
379
427
|
sock_fd,
|
380
428
|
iov,
|
381
429
|
size,
|
382
|
-
|
383
|
-
|
430
|
+
(struct sockaddr*)addrs,
|
431
|
+
num_ip,
|
384
432
|
&info,
|
385
433
|
sizeof(info),
|
386
434
|
SCTP_SENDV_SNDINFO,
|
@@ -491,14 +539,14 @@ static VALUE rsctp_send(VALUE self, VALUE v_options){
|
|
491
539
|
* Transmit a message to an SCTP endpoint. The following hash of options
|
492
540
|
* is permitted:
|
493
541
|
*
|
494
|
-
* :message
|
495
|
-
* :stream
|
496
|
-
* :
|
497
|
-
* :context
|
498
|
-
* :ppid
|
499
|
-
* :flags
|
542
|
+
* :message -> The message to send to the endpoint. Mandatory.
|
543
|
+
* :stream -> The SCTP stream number you wish to send the message on.
|
544
|
+
* :addresses -> An array of addresses to send the message to.
|
545
|
+
* :context -> The default context used for the sendmsg call if the send fails.
|
546
|
+
* :ppid -> The payload protocol identifier that is passed to the peer endpoint.
|
547
|
+
* :flags -> A bitwise integer that contain one or more values that control behavior.
|
500
548
|
*
|
501
|
-
* Note that the :
|
549
|
+
* Note that the :addresses option is not mandatory in a one-to-one (SOCK_STREAM)
|
502
550
|
* socket connection. However, it must have been set previously via the
|
503
551
|
* connect method.
|
504
552
|
*
|
@@ -507,12 +555,14 @@ static VALUE rsctp_send(VALUE self, VALUE v_options){
|
|
507
555
|
* socket = SCTP::Socket.new
|
508
556
|
*
|
509
557
|
* socket.sendmsg(
|
510
|
-
* :message
|
511
|
-
* :stream
|
512
|
-
* :flags
|
513
|
-
* :ttl
|
514
|
-
* :
|
558
|
+
* :message => "Hello World!",
|
559
|
+
* :stream => 3,
|
560
|
+
* :flags => SCTP::Socket::SCTP_UNORDERED | SCTP::Socket::SCTP_SENDALL,
|
561
|
+
* :ttl => 100,
|
562
|
+
* :addresses => ['10.0.5.4', '10.0.6.4']
|
515
563
|
* )
|
564
|
+
*
|
565
|
+
* Returns the number of bytes sent.
|
516
566
|
*/
|
517
567
|
static VALUE rsctp_sendmsg(VALUE self, VALUE v_options){
|
518
568
|
VALUE v_msg, v_ppid, v_flags, v_stream, v_ttl, v_context, v_addresses;
|
@@ -644,7 +694,10 @@ static VALUE rsctp_recvmsg(int argc, VALUE* argv, VALUE self){
|
|
644
694
|
|
645
695
|
sock_fd = NUM2INT(rb_iv_get(self, "@sock_fd"));
|
646
696
|
length = sizeof(struct sockaddr_in);
|
697
|
+
|
647
698
|
bzero(buffer, sizeof(buffer));
|
699
|
+
bzero(&clientaddr, sizeof(clientaddr));
|
700
|
+
bzero(&sndrcvinfo, sizeof(sndrcvinfo));
|
648
701
|
|
649
702
|
bytes = sctp_recvmsg(
|
650
703
|
sock_fd,
|
@@ -919,7 +972,7 @@ static VALUE rsctp_set_initmsg(VALUE self, VALUE v_options){
|
|
919
972
|
* - The peer has sent a shutdown to the local endpoint.
|
920
973
|
*
|
921
974
|
* :data_io
|
922
|
-
* - Message data was received.
|
975
|
+
* - Message data was received. You will want to subscribe to this in most cases.
|
923
976
|
*
|
924
977
|
* Others:
|
925
978
|
*
|
@@ -932,14 +985,12 @@ static VALUE rsctp_set_initmsg(VALUE self, VALUE v_options){
|
|
932
985
|
* :sender_dry
|
933
986
|
* :peer_error
|
934
987
|
*
|
935
|
-
* By default only data_io is subscribed to.
|
936
|
-
*
|
937
988
|
* Example:
|
938
989
|
*
|
939
990
|
* socket = SCTP::Socket.new
|
940
991
|
*
|
941
992
|
* socket.bind(:port => port, :addresses => ['127.0.0.1'])
|
942
|
-
* socket.subscribe(:shutdown => true, :send_failure => true)
|
993
|
+
* socket.subscribe(:data_io => true, :shutdown => true, :send_failure => true)
|
943
994
|
*/
|
944
995
|
static VALUE rsctp_subscribe(VALUE self, VALUE v_options){
|
945
996
|
int sock_fd;
|
@@ -1016,7 +1067,7 @@ static VALUE rsctp_listen(int argc, VALUE* argv, VALUE self){
|
|
1016
1067
|
sock_fd = NUM2INT(rb_iv_get(self, "@sock_fd"));
|
1017
1068
|
|
1018
1069
|
if(listen(sock_fd, backlog) < 0)
|
1019
|
-
rb_raise(rb_eSystemCallError, "
|
1070
|
+
rb_raise(rb_eSystemCallError, "listen: %s", strerror(errno));
|
1020
1071
|
|
1021
1072
|
return self;
|
1022
1073
|
}
|
@@ -1143,6 +1194,27 @@ static VALUE rsctp_get_retransmission_info(VALUE self){
|
|
1143
1194
|
);
|
1144
1195
|
}
|
1145
1196
|
|
1197
|
+
/*
|
1198
|
+
* Get the status of a connected socket.
|
1199
|
+
*
|
1200
|
+
* Example:
|
1201
|
+
*
|
1202
|
+
* socket = SCTP::Socket.new
|
1203
|
+
* socket.connect(...)
|
1204
|
+
* socket.get_status
|
1205
|
+
*
|
1206
|
+
* Returns a Struct::Status object, which contains the following fields:
|
1207
|
+
*
|
1208
|
+
* * association_id
|
1209
|
+
* * state
|
1210
|
+
* * receive_window
|
1211
|
+
* * unacknowledged_data
|
1212
|
+
* * pending_data
|
1213
|
+
* * inbound_streams
|
1214
|
+
* * outbound_streams
|
1215
|
+
* * fragmentation_point
|
1216
|
+
* * primary (IP)
|
1217
|
+
*/
|
1146
1218
|
static VALUE rsctp_get_status(VALUE self){
|
1147
1219
|
int sock_fd;
|
1148
1220
|
socklen_t size;
|
@@ -1186,7 +1258,7 @@ static VALUE rsctp_get_status(VALUE self){
|
|
1186
1258
|
);
|
1187
1259
|
}
|
1188
1260
|
|
1189
|
-
void Init_socket(){
|
1261
|
+
void Init_socket(void){
|
1190
1262
|
mSCTP = rb_define_module("SCTP");
|
1191
1263
|
cSocket = rb_define_class_under(mSCTP, "Socket", rb_cObject);
|
1192
1264
|
|
@@ -1289,8 +1361,8 @@ void Init_socket(){
|
|
1289
1361
|
rb_define_attr(cSocket, "association_id", 1, 1);
|
1290
1362
|
rb_define_attr(cSocket, "port", 1, 1);
|
1291
1363
|
|
1292
|
-
/* 0.0.
|
1293
|
-
rb_define_const(cSocket, "VERSION", rb_str_new2("0.0.
|
1364
|
+
/* 0.0.6: The version of this library */
|
1365
|
+
rb_define_const(cSocket, "VERSION", rb_str_new2("0.0.6"));
|
1294
1366
|
|
1295
1367
|
/* send flags */
|
1296
1368
|
|
@@ -1322,4 +1394,9 @@ void Init_socket(){
|
|
1322
1394
|
rb_define_const(cSocket, "SCTP_SHUTDOWN_SENT", INT2NUM(SCTP_SHUTDOWN_SENT));
|
1323
1395
|
rb_define_const(cSocket, "SCTP_SHUTDOWN_RECEIVED", INT2NUM(SCTP_SHUTDOWN_RECEIVED));
|
1324
1396
|
rb_define_const(cSocket, "SCTP_SHUTDOWN_ACK_SENT", INT2NUM(SCTP_SHUTDOWN_ACK_SENT));
|
1397
|
+
|
1398
|
+
// BINDING //
|
1399
|
+
|
1400
|
+
rb_define_const(cSocket, "SCTP_BINDX_ADD_ADDR", INT2NUM(SCTP_BINDX_ADD_ADDR));
|
1401
|
+
rb_define_const(cSocket, "SCTP_BINDX_REM_ADDR", INT2NUM(SCTP_BINDX_REM_ADDR));
|
1325
1402
|
}
|
data/sctp-socket.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |spec|
|
2
2
|
spec.name = 'sctp-socket'
|
3
|
-
spec.version = '0.0.
|
3
|
+
spec.version = '0.0.6'
|
4
4
|
spec.author = 'Daniel Berger'
|
5
5
|
spec.email = 'djberg96@gmail.com'
|
6
6
|
spec.summary = 'Ruby bindings for SCTP sockets'
|
@@ -19,6 +19,16 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.add_development_dependency 'rake-compiler', '~> 1.1'
|
20
20
|
spec.add_development_dependency 'rspec', '~> 3.9'
|
21
21
|
|
22
|
+
spec.metadata = {
|
23
|
+
'homepage_uri' => 'https://github.com/djberg96/sctp-socket',
|
24
|
+
'bug_tracker_uri' => 'https://github.com/djberg96/sctp-socket/issues',
|
25
|
+
'changelog_uri' => 'https://github.com/djberg96/sctp-socket/blob/main/CHANGES.md',
|
26
|
+
'documentation_uri' => 'https://github.com/djberg96/sctp-socket/wiki',
|
27
|
+
'source_code_uri' => 'https://github.com/djberg96/sctp-socket',
|
28
|
+
'wiki_uri' => 'https://github.com/djberg96/sctp-socket/wiki',
|
29
|
+
'rubygems_mfa_required' => 'true'
|
30
|
+
}
|
31
|
+
|
22
32
|
spec.description = <<-EOF
|
23
33
|
The sctp-socket library provides Ruby bindings for SCTP sockets. is a
|
24
34
|
message oriented, reliable transport protocol with direct support for
|
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sctp-socket
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Berger
|
@@ -35,7 +35,7 @@ cert_chain:
|
|
35
35
|
ORVCZpRuCPpmC8qmqxUnARDArzucjaclkxjLWvCVHeFa9UP7K3Nl9oTjJNv+7/jM
|
36
36
|
WZs4eecIcUc4tKdHxcAJ0MO/Dkqq7hGaiHpwKY76wQ1+8xAh
|
37
37
|
-----END CERTIFICATE-----
|
38
|
-
date:
|
38
|
+
date: 2024-05-25 00:00:00.000000000 Z
|
39
39
|
dependencies:
|
40
40
|
- !ruby/object:Gem::Dependency
|
41
41
|
name: bundler
|
@@ -103,6 +103,7 @@ extensions:
|
|
103
103
|
- ext/sctp/extconf.rb
|
104
104
|
extra_rdoc_files: []
|
105
105
|
files:
|
106
|
+
- ".github/FUNDING.yml"
|
106
107
|
- ".gitignore"
|
107
108
|
- CHANGES.md
|
108
109
|
- Gemfile
|
@@ -122,7 +123,14 @@ files:
|
|
122
123
|
homepage: https://github.com/djberg96/sctp-socket
|
123
124
|
licenses:
|
124
125
|
- Apache-2.0
|
125
|
-
metadata:
|
126
|
+
metadata:
|
127
|
+
homepage_uri: https://github.com/djberg96/sctp-socket
|
128
|
+
bug_tracker_uri: https://github.com/djberg96/sctp-socket/issues
|
129
|
+
changelog_uri: https://github.com/djberg96/sctp-socket/blob/main/CHANGES.md
|
130
|
+
documentation_uri: https://github.com/djberg96/sctp-socket/wiki
|
131
|
+
source_code_uri: https://github.com/djberg96/sctp-socket
|
132
|
+
wiki_uri: https://github.com/djberg96/sctp-socket/wiki
|
133
|
+
rubygems_mfa_required: 'true'
|
126
134
|
post_install_message:
|
127
135
|
rdoc_options: []
|
128
136
|
require_paths:
|
@@ -138,7 +146,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
138
146
|
- !ruby/object:Gem::Version
|
139
147
|
version: '0'
|
140
148
|
requirements: []
|
141
|
-
rubygems_version: 3.
|
149
|
+
rubygems_version: 3.4.19
|
142
150
|
signing_key:
|
143
151
|
specification_version: 4
|
144
152
|
summary: Ruby bindings for SCTP sockets
|
metadata.gz.sig
CHANGED
Binary file
|