@@ -12,9 +12,12 @@ export tcp_socket, tcp_conn_port, tcp_err_data;
12
12
// operations on a tcp_socket
13
13
export write, read_start, read_stop;
14
14
// tcp server stuff
15
- export new_listener, listen_for_conn, accept, conn_recv;
15
+ export listen_for_conn, accept;
16
+ export new_listener, conn_recv, conn_recv_spawn, conn_peek;
16
17
// tcp client stuff
17
18
export connect;
19
+ // helper methods
20
+ export conn_port_methods, sock_methods;
18
21
19
22
#[ nolink]
20
23
native mod rustrt {
@@ -410,6 +413,8 @@ fn new_listener(host_ip: ip::ip_addr, port: uint, backlog: uint)
410
413
#[ doc="
411
414
Block on a `net::tcp::tcp_conn_port` until a new connection arrives
412
415
416
+ This function behaves similarly to `comm::recv()`
417
+
413
418
# Arguments
414
419
415
420
* server_port -- a `net::tcp::tcp_conn_port` that you wish to listen
@@ -436,6 +441,22 @@ fn conn_recv(server_port: tcp_conn_port)
436
441
}
437
442
}
438
443
444
+ #[ doc="
445
+ Identical to `net::tcp::conn_recv`, but ran on a new task
446
+
447
+ The recv'd tcp_socket is created with a new task on the current scheduler,
448
+ and given as a parameter to the provided callback
449
+
450
+ # Arguments
451
+
452
+ * `server_port` -- a `net::tcp::tcp_conn_port` that you wish to listen
453
+ on for an incoming connection
454
+ * `cb` -- a callback that will be ran, in a new task on the current scheduler,
455
+ once a new connection is recv'd. Its parameter:
456
+ * A `result` object containing a `net::tcp::tcp_socket`, ready for immediate
457
+ use, as the `ok` varient, or a `net::tcp::tcp_err_data` for the `err`
458
+ variant
459
+ " ]
439
460
fn conn_recv_spawn ( server_port : tcp_conn_port ,
440
461
cb : fn ~( result:: result < tcp_socket , tcp_err_data > ) ) {
441
462
let new_conn_po = ( * * server_port) . new_conn_po ;
@@ -454,6 +475,19 @@ fn conn_recv_spawn(server_port: tcp_conn_port,
454
475
} ;
455
476
}
456
477
478
+ #[ doc="
479
+ Check if a `net::tcp::tcp_conn_port` has one-or-more pending, new connections
480
+
481
+ This function behaves similarly to `comm::peek()`
482
+
483
+ # Arguments
484
+
485
+ * `server_port` -- a `net::tcp::tcp_conn_port` representing a server connection
486
+
487
+ # Returns
488
+
489
+ `true` if there are one-or-more pending connections, `false` if there are none.
490
+ " ]
457
491
fn conn_peek ( server_port : tcp_conn_port ) -> bool {
458
492
let new_conn_po = ( * * server_port) . new_conn_po ;
459
493
comm:: peek ( new_conn_po)
@@ -713,6 +747,33 @@ fn listen_for_conn(host_ip: ip::ip_addr, port: uint, backlog: uint,
713
747
}
714
748
}
715
749
750
+ #[ doc="
751
+ Convenience methods extending `net::tcp::tcp_conn_port`
752
+ " ]
753
+ impl conn_port_methods for tcp_conn_port {
754
+ fn recv ( ) -> result:: result < tcp_socket , tcp_err_data > { conn_recv ( self ) }
755
+ fn recv_spawn ( cb : fn ~( result:: result < tcp_socket , tcp_err_data > ) )
756
+ { conn_recv_spawn ( self , cb) ; }
757
+ fn peek ( ) -> bool { conn_peek ( self ) }
758
+ }
759
+
760
+ #[ doc="
761
+ Convenience methods extending `net::tcp::tcp_socket`
762
+ " ]
763
+ impl sock_methods for tcp_socket {
764
+ fn read_start ( ) -> result:: result < comm:: port <
765
+ result:: result < [ u8 ] , tcp_err_data > > , tcp_err_data > {
766
+ read_start ( self )
767
+ }
768
+ fn read_stop ( ) ->
769
+ result:: result < ( ) , tcp_err_data > {
770
+ read_stop ( self )
771
+ }
772
+ fn write ( raw_write_data : [ [ u8 ] ] )
773
+ -> result:: result < ( ) , tcp_err_data > {
774
+ write ( self , raw_write_data)
775
+ }
776
+ }
716
777
// INTERNAL API
717
778
718
779
// various recv_* can use a tcp_conn_port can re-use this..
@@ -1256,7 +1317,7 @@ mod test {
1256
1317
// receive a single new connection.. normally this'd be
1257
1318
// in a loop {}, but we're just going to take a single
1258
1319
// client.. get their req, write a resp and then exit
1259
- let new_conn_result = conn_recv ( server_port) ;
1320
+ let new_conn_result = server_port. recv ( ) ;
1260
1321
if result:: is_failure ( new_conn_result) {
1261
1322
let err_data = result:: get_err ( new_conn_result) ;
1262
1323
log ( debug, #fmt ( "SERVER: exited abnormally name %s msg %s" ,
@@ -1324,7 +1385,7 @@ mod test {
1324
1385
fn tcp_read_single ( sock : tcp_socket )
1325
1386
-> result:: result < [ u8 ] , tcp_err_data > {
1326
1387
log ( debug, "starting tcp_read_single" ) ;
1327
- let rs_result = read_start ( sock ) ;
1388
+ let rs_result = sock . read_start ( ) ;
1328
1389
if result:: is_failure ( rs_result) {
1329
1390
let err_data = result:: get_err ( rs_result) ;
1330
1391
result:: err ( err_data)
@@ -1345,14 +1406,15 @@ mod test {
1345
1406
}
1346
1407
some ( data_result) {
1347
1408
log ( debug, "tcp_read_single: got data" ) ;
1409
+ sock. read_stop ( ) ;
1348
1410
data_result
1349
1411
}
1350
1412
}
1351
1413
}
1352
1414
}
1353
1415
1354
1416
fn tcp_write_single ( sock : tcp_socket , val : [ u8 ] ) {
1355
- let write_result = write ( sock , [ val] ) ;
1417
+ let write_result = sock . write ( [ val] ) ;
1356
1418
if result:: is_failure ( write_result) {
1357
1419
log ( debug, "tcp_write_single: write failed!" ) ;
1358
1420
let err_data = result:: get_err ( write_result) ;
0 commit comments