sctp-socket 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- 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
|