sctp-socket 0.0.3 → 0.0.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '0192244d6b63f84e1c1ed7eeca4a15e94a9f857bb932b2e246c929fa5d85a16c'
4
- data.tar.gz: 61e37646cdb4138a8db5f43f9d8bbb9ade8094430b08a038f515edbb917b96be
3
+ metadata.gz: 30d42e64586703d527155f2fb7582e165ce6662fa3ddecec417b9905479454ca
4
+ data.tar.gz: ad2fce717f7d4c42a83db6524e7323c92b1b1edf1b73058757e6689a638cc3ce
5
5
  SHA512:
6
- metadata.gz: 06f2c3e32b6197647f22be5be5f6321167a9cc0db70035acf19522a9e27364d42c5b3511fd5958d7b27f09afad569ff5f679139d9d1c7c039ba5f23067272c49
7
- data.tar.gz: 76326d271f9c36450698f8bafa4b63ce7167286814e09109c9a297f2bafec3ec0ecf7948970fd95c17ffb509be79dd934d8167f377e7dac6f504eeb908d331ba
6
+ metadata.gz: 94b319f18b44be59f7b5434ccbd9c4e2b4b1e948d9dfcf155c29c497e13059a6016a945aca04712b0b1afaa6801043450268533c758491ce118dc615d1209c4b
7
+ data.tar.gz: f77fd5430cc646354117a27c3a5a2064b8af11cdc7019c7400286300065eea6b107b6b7bb7796408de0f5998661c652eb16b07460b54ef25defca5a231ffa731
Binary file
data.tar.gz.sig CHANGED
Binary file
data/CHANGES.md CHANGED
@@ -1,12 +1,19 @@
1
- ## 1-Dec-2020
1
+ ## 0.0.4 - 3-Dec-2020
2
+ * Added the send method. Use this when you already have a connection.
3
+ * Fixed a flags bug in the sendmsg method.
4
+ * Fixed an association_id typo in the connect method.
5
+ * The SCTP_PR_SCTP_TTL flag is automatically set if a TTL value is provided.
6
+ * Added some constants so you can actually start passing flag values.
7
+
8
+ ## 0.0.3 - 1-Dec-2020
2
9
  * Added notification hooks that you can subscribe to, so now the subscribe method
3
10
  actually does something.
4
11
 
5
- ## 29-Nov-2020
12
+ ## 0.0.2 - 29-Nov-2020
6
13
  * Fixed the homepage link in the gemspec metadata. Thanks go to Nick LaMuro for the patch.
7
14
  * The getlocalnames and getpeernames now return an array of addresses.
8
15
  * Added a shutdown method.
9
16
  * Added more documentation.
10
17
 
11
- ## 24-Nov-2020
18
+ ## 0.0.1 - 24-Nov-2020
12
19
  * Initial release.
data/README.md CHANGED
@@ -59,6 +59,9 @@ end
59
59
 
60
60
  ## Known Issues
61
61
 
62
+ Currently this has only been developed and tested on Linux. Other platforms
63
+ will probably only be supported via community contributions.
64
+
62
65
  Please report any issues on the github project page.
63
66
 
64
67
  https://github.com/djberg96/sctp-socket
@@ -16,6 +16,19 @@ VALUE v_sndinfo_struct;
16
16
  VALUE v_adaptation_event_struct;
17
17
  VALUE v_partial_delivery_event_struct;
18
18
  VALUE v_auth_event_struct;
19
+ VALUE v_sockaddr_in_struct;
20
+
21
+ VALUE convert_sockaddr_in_to_struct(struct sockaddr_in* addr){
22
+ char ipbuf[16];
23
+
24
+ inet_ntop(addr->sin_family, &(((struct sockaddr_in *)addr)->sin_addr), ipbuf, sizeof(ipbuf));
25
+
26
+ return rb_struct_new(v_sockaddr_in_struct,
27
+ INT2NUM(addr->sin_family),
28
+ INT2NUM(ntohs(addr->sin_port)),
29
+ rb_str_new2(ipbuf)
30
+ );
31
+ }
19
32
 
20
33
  // Helper function to get a hash value via string or symbol.
21
34
  VALUE rb_hash_aref2(VALUE v_hash, const char* key){
@@ -35,8 +48,15 @@ VALUE rb_hash_aref2(VALUE v_hash, const char* key){
35
48
  * a domain (aka family) value and socket type. By default these are AF_INET
36
49
  * and SOCK_SEQPACKET, respectively.
37
50
  *
51
+ * There are only two supported families: SOCK_SEQPACKET for the creation
52
+ * of a one-to-many socket, and SOCK_STREAM for the creation of a
53
+ * one-to-one socket.
54
+ *
38
55
  * Example:
39
56
  *
57
+ * require 'socket'
58
+ * require 'sctp/socket'
59
+ *
40
60
  * socket1 = SCTP::Socket.new
41
61
  * socket2 = SCTP::Socket.new(Socket::AF_INET, Socket::SOCK_STREAM)
42
62
  */
@@ -202,7 +222,7 @@ static VALUE rsctp_connect(int argc, VALUE* argv, VALUE self){
202
222
  if(sctp_connectx(sock_fd, (struct sockaddr *) addrs, num_ip, &assoc) < 0)
203
223
  rb_raise(rb_eSystemCallError, "sctp_connectx: %s", strerror(errno));
204
224
 
205
- rb_iv_set(self, "@assocation_id", INT2NUM(assoc));
225
+ rb_iv_set(self, "@association_id", INT2NUM(assoc));
206
226
 
207
227
  return self;
208
228
  }
@@ -296,6 +316,99 @@ static VALUE rsctp_getlocalnames(VALUE self){
296
316
  return v_array;
297
317
  }
298
318
 
319
+ /*
320
+ * Send a message on an already-connected socket to a specific association.
321
+ *
322
+ * Example:
323
+ *
324
+ * socket = SCTP::Socket.new
325
+ * socket.connect(:port => 42000, :addresses => ['10.0.4.5', '10.0.5.5'])
326
+ *
327
+ * socket.send(:message => "Hello World")
328
+ * socket.send(:message => "Hello World", :association_id => 37)
329
+ *
330
+ */
331
+ static VALUE rsctp_send(VALUE self, VALUE v_options){
332
+ uint16_t stream;
333
+ uint32_t ppid, send_flags, ctrl_flags, ttl, context;
334
+ ssize_t num_bytes;
335
+ int sock_fd;
336
+ sctp_assoc_t assoc_id;
337
+ struct sctp_sndrcvinfo info;
338
+ VALUE v_msg, v_stream, v_ppid, v_context, v_send_flags, v_ctrl_flags, v_ttl, v_assoc_id;
339
+
340
+ Check_Type(v_options, T_HASH);
341
+
342
+ v_msg = rb_hash_aref2(v_options, "message");
343
+ v_stream = rb_hash_aref2(v_options, "stream");
344
+ v_ppid = rb_hash_aref2(v_options, "ppid");
345
+ v_context = rb_hash_aref2(v_options, "context");
346
+ v_send_flags = rb_hash_aref2(v_options, "send_flags");
347
+ v_ctrl_flags = rb_hash_aref2(v_options, "control_flags");
348
+ v_ttl = rb_hash_aref2(v_options, "ttl");
349
+ v_assoc_id = rb_hash_aref2(v_options, "association_id");
350
+
351
+ if(NIL_P(v_stream))
352
+ stream = 0;
353
+ else
354
+ stream = NUM2INT(v_stream);
355
+
356
+ if(NIL_P(v_send_flags))
357
+ send_flags = 0;
358
+ else
359
+ send_flags = NUM2INT(v_send_flags);
360
+
361
+ if(NIL_P(v_ctrl_flags))
362
+ ctrl_flags = 0;
363
+ else
364
+ ctrl_flags = NUM2INT(v_ctrl_flags);
365
+
366
+ if(NIL_P(v_ttl)){
367
+ ttl = 0;
368
+ }
369
+ else{
370
+ ttl = NUM2INT(v_ttl);
371
+ send_flags |= SCTP_PR_SCTP_TTL;
372
+ }
373
+
374
+ if(NIL_P(v_ppid))
375
+ ppid = 0;
376
+ else
377
+ ppid = NUM2INT(v_ppid);
378
+
379
+ if(NIL_P(v_context))
380
+ context = 0;
381
+ else
382
+ context = NUM2INT(v_context);
383
+
384
+ if(NIL_P(v_assoc_id))
385
+ assoc_id = NUM2INT(rb_iv_get(self, "@association_id"));
386
+ else
387
+ assoc_id = NUM2INT(v_assoc_id);
388
+
389
+ info.sinfo_stream = stream;
390
+ info.sinfo_flags = send_flags;
391
+ info.sinfo_ppid = ppid;
392
+ info.sinfo_context = context;
393
+ info.sinfo_timetolive = ttl;
394
+ info.sinfo_assoc_id = assoc_id;
395
+
396
+ sock_fd = NUM2INT(rb_iv_get(self, "@sock_fd"));
397
+
398
+ num_bytes = sctp_send(
399
+ sock_fd,
400
+ StringValueCStr(v_msg),
401
+ RSTRING_LEN(v_msg),
402
+ &info,
403
+ ctrl_flags
404
+ );
405
+
406
+ if(num_bytes < 0)
407
+ rb_raise(rb_eSystemCallError, "sctp_send: %s", strerror(errno));
408
+
409
+ return INT2NUM(num_bytes);
410
+ }
411
+
299
412
  /*
300
413
  * Transmit a message to an SCTP endpoint. The following hash of options
301
414
  * is permitted:
@@ -351,12 +464,15 @@ static VALUE rsctp_sendmsg(VALUE self, VALUE v_options){
351
464
  if(NIL_P(v_flags))
352
465
  flags = 0;
353
466
  else
354
- flags = NUM2INT(v_stream);
467
+ flags = NUM2INT(v_flags);
355
468
 
356
- if(NIL_P(v_ttl))
469
+ if(NIL_P(v_ttl)){
357
470
  ttl = 0;
358
- else
471
+ }
472
+ else{
359
473
  ttl = NUM2INT(v_ttl);
474
+ flags |= SCTP_PR_SCTP_TTL;
475
+ }
360
476
 
361
477
  if(NIL_P(v_ppid))
362
478
  ppid = 0;
@@ -634,7 +750,8 @@ static VALUE rsctp_recvmsg(int argc, VALUE* argv, VALUE self){
634
750
  UINT2NUM(sndrcvinfo.sinfo_context),
635
751
  UINT2NUM(sndrcvinfo.sinfo_timetolive),
636
752
  UINT2NUM(sndrcvinfo.sinfo_assoc_id),
637
- v_notification
753
+ v_notification,
754
+ convert_sockaddr_in_to_struct(&clientaddr)
638
755
  );
639
756
  }
640
757
 
@@ -693,7 +810,7 @@ static VALUE rsctp_set_initmsg(VALUE self, VALUE v_options){
693
810
  * as follows:
694
811
  *
695
812
  * :association
696
- * - A change has occurred to an assocation, either a new one has begun or an existing one has end.
813
+ * - A change has occurred to an association, either a new one has begun or an existing one has end.
697
814
  *
698
815
  * :address
699
816
  * - The state of one of the peer's addresses has experienced a change.
@@ -853,7 +970,7 @@ void Init_socket(){
853
970
 
854
971
  v_sndrcv_struct = rb_struct_define(
855
972
  "SendReceiveInfo", "message", "stream", "flags",
856
- "ppid", "context", "ttl", "association_id", "notification", NULL
973
+ "ppid", "context", "ttl", "association_id", "notification", "client", NULL
857
974
  );
858
975
 
859
976
  v_assoc_change_struct = rb_struct_define(
@@ -895,6 +1012,10 @@ void Init_socket(){
895
1012
  "AuthEvent", "type", "length", "key_number", "indication", "association_id", NULL
896
1013
  );
897
1014
 
1015
+ v_sockaddr_in_struct = rb_struct_define(
1016
+ "SockAddrIn", "family", "port", "address", NULL
1017
+ );
1018
+
898
1019
  rb_define_method(cSocket, "initialize", rsctp_init, -1);
899
1020
 
900
1021
  rb_define_method(cSocket, "bind", rsctp_bind, -1);
@@ -905,6 +1026,7 @@ void Init_socket(){
905
1026
  rb_define_method(cSocket, "listen", rsctp_listen, -1);
906
1027
  rb_define_method(cSocket, "peeloff!", rsctp_peeloff, 1);
907
1028
  rb_define_method(cSocket, "recvmsg", rsctp_recvmsg, -1);
1029
+ rb_define_method(cSocket, "send", rsctp_send, 1);
908
1030
  rb_define_method(cSocket, "sendmsg", rsctp_sendmsg, 1);
909
1031
  rb_define_method(cSocket, "set_initmsg", rsctp_set_initmsg, 1);
910
1032
  rb_define_method(cSocket, "shutdown", rsctp_shutdown, -1);
@@ -916,6 +1038,25 @@ void Init_socket(){
916
1038
  rb_define_attr(cSocket, "association_id", 1, 1);
917
1039
  rb_define_attr(cSocket, "port", 1, 1);
918
1040
 
919
- /* 0.0.2: The version of this library */
920
- rb_define_const(cSocket, "VERSION", rb_str_new2("0.0.3"));
1041
+ /* 0.0.4: The version of this library */
1042
+ rb_define_const(cSocket, "VERSION", rb_str_new2("0.0.4"));
1043
+
1044
+ /* send flags */
1045
+
1046
+ /* Message is unordered */
1047
+ rb_define_const(cSocket, "SCTP_UNORDERED", INT2NUM(SCTP_UNORDERED));
1048
+
1049
+ /* Override the primary address */
1050
+ rb_define_const(cSocket, "SCTP_ADDR_OVER", INT2NUM(SCTP_ADDR_OVER));
1051
+
1052
+ /* Send an ABORT to peer */
1053
+ rb_define_const(cSocket, "SCTP_ABORT", INT2NUM(SCTP_ABORT));
1054
+
1055
+ /* Start a shutdown procedure */
1056
+ rb_define_const(cSocket, "SCTP_EOF", INT2NUM(SCTP_EOF));
1057
+
1058
+ /* Send to all associations */
1059
+ rb_define_const(cSocket, "SCTP_SENDALL", INT2NUM(SCTP_SENDALL));
1060
+
1061
+ rb_define_const(cSocket, "MSG_NOTIFICATION", INT2NUM(MSG_NOTIFICATION));
921
1062
  }
@@ -1,10 +1,9 @@
1
1
  Gem::Specification.new do |spec|
2
2
  spec.name = 'sctp-socket'
3
- spec.version = '0.0.3'
3
+ spec.version = '0.0.4'
4
4
  spec.author = 'Daniel Berger'
5
5
  spec.email = 'djberg96@gmail.com'
6
6
  spec.summary = 'Ruby bindings for SCTP sockets'
7
- spec.description = 'Ruby bindings for SCTP sockets'
8
7
  spec.homepage = 'https://github.com/djberg96/sctp-socket'
9
8
  spec.license = 'Apache-2.0'
10
9
  spec.cert_chain = ['certs/djberg96_pub.pem']
@@ -15,8 +14,14 @@ Gem::Specification.new do |spec|
15
14
 
16
15
  spec.extensions = ['ext/sctp/extconf.rb']
17
16
 
18
- spec.add_development_dependency 'bundler'
19
- spec.add_development_dependency 'rake'
20
- spec.add_development_dependency 'rake-compiler'
21
- spec.add_development_dependency 'rspec'
17
+ spec.add_development_dependency 'bundler', '~> 2.1'
18
+ spec.add_development_dependency 'rake', '~> 13.0'
19
+ spec.add_development_dependency 'rake-compiler', '~> 1.1'
20
+ spec.add_development_dependency 'rspec', '~> 3.9'
21
+
22
+ spec.description = <<-EOF
23
+ The sctp-socket library provides Ruby bindings for SCTP sockets. is a
24
+ message oriented, reliable transport protocol with direct support for
25
+ multihoming.
26
+ EOF
22
27
  end
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.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Berger
@@ -35,65 +35,68 @@ cert_chain:
35
35
  ORVCZpRuCPpmC8qmqxUnARDArzucjaclkxjLWvCVHeFa9UP7K3Nl9oTjJNv+7/jM
36
36
  WZs4eecIcUc4tKdHxcAJ0MO/Dkqq7hGaiHpwKY76wQ1+8xAh
37
37
  -----END CERTIFICATE-----
38
- date: 2020-12-01 00:00:00.000000000 Z
38
+ date: 2020-12-03 00:00:00.000000000 Z
39
39
  dependencies:
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: bundler
42
42
  requirement: !ruby/object:Gem::Requirement
43
43
  requirements:
44
- - - ">="
44
+ - - "~>"
45
45
  - !ruby/object:Gem::Version
46
- version: '0'
46
+ version: '2.1'
47
47
  type: :development
48
48
  prerelease: false
49
49
  version_requirements: !ruby/object:Gem::Requirement
50
50
  requirements:
51
- - - ">="
51
+ - - "~>"
52
52
  - !ruby/object:Gem::Version
53
- version: '0'
53
+ version: '2.1'
54
54
  - !ruby/object:Gem::Dependency
55
55
  name: rake
56
56
  requirement: !ruby/object:Gem::Requirement
57
57
  requirements:
58
- - - ">="
58
+ - - "~>"
59
59
  - !ruby/object:Gem::Version
60
- version: '0'
60
+ version: '13.0'
61
61
  type: :development
62
62
  prerelease: false
63
63
  version_requirements: !ruby/object:Gem::Requirement
64
64
  requirements:
65
- - - ">="
65
+ - - "~>"
66
66
  - !ruby/object:Gem::Version
67
- version: '0'
67
+ version: '13.0'
68
68
  - !ruby/object:Gem::Dependency
69
69
  name: rake-compiler
70
70
  requirement: !ruby/object:Gem::Requirement
71
71
  requirements:
72
- - - ">="
72
+ - - "~>"
73
73
  - !ruby/object:Gem::Version
74
- version: '0'
74
+ version: '1.1'
75
75
  type: :development
76
76
  prerelease: false
77
77
  version_requirements: !ruby/object:Gem::Requirement
78
78
  requirements:
79
- - - ">="
79
+ - - "~>"
80
80
  - !ruby/object:Gem::Version
81
- version: '0'
81
+ version: '1.1'
82
82
  - !ruby/object:Gem::Dependency
83
83
  name: rspec
84
84
  requirement: !ruby/object:Gem::Requirement
85
85
  requirements:
86
- - - ">="
86
+ - - "~>"
87
87
  - !ruby/object:Gem::Version
88
- version: '0'
88
+ version: '3.9'
89
89
  type: :development
90
90
  prerelease: false
91
91
  version_requirements: !ruby/object:Gem::Requirement
92
92
  requirements:
93
- - - ">="
93
+ - - "~>"
94
94
  - !ruby/object:Gem::Version
95
- version: '0'
96
- description: Ruby bindings for SCTP sockets
95
+ version: '3.9'
96
+ description: |2
97
+ The sctp-socket library provides Ruby bindings for SCTP sockets. is a
98
+ message oriented, reliable transport protocol with direct support for
99
+ multihoming.
97
100
  email: djberg96@gmail.com
98
101
  executables: []
99
102
  extensions:
metadata.gz.sig CHANGED
Binary file