% File src/library/utils/man/read.socket.Rd
% Part of the R package, https://www.R-project.org
% Copyright 1995-2012 R Core Team
% Distributed under GPL 2 or later

\name{read.socket}
\title{ Read from or Write to a Socket}
\usage{
read.socket(socket, maxlen = 256L, loop = FALSE)
write.socket(socket, string)
}
\alias{read.socket}
\alias{write.socket}
\arguments{
    \item{socket}{a socket object.}
    \item{maxlen}{maximum length (in bytes) of string to read.}
    \item{loop}{wait for ever if there is nothing to read?}
    \item{string}{string to write to socket.}
}
\description{
    \code{read.socket} reads a string from the specified socket,
    \code{write.socket} writes to the specified socket.  There is very
    little error checking done by either.
}
\value{
  \code{read.socket} returns the string read as a length-one character vector.

  \code{write.socket} returns the number of bytes written.

}
\author{Thomas Lumley}

\seealso{
    \code{\link{close.socket}}, \code{\link{make.socket}}
}

\examples{
finger <- function(user, host = "localhost", port = 79, print = TRUE)
{
    if (!is.character(user))
        stop("user name must be a string")
    user <- paste(user,"\r\n")
    socket <- make.socket(host, port)
    on.exit(close.socket(socket))
    write.socket(socket, user)
    output <- character(0)
    repeat{
        ss <- read.socket(socket)
        if (ss == "") break
        output <- paste(output, ss)
    }
    close.socket(socket)
    if (print) cat(output)
    invisible(output)
}
\dontrun{
finger("root")  ## only works if your site provides a finger daemon}
}
\keyword{misc}
