demo: select
This commit is contained in:
42
c/sys/_demo/selectdemo/select.go
Normal file
42
c/sys/_demo/selectdemo/select.go
Normal file
@@ -0,0 +1,42 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"unsafe"
|
||||
|
||||
"github.com/goplus/llgo/c"
|
||||
"github.com/goplus/llgo/c/os"
|
||||
"github.com/goplus/llgo/c/sys"
|
||||
)
|
||||
|
||||
func main() {
|
||||
var readFds sys.FdSet
|
||||
sys.FD_ZERO(&readFds)
|
||||
sys.FD_SET(0, &readFds)
|
||||
|
||||
var tv sys.Timeval
|
||||
tv.Sec = 5
|
||||
tv.Usec = 0
|
||||
|
||||
c.Printf(c.Str("Waiting for input on stdin...\n"))
|
||||
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 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 {
|
||||
c.Perror(c.Str("read error"))
|
||||
c.Exit(1)
|
||||
} else if n == 0 {
|
||||
c.Printf(c.Str("End of file\n"))
|
||||
} else {
|
||||
buffer[n] = c.Char(0)
|
||||
c.Printf(c.Str("Read %ld bytes: %s\n"), n, &buffer[0])
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
88
c/sys/_demo/selectdemo2/select2.go
Normal file
88
c/sys/_demo/selectdemo2/select2.go
Normal file
@@ -0,0 +1,88 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"unsafe"
|
||||
|
||||
"github.com/goplus/llgo/c"
|
||||
"github.com/goplus/llgo/c/net"
|
||||
"github.com/goplus/llgo/c/os"
|
||||
"github.com/goplus/llgo/c/sys"
|
||||
)
|
||||
|
||||
const (
|
||||
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 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 net
|
||||
sock := net.Socket(net.AF_INET, net.SOCK_STREAM, 0)
|
||||
if sock < 0 {
|
||||
c.Perror(c.Str("Socket creation failed"))
|
||||
return
|
||||
}
|
||||
|
||||
// set server addr
|
||||
c.Memset(c.Pointer(&server), 0, unsafe.Sizeof(server))
|
||||
server.Family = net.AF_INET
|
||||
server.Port = net.Htons(SERVER_PORT)
|
||||
server.Addr.Addr = net.InetAddr(c.Str(SERVER_IP))
|
||||
|
||||
// connect to server
|
||||
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 sys.FdSet
|
||||
var timeout sys.Timeval
|
||||
|
||||
// Monitor socket writes
|
||||
sys.FD_ZERO(&writefds)
|
||||
sys.FD_SET(sock, &writefds)
|
||||
timeout.Sec = 10
|
||||
timeout.Usec = 0
|
||||
|
||||
// Use select to monitor the readiness of writes
|
||||
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
|
||||
}
|
||||
}
|
||||
} else {
|
||||
c.Perror(c.Str("Select write error"))
|
||||
return
|
||||
}
|
||||
|
||||
// Monitor socket reads
|
||||
sys.FD_ZERO(&readfds)
|
||||
sys.FD_SET(sock, &readfds)
|
||||
|
||||
// Use select to monitor the readiness of the read operation
|
||||
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
|
||||
}
|
||||
recvBuf[bytes_received] = c.Char(0)
|
||||
c.Printf(c.Str("Received:\n%s\n"), &recvBuf[0])
|
||||
}
|
||||
} else {
|
||||
c.Perror(c.Str("Select read error"))
|
||||
return
|
||||
}
|
||||
|
||||
os.Close(sock)
|
||||
}
|
||||
Reference in New Issue
Block a user