Files
llgo/c/sys/_demo/selectdemo2/select2.go

89 lines
2.0 KiB
Go
Raw Normal View History

2024-07-16 11:49:38 +08:00
package main
import (
2024-07-19 11:27:49 +08:00
"unsafe"
2024-07-16 11:49:38 +08:00
"github.com/goplus/llgo/c"
2024-07-18 10:28:14 +08:00
"github.com/goplus/llgo/c/net"
2024-07-16 11:49:38 +08:00
"github.com/goplus/llgo/c/os"
2024-07-18 10:28:14 +08:00
"github.com/goplus/llgo/c/sys"
2024-07-16 11:49:38 +08:00
)
const (
2024-07-18 10:28:14 +08:00
SERVER_IP = "110.242.68.66" // Get the IP address by ping baidu.com
2024-07-16 11:49:38 +08:00
SERVER_PORT = 80
BUFFER_SIZE = 4096 * 1024
)
func main() {
2024-07-18 10:28:14 +08:00
var server net.SockaddrIn
2024-07-16 11:49:38 +08:00
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
2024-07-18 10:28:14 +08:00
// create net
sock := net.Socket(net.AF_INET, net.SOCK_STREAM, 0)
2024-07-16 11:49:38 +08:00
if sock < 0 {
c.Perror(c.Str("Socket creation failed"))
return
}
// set server addr
c.Memset(c.Pointer(&server), 0, unsafe.Sizeof(server))
2024-07-18 10:28:14 +08:00
server.Family = net.AF_INET
server.Port = net.Htons(SERVER_PORT)
server.Addr.Addr = net.InetAddr(c.Str(SERVER_IP))
2024-07-16 11:49:38 +08:00
// connect to server
2024-07-18 10:28:14 +08:00
if net.Connect(sock, (*net.SockAddr)(c.Pointer(&server)), c.Uint(unsafe.Sizeof(server))) < 0 {
2024-07-16 11:49:38 +08:00
c.Perror(c.Str("Connect failed"))
return
}
2024-07-19 11:27:49 +08:00
var writefds, readfds sys.FdSet
var timeout sys.Timeval
2024-07-16 11:49:38 +08:00
// Monitor socket writes
2024-07-18 10:28:14 +08:00
sys.FD_ZERO(&writefds)
sys.FD_SET(sock, &writefds)
2024-07-19 11:27:49 +08:00
timeout.Sec = 10
timeout.Usec = 0
2024-07-16 11:49:38 +08:00
// Use select to monitor the readiness of writes
2024-07-18 10:28:14 +08:00
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))
2024-07-16 11:49:38 +08:00
if bytes_sent < 0 {
c.Perror(c.Str("send failed"))
return
}
}
} else {
c.Perror(c.Str("Select write error"))
return
}
// Monitor socket reads
2024-07-18 10:28:14 +08:00
sys.FD_ZERO(&readfds)
sys.FD_SET(sock, &readfds)
2024-07-16 11:49:38 +08:00
// Use select to monitor the readiness of the read operation
2024-07-18 10:28:14 +08:00
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))
2024-07-16 11:49:38 +08:00
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)
2024-07-18 10:28:14 +08:00
}