instance method
BasicSocket#send
(::String msg, ?::Integer flags, ?::Addrinfo | ::String dest_sockaddr) -> void
basicsocket.send(mesg, flags [, dest_sockaddr]) => numbytes_sent
ext/socket/basicsocket.c
View on GitHub ↗
VALUE
rsock_bsock_send(int argc, VALUE *argv, VALUE socket)
{
struct rsock_send_arg arg;
VALUE flags, to;
rb_io_t *fptr;
rb_blocking_function_t *func;
const char *funcname;
rb_scan_args(argc, argv, "21", &arg.mesg, &flags, &to);
StringValue(arg.mesg);
if (!NIL_P(to)) {
SockAddrStringValue(to);
to = rb_str_new4(to);
arg.to = (struct sockaddr *)RSTRING_PTR(to);
arg.tolen = RSTRING_SOCKLEN(to);
func = rsock_sendto_blocking;
funcname = "sendto(2)";
}
else {
func = rsock_send_blocking;
funcname = "send(2)";
}
RB_IO_POINTER(socket, fptr);
arg.fd = fptr->fd;
arg.flags = NUM2INT(flags);
while (true) {
#ifdef RSOCK_WAIT_BEFORE_BLOCKING
rb_io_wait(socket, RB_INT2NUM(RUBY_IO_WRITABLE), Qnil);
#endif
ssize_t n = (ssize_t)rb_io_blocking_region(fptr, func, &arg);
if (n >= 0) return SSIZET2NUM(n);
if (rb_io_maybe_wait_writable(errno, socket, RUBY_IO_TIMEOUT_DEFAULT)) {
continue;
}
rb_sys_fail(funcname);
}
}
send mesg via basicsocket.
mesg should be a string.
flags should be a bitwise OR of Socket::MSG_* constants.
dest_sockaddr should be a packed sockaddr string or an addrinfo.
Example
TCPSocket.open("localhost", 80) {|s| s.send "GET / HTTP/1.0\r\n\r\n", 0 p s.read }
See also
#remote_address
#sendmsg
#recv_nonblock
#sendmsg_nonblock
also in
4.1 · 3.4 · 3.3 · 3.2 · 3.1 · 3.0