Unit 'Sockets' Package
[Overview][Constants][Types][Procedures and functions][Index] [#rtl]

fpaccept

Accept a connection from a socket.

Declaration

Source position: socketsh.inc line 163

function fpaccept(

  s: cint;

  addrx: psockaddr;

  addrlen: pSockLen

):cint;

Description

Accept accepts a connection from a socket S, which was listening for a connection. If a connection is accepted, a file descriptor is returned (positive number). On error -1 is returned. The returned socket may NOT be used to accept more connections. The original socket remains open.

The Accept call fills the address of the connecting entity in Addrx, and sets its length in Addrlen. Addrx should be pointing to enough space, and Addrlen should be set to the amount of space available, prior to the call.

Errors

On error, -1 is returned, and errors are reported in SocketError, and include the following:

ESockEBADF
The socket descriptor is invalid.
ESockENOTSOCK
The descriptor is not a socket.
SYS_EOPNOTSUPP
The socket type doesn't support the Listen operation.
ESockEFAULT
Addr points outside your address space.
ESockEWOULDBLOCK
The requested operation would block the process.

See also

fpListen

  

Listen for connections on a socket.

fpConnect

  

Open a connection to a server socket.

fpBind

  

Bind a socket to an address.

Example

Program server;

{$mode objfpc}
{$h+}

{
  Program to test Sockets unit by Michael van Canneyt and Peter Vreman
  Server Version, First Run sock_svr to let it create a socket and then
  sock_cli to connect to that socket
}
uses Sockets;

Var
  FromName : string;
  Buffer   : string;
  S,fd    : Longint;
  len : longword;
  SAddr,SRemote : TInetSockAddr;

procedure perror (const Msg:string);
begin
  writeln (Msg,': ',SocketError);
  halt(100);
end;

procedure endnst msg : string);

begin
  fpSend(fd,@msg[1],length(msg),0);
end;

function Receive(var S : string) : boolean;

var
  nRead : integer;

begin
  SetLength(S,255);
  nRead:=fpRecv(fd,@S[1],255,0);
  Result:=nRead>0;
  if Result then
    SetLength(S,nRead)
  else
    SetLength(S,0);  
end;


begin
  S:=fpSocket (AF_INET,SOCK_STREAM,0);
  if SocketError<>0 then
   Perror ('Server : Socket : ');
  SAddr.inamily:=AF_INET;
  { port 5000 in network order }
  SAddr.inort:=htons(5000);
  SAddr.inddr.s_addr:=0;
  if fpBind(S,@SAddr,sizeof(saddr))=-1 then
   PError ('Server : Bind : ');
  if fpListen (S,1)=-1 then
   PError ('Server : Listen : ');
  Writeln('Waiting for Connect from Client, run now sock_cli in an other tty');
  len:=sizeof(SRemote);
  fd:=fpAccept(S, @SRemote,@len);
  if fd=-1 then
    PError ('Server : Accepting connection')
  else
    begin 
    endessage From Server');
    while Receive(Buffer) do
      begin
      Writeln('Server : read : ',Buffer);
      end;
    fpShutdown(fd,2);
    end;  
  CloseSocket(s);
end.

Documentation generated on: Jul 30 2025