amiga-bootcamp/12_networking/bsdsocket.md
Ilia Sharin fca930d0db docs(amiga): make cross-references clickable markdown links
Convert bare .md path references in 29 files to proper [name](relative/path)
markdown links for GitHub navigation.
2026-04-23 12:24:21 -04:00

2.9 KiB
Raw Blame History

← Home · Networking

bsdsocket.library — BSD Socket API

Overview

bsdsocket.library is the AmigaOS implementation of the BSD socket API. It is provided by the active TCP/IP stack (AmiTCP, Miami, Roadshow) and presents a POSIX-like socket interface adapted to the Amiga's library-based architecture.


Opening

struct Library *SocketBase = OpenLibrary("bsdsocket.library", 4);
if (!SocketBase) { /* no TCP/IP stack running */ }

Core Functions (LVO Mapping)

LVO Function BSD Equivalent
30 socket(domain, type, protocol) socket()
36 bind(sock, name, namelen) bind()
42 listen(sock, backlog) listen()
48 accept(sock, addr, addrlen) accept()
54 connect(sock, name, namelen) connect()
60 sendto(sock, buf, len, flags, to, tolen) sendto()
66 send(sock, buf, len, flags) send()
72 recvfrom(sock, buf, len, flags, from, fromlen) recvfrom()
78 recv(sock, buf, len, flags) recv()
84 shutdown(sock, how) shutdown()
90 setsockopt(...) setsockopt()
96 getsockopt(...) getsockopt()
102 gethostbyname(name) gethostbyname()
108 gethostbyaddr(addr, len, type) gethostbyaddr()
114 getnetbyname(name) getnetbyname()
168 Errno() errno (returns last error)
174 CloseSocket(sock) close()
180 WaitSelect(nfds, rd, wr, ex, timeout, sigmask) select() + signals
210 inet_addr(cp) inet_addr()
216 Inet_NtoA(in) inet_ntoa()
222 inet_makeaddr(net, host) inet_makeaddr()
252 getservbyname(name, proto) getservbyname()

WaitSelect — Amiga-Enhanced select()

Unlike BSD select(), WaitSelect integrates with Exec signals:

fd_set rdset;
FD_ZERO(&rdset);
FD_SET(sock, &rdset);

ULONG sigmask = SIGBREAKF_CTRL_C;  /* also wait for Ctrl-C */
struct timeval tv = { 5, 0 };       /* 5 second timeout */

LONG n = WaitSelect(sock + 1, &rdset, NULL, NULL, &tv, &sigmask);
if (n > 0 && FD_ISSET(sock, &rdset)) { /* data ready */ }
if (sigmask & SIGBREAKF_CTRL_C) { /* user pressed Ctrl-C */ }

Simple TCP Client

LONG sock = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port   = htons(80);
addr.sin_addr.s_addr = inet_addr("93.184.216.34");

if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) == 0) {
    send(sock, "GET / HTTP/1.0\r\nHost: example.com\r\n\r\n", 38, 0);
    char buf[4096];
    LONG n = recv(sock, buf, sizeof(buf) - 1, 0);
    buf[n] = 0;
    Printf("%s\n", buf);
}
CloseSocket(sock);

References

  • NDK39: libraries/bsdsocket.h (stack-specific)
  • Roadshow SDK documentation
  • sana2.md — network device driver layer