From 254acbbbe24d1a09f2d04d0d400f1fc8d240c2d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E8=8B=B1=E6=9D=B0?= Date: Thu, 18 Jul 2024 10:28:14 +0800 Subject: [PATCH] llgo/c/hyper_related --- _demo/netdb/netdb.go | 15 +++++----- _demo/select/select.go | 16 +++++----- _demo/select/select2.go | 48 +++++++++++++++--------------- _demo/socket/client/client.go | 14 ++++----- _demo/socket/server/server.go | 20 ++++++------- c/fddef/fddef.go | 24 --------------- c/{socket/socket.go => net/net.go} | 24 +++++++++++---- c/netdb/netdb.go | 29 ------------------ c/select/select.go | 22 -------------- c/{fddef => sys}/_wrap/fddef.c | 0 c/sys/select.go | 31 +++++++++++++++++++ 11 files changed, 105 insertions(+), 138 deletions(-) delete mode 100644 c/fddef/fddef.go rename c/{socket/socket.go => net/net.go} (92%) delete mode 100644 c/netdb/netdb.go delete mode 100644 c/select/select.go rename c/{fddef => sys}/_wrap/fddef.c (100%) create mode 100644 c/sys/select.go diff --git a/_demo/netdb/netdb.go b/_demo/netdb/netdb.go index e0ebb3f7..879ba3e8 100644 --- a/_demo/netdb/netdb.go +++ b/_demo/netdb/netdb.go @@ -2,20 +2,19 @@ package main import ( "github.com/goplus/llgo/c" - "github.com/goplus/llgo/c/netdb" - "github.com/goplus/llgo/c/socket" + "github.com/goplus/llgo/c/net" ) func main() { - var hints netdb.AddrInfo - hints.AiFamily = socket.AF_UNSPEC - hints.AiSockType = socket.SOCK_STREAM + var hints net.AddrInfo + hints.AiFamily = net.AF_UNSPEC + hints.AiSockType = net.SOCK_STREAM host := "httpbin.org" port := "80" - var result *netdb.AddrInfo - c.Printf(c.Str("%d\n"), netdb.Getaddrinfo(c.Str(host), c.Str(port), &hints, &result)) + var result *net.AddrInfo + c.Printf(c.Str("%d\n"), net.Getaddrinfo(c.Str(host), c.Str(port), &hints, &result)) - c.Printf(c.Str("%d\n"), netdb.Freeaddrinfo(result)) + c.Printf(c.Str("%d\n"), net.Freeaddrinfo(result)) } diff --git a/_demo/select/select.go b/_demo/select/select.go index e7d64991..918150f8 100644 --- a/_demo/select/select.go +++ b/_demo/select/select.go @@ -2,32 +2,32 @@ package main import ( "github.com/goplus/llgo/c" - "github.com/goplus/llgo/c/fddef" "github.com/goplus/llgo/c/os" - _select "github.com/goplus/llgo/c/select" + "github.com/goplus/llgo/c/sys" + "github.com/goplus/llgo/c/syscall" "unsafe" ) func main() { - var readFds fddef.FdSet + var readFds syscall.FdSet - fddef.FdZero(&readFds) + sys.FD_ZERO(&readFds) - fddef.Fdset(0, &readFds) + sys.FD_SET(0, &readFds) - var tv _select.TimeVal + var tv sys.TimeVal tv.TvSec = 5 tv.TvUSec = 0 c.Printf(c.Str("Waiting for input on stdin...\n")) - ret := _select.Select(1, &readFds, nil, nil, &tv) + ret := sys.Select(1, &readFds, nil, nil, &tv) if ret == -1 { c.Perror(c.Str("select error")) c.Exit(1) } else if ret == 0 { c.Printf(c.Str("Timeout occurred! No data after 5 seconds.\n")) } else { - if fddef.FdIsset(0, &readFds) != 0 { + if sys.FD_ISSET(0, &readFds) != 0 { var buffer [100]c.Char n := os.Read(0, c.Pointer(&buffer[:][0]), unsafe.Sizeof(buffer)-1) if n == -1 { diff --git a/_demo/select/select2.go b/_demo/select/select2.go index 417b5392..68069d1e 100644 --- a/_demo/select/select2.go +++ b/_demo/select/select2.go @@ -2,28 +2,28 @@ package main import ( "github.com/goplus/llgo/c" - "github.com/goplus/llgo/c/fddef" + "github.com/goplus/llgo/c/net" "github.com/goplus/llgo/c/os" - _select "github.com/goplus/llgo/c/select" - "github.com/goplus/llgo/c/socket" + "github.com/goplus/llgo/c/sys" + "github.com/goplus/llgo/c/syscall" "unsafe" ) const ( - SERVER_IP = "110.242.68.66" // Get the IP address by ping baidu.com + SERVER_IP = "110.242.68.66" // Get the IP address by ping baidu.com SERVER_PORT = 80 BUFFER_SIZE = 4096 * 1024 ) func main() { - var server socket.SockaddrIn + var server net.SockaddrIn sendBuf := c.Str("GET / HTTP/1.1\r\nHost: baidu.com\r\n\r\n") var recvBuf [BUFFER_SIZE]c.Char var bytes_sent, bytes_received c.Int - // create socket - sock := socket.Socket(socket.AF_INET, socket.SOCK_STREAM, 0) + // create net + sock := net.Socket(net.AF_INET, net.SOCK_STREAM, 0) if sock < 0 { c.Perror(c.Str("Socket creation failed")) return @@ -31,28 +31,28 @@ func main() { // set server addr c.Memset(c.Pointer(&server), 0, unsafe.Sizeof(server)) - server.Family = socket.AF_INET - server.Port = socket.Htons(SERVER_PORT) - server.Addr.Addr = socket.InetAddr(c.Str(SERVER_IP)) + server.Family = net.AF_INET + server.Port = net.Htons(SERVER_PORT) + server.Addr.Addr = net.InetAddr(c.Str(SERVER_IP)) // connect to server - if socket.Connect(sock, (*socket.SockAddr)(c.Pointer(&server)), c.Uint(unsafe.Sizeof(server))) < 0 { + if net.Connect(sock, (*net.SockAddr)(c.Pointer(&server)), c.Uint(unsafe.Sizeof(server))) < 0 { c.Perror(c.Str("Connect failed")) return } - var writefds, readfds fddef.FdSet - var timeout _select.TimeVal + var writefds, readfds syscall.FdSet + var timeout sys.TimeVal // Monitor socket writes - fddef.FdZero(&writefds) - fddef.Fdset(sock, &writefds) + sys.FD_ZERO(&writefds) + sys.FD_SET(sock, &writefds) timeout.TvSec = 10 timeout.TvUSec = 0 // Use select to monitor the readiness of writes - if _select.Select(sock+1, nil, &writefds, nil, &timeout) > 0 { - if fddef.FdIsset(sock, &writefds) != 0 { - bytes_sent = c.Int(socket.Send(sock, c.Pointer(sendBuf), c.Strlen(sendBuf), 0)) + if sys.Select(sock+1, nil, &writefds, nil, &timeout) > 0 { + if sys.FD_ISSET(sock, &writefds) != 0 { + bytes_sent = c.Int(net.Send(sock, c.Pointer(sendBuf), c.Strlen(sendBuf), 0)) if bytes_sent < 0 { c.Perror(c.Str("send failed")) return @@ -64,13 +64,13 @@ func main() { } // Monitor socket reads - fddef.FdZero(&readfds) - fddef.Fdset(sock, &readfds) + sys.FD_ZERO(&readfds) + sys.FD_SET(sock, &readfds) // Use select to monitor the readiness of the read operation - if _select.Select(sock+1, &readfds, nil, nil, &timeout) > 0 { - if fddef.FdIsset(sock, &writefds) != -1 { - bytes_received = c.Int(socket.Recv(sock, c.Pointer(&recvBuf[:][0]), BUFFER_SIZE-1, 0)) + if sys.Select(sock+1, &readfds, nil, nil, &timeout) > 0 { + if sys.FD_ISSET(sock, &writefds) != -1 { + bytes_received = c.Int(net.Recv(sock, c.Pointer(&recvBuf[:][0]), BUFFER_SIZE-1, 0)) if bytes_received < 0 { c.Perror(c.Str("receive failed")) return @@ -84,4 +84,4 @@ func main() { } os.Close(sock) -} \ No newline at end of file +} diff --git a/_demo/socket/client/client.go b/_demo/socket/client/client.go index ee1ed884..7f70e33a 100644 --- a/_demo/socket/client/client.go +++ b/_demo/socket/client/client.go @@ -4,27 +4,27 @@ import ( "unsafe" "github.com/goplus/llgo/c" + "github.com/goplus/llgo/c/net" "github.com/goplus/llgo/c/os" - "github.com/goplus/llgo/c/socket" ) func main() { - sockfd := socket.Socket(socket.AF_INET, socket.SOCK_STREAM, 0) + sockfd := net.Socket(net.AF_INET, net.SOCK_STREAM, 0) msg := c.Str("Hello, World!") defer os.Close(sockfd) - server := socket.GetHostByName(c.Str("localhost")) + server := net.GetHostByName(c.Str("localhost")) if server == nil { c.Perror(c.Str("hostname get error")) return } - servAddr := &socket.SockaddrIn{} - servAddr.Family = socket.AF_INET - servAddr.Port = socket.Htons(uint16(1234)) + servAddr := &net.SockaddrIn{} + servAddr.Family = net.AF_INET + servAddr.Port = net.Htons(uint16(1234)) c.Memcpy(unsafe.Pointer(&servAddr.Addr.Addr), unsafe.Pointer(*server.AddrList), uintptr(server.Length)) - if res := socket.Connect(sockfd, (*socket.SockAddr)(unsafe.Pointer(servAddr)), c.Uint(16)); res < 0 { + if res := net.Connect(sockfd, (*net.SockAddr)(unsafe.Pointer(servAddr)), c.Uint(16)); res < 0 { c.Perror(c.Str("connect error")) return } diff --git a/_demo/socket/server/server.go b/_demo/socket/server/server.go index 5a640a3e..6a310cf0 100644 --- a/_demo/socket/server/server.go +++ b/_demo/socket/server/server.go @@ -4,36 +4,36 @@ import ( "unsafe" "github.com/goplus/llgo/c" + "github.com/goplus/llgo/c/net" "github.com/goplus/llgo/c/os" - "github.com/goplus/llgo/c/socket" ) func main() { var buffer [256]c.Char - sockfd := socket.Socket(socket.AF_INET, socket.SOCK_STREAM, 0) + sockfd := net.Socket(net.AF_INET, net.SOCK_STREAM, 0) defer os.Close(sockfd) - servAddr := &socket.SockaddrIn{ - Family: socket.AF_INET, - Port: socket.Htons(uint16(1234)), - Addr: socket.InAddr{Addr: 0x00000000}, + servAddr := &net.SockaddrIn{ + Family: net.AF_INET, + Port: net.Htons(uint16(1234)), + Addr: net.InAddr{Addr: 0x00000000}, Zero: [8]c.Char{0, 0, 0, 0, 0, 0, 0, 0}, } - if res := socket.Bind(sockfd, servAddr, c.Uint(unsafe.Sizeof(*servAddr))); res < 0 { + if res := net.Bind(sockfd, servAddr, c.Uint(unsafe.Sizeof(*servAddr))); res < 0 { c.Perror(c.Str("bind error")) return } - if socket.Listen(sockfd, 5) < 0 { + if net.Listen(sockfd, 5) < 0 { c.Printf(c.Str("listen error")) return } c.Printf(c.Str("Listening on port 1234...\n")) - cliAddr, clilen := &socket.SockaddrIn{}, c.Uint(unsafe.Sizeof(servAddr)) + cliAddr, clilen := &net.SockaddrIn{}, c.Uint(unsafe.Sizeof(servAddr)) - newsockfd := socket.Accept(sockfd, cliAddr, &clilen) + newsockfd := net.Accept(sockfd, cliAddr, &clilen) defer os.Close(newsockfd) c.Printf(c.Str("Connection accepted.")) diff --git a/c/fddef/fddef.go b/c/fddef/fddef.go deleted file mode 100644 index 791aadd5..00000000 --- a/c/fddef/fddef.go +++ /dev/null @@ -1,24 +0,0 @@ -package fddef - -import ( - "github.com/goplus/llgo/c" - _ "unsafe" -) - -const ( - LLGoFiles = "_wrap/fddef.c" - LLGoPackage = "link: c" -) - -type FdSet struct { - Unused [8]byte -} - -//go:linkname FdZero C.fd_zero -func FdZero(fdSet *FdSet) - -//go:linkname Fdset C.fdSet -func Fdset(fd c.Int, fdSet *FdSet) - -//go:linkname FdIsset C.fd_isset -func FdIsset(fd c.Int, fdSet *FdSet) c.Int diff --git a/c/socket/socket.go b/c/net/net.go similarity index 92% rename from c/socket/socket.go rename to c/net/net.go index 12c8affa..c6163c3b 100644 --- a/c/socket/socket.go +++ b/c/net/net.go @@ -14,7 +14,7 @@ * limitations under the License. */ -package socket +package net import ( _ "unsafe" @@ -101,7 +101,6 @@ type SockAddr struct { Data [14]c.Char } -// (TODO) merge to netdb type Hostent struct { Name *c.Char // official name of host Aliases **c.Char // null-terminated array of alternate names for the host @@ -110,6 +109,17 @@ type Hostent struct { AddrList **c.Char // null-terminated array of addresses for the host } +type AddrInfo struct { + AiFlags c.Int + AiFamily c.Int + AiSockType c.Int + AiProtocol c.Int + AiAddrLen c.Uint + AiCanOnName *c.Char + AiAddr *SockAddr + AiNext *AddrInfo +} + //go:linkname Socket C.socket func Socket(domain c.Int, typ c.Int, protocol c.Int) c.Int @@ -125,8 +135,6 @@ func Listen(sockfd c.Int, backlog c.Int) c.Int //go:linkname Accept C.accept func Accept(sockfd c.Int, addr *SockaddrIn, addrlen *c.Uint) c.Int -// (TODO) merge to netdb -// //go:linkname GetHostByName C.gethostbyname func GetHostByName(name *c.Char) *Hostent @@ -143,8 +151,6 @@ func Htons(x uint16) uint16 { return SwapInt16(x) } -// (TODO) merge to netdb -// //go:linkname InetAddr C.inet_addr func InetAddr(s *c.Char) c.Uint @@ -153,3 +159,9 @@ func Send(c.Int, c.Pointer, uintptr, c.Int) c.Long //go:linkname Recv C.recv func Recv(c.Int, c.Pointer, uintptr, c.Int) c.Long + +//go:linkname Getaddrinfo C.getaddrinfo +func Getaddrinfo(host *c.Char, port *c.Char, addrInfo *AddrInfo, result **AddrInfo) c.Int + +//go:linkname Freeaddrinfo C.freeaddrinfo +func Freeaddrinfo(addrInfo *AddrInfo) c.Int diff --git a/c/netdb/netdb.go b/c/netdb/netdb.go deleted file mode 100644 index a2db1b7b..00000000 --- a/c/netdb/netdb.go +++ /dev/null @@ -1,29 +0,0 @@ -package netdb - -import ( - "github.com/goplus/llgo/c/socket" - _ "unsafe" - - "github.com/goplus/llgo/c" -) - -const ( - LLGoPackage = "decl" -) - -type AddrInfo struct { - AiFlags c.Int - AiFamily c.Int - AiSockType c.Int - AiProtocol c.Int - AiAddrLen c.Uint - AiCanOnName *c.Char - AiAddr *socket.SockAddr - AiNext *AddrInfo -} - -//go:linkname Getaddrinfo C.getaddrinfo -func Getaddrinfo(host *c.Char, port *c.Char, addrInfo *AddrInfo, result **AddrInfo) c.Int - -//go:linkname Freeaddrinfo C.freeaddrinfo -func Freeaddrinfo(addrInfo *AddrInfo) c.Int diff --git a/c/select/select.go b/c/select/select.go deleted file mode 100644 index eebcdda9..00000000 --- a/c/select/select.go +++ /dev/null @@ -1,22 +0,0 @@ -package _select - -import ( - "github.com/goplus/llgo/c/fddef" - _ "unsafe" - - "github.com/goplus/llgo/c" -) - -const ( - LLGoPackage = "decl" -) - -// (TODO) merge to timeval -// -type TimeVal struct { - TvSec c.Long - TvUSec c.Int -} - -//go:linkname Select C.select -func Select(n c.Int, r *fddef.FdSet, w *fddef.FdSet, e *fddef.FdSet, timeout *TimeVal) c.Int diff --git a/c/fddef/_wrap/fddef.c b/c/sys/_wrap/fddef.c similarity index 100% rename from c/fddef/_wrap/fddef.c rename to c/sys/_wrap/fddef.c diff --git a/c/sys/select.go b/c/sys/select.go new file mode 100644 index 00000000..1b7cc004 --- /dev/null +++ b/c/sys/select.go @@ -0,0 +1,31 @@ +package sys + +import ( + "github.com/goplus/llgo/c/syscall" + _ "unsafe" + + "github.com/goplus/llgo/c" +) + +const ( + LLGoFiles = "_wrap/fddef.c" + LLGoPackage = "link" +) + +// (TODO) merge to timeval +type TimeVal struct { + TvSec c.Long + TvUSec c.Int +} + +//go:linkname FD_ZERO C.fd_zero +func FD_ZERO(fdSet *syscall.FdSet) + +//go:linkname FD_SET C.fdSet +func FD_SET(fd c.Int, fdSet *syscall.FdSet) + +//go:linkname FD_ISSET C.fd_isset +func FD_ISSET(fd c.Int, fdSet *syscall.FdSet) c.Int + +//go:linkname Select C.select +func Select(n c.Int, r *syscall.FdSet, w *syscall.FdSet, e *syscall.FdSet, timeout *TimeVal) c.Int