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
Name | Description |
---|---|
fpBind | Bind a socket to an address. |
fpConnect | Open a connection to a server socket. |
fpListen | Listen for connections on a socket. |
Example
Program server;
{
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
}
{$mode fpc}
uses Sockets;
Var
FromName : string;
Buffer : string[255];
S : Longint;
Sin,Sout : Text;
SAddr : TInetSockAddr;
procedure perror (const S:string);
begin
writeln (S,SocketError);
halt(100);
end;
begin
S:=fpSocket (AF_INET,SOCK_STREAM,0);
if SocketError<>0 then
Perror ('Server : Socket : ');
SAddr.sin_family:=AF_INET;
{ port 50000 in network order }
SAddr.sin_port:=htons(5000);
SAddr.sin_addr.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');
if Accept(S,FromName,Sin,Sout) then
PError ('Server : Accept : '+fromname);
Reset(Sin);
ReWrite(Sout);
Writeln(Sout,'Message From Server');
Flush(SOut);
while not eof(sin) do
begin
Readln(Sin,Buffer);
Writeln('Server : read : ',buffer);
end;
end.