mirror of
https://github.com/vishapoberon/compiler.git
synced 2026-04-06 04:02:25 +00:00
forking server example with oberon; -- noch.
Former-commit-id: 48041fee19
This commit is contained in:
parent
7c731cdfdb
commit
2615a22901
4 changed files with 264 additions and 0 deletions
102
src/test/server/s.Mod
Normal file
102
src/test/server/s.Mod
Normal file
|
|
@ -0,0 +1,102 @@
|
|||
MODULE s;
|
||||
|
||||
IMPORT sockets, types, Out := Console, Unix, S := SYSTEM;
|
||||
|
||||
TYPE Int32 = types.Int32;
|
||||
Int16 = types.Int16;
|
||||
String = types.String;
|
||||
|
||||
PROCEDURE DoSmth(sock : Int32);
|
||||
VAR str, aff : String;
|
||||
n, s : LONGINT;
|
||||
BEGIN
|
||||
s := SIZE(String);
|
||||
aff := "Affirmative, Dave";
|
||||
n := Unix.Read(sock, S.ADR(str), s);
|
||||
|
||||
IF n < 0 THEN
|
||||
Out.String("error reading from socket"); Out.Ln;
|
||||
END;
|
||||
Out.String("message is "); Out.String(str); Out.Ln;
|
||||
s := 17;
|
||||
n := Unix.Write(sock, S.ADR(aff), s);
|
||||
IF n < 2 THEN
|
||||
Out.String("error writing to socket"); Out.Ln
|
||||
END;
|
||||
|
||||
END DoSmth;
|
||||
|
||||
|
||||
PROCEDURE serve;
|
||||
VAR sockfd, newsockfd, portno, clilen, pid: sockets.Int32;
|
||||
ServAddr, CliAddr: sockets.SockAddrIn;
|
||||
Null : Int32;
|
||||
Port, maxQueue, res : Int32;
|
||||
afinet, port: Int16;
|
||||
BEGIN
|
||||
Port := 2055;
|
||||
maxQueue := 5;
|
||||
Null := 0;
|
||||
sockfd := sockets.Socket(S.VAL(Int32, sockets.AfInet), S.VAL(Int32, sockets.SockStream), Null);
|
||||
IF sockfd < 0 THEN
|
||||
Out.String("error opening socket")
|
||||
ELSE
|
||||
Out.String("socket created.")
|
||||
END;
|
||||
Out.Ln;
|
||||
|
||||
types.IntegerToInt16(sockets.AfInet, afinet);
|
||||
types.IntegerToInt16(Port, port);
|
||||
ServAddr.SinFamily := afinet;
|
||||
ServAddr.SinPort := port;
|
||||
Out.String("listening on port ");Out.Int(S.VAL(INTEGER, ServAddr.SinPort), 0); Out.Ln;
|
||||
ServAddr.SinAddr.SAddr := 0(*sockets.InAddrAny*);
|
||||
|
||||
res := sockets.Bind(sockfd, S.VAL(sockets.SockAddr, ServAddr), (SIZE(sockets.SockAddrIn)));
|
||||
IF res < 0 THEN
|
||||
Out.String("error on binding")
|
||||
ELSE
|
||||
Out.String("binding completed.")
|
||||
END;
|
||||
Out.Ln;
|
||||
|
||||
res := sockets.Listen(sockfd, maxQueue);
|
||||
|
||||
IF res # 0 THEN
|
||||
Out.String("listen() failed");
|
||||
ELSE
|
||||
Out.String("listen okay");
|
||||
END;
|
||||
Out.Ln;
|
||||
clilen := SIZE(sockets.SockAddrIn);
|
||||
LOOP
|
||||
newsockfd := sockets.Accept(sockfd, S.VAL(sockets.SockAddr, ServAddr), clilen);
|
||||
IF newsockfd < 0 THEN
|
||||
Out.String("error on accept")
|
||||
ELSE
|
||||
Out.String("accept okay")
|
||||
END;
|
||||
Out.Ln;
|
||||
|
||||
pid := Unix.Fork();
|
||||
IF pid < 0 THEN
|
||||
Out.String("error on fork")
|
||||
ELSIF pid = 0 THEN
|
||||
Out.String("forked okay"); Out.Ln;
|
||||
res := Unix.Close(sockfd);
|
||||
DoSmth(newsockfd);
|
||||
EXIT
|
||||
ELSE
|
||||
res := Unix.Close(newsockfd);
|
||||
END;
|
||||
END;
|
||||
|
||||
|
||||
END serve;
|
||||
|
||||
|
||||
BEGIN
|
||||
|
||||
serve;
|
||||
|
||||
END s.
|
||||
Loading…
Add table
Add a link
Reference in a new issue