Skip to content

Instantly share code, notes, and snippets.

@kawa1214
Created April 14, 2023 00:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kawa1214/d56de162545832a0fe39784aa0c71043 to your computer and use it in GitHub Desktop.
Save kawa1214/d56de162545832a0fe39784aa0c71043 to your computer and use it in GitHub Desktop.
TCP Socket Go
package main
import (
"log"
"syscall"
)
func main() {
// socket.listen()でサーバー側のカーネルを接続待ち状態にする
// addr localhost:8080
// socket関数 https://cs.opensource.google/go/go/+/refs/tags/go1.20.2:src/syscall/syscall_unix.go;l=494
fd, err := syscall.Socket(syscall.AF_INET, syscall.SOCK_STREAM, 0)
log.Println("fd", fd)
if err != nil {
panic(err)
}
// ソケットにアドレスを割り当てる
// https://linuxjm.osdn.jp/html/LDP_man-pages/man2/bind.2.html
err = syscall.Bind(fd, &syscall.SockaddrInet4{Port: 8080})
if err != nil {
panic(err)
}
// socket.listen()でソケットを接続待ち状態にする
syscall.Listen(fd, 10)
for {
// socket.accept()でクライアントからの接続を受け付ける
nfd, addr, err := syscall.Accept(fd)
log.Println("nfd", nfd)
log.Println("addr", addr)
if err != nil {
panic(err)
}
// クライアントからのリクエストを読み込む
r := make([]byte, 1024)
syscall.Read(nfd, r)
log.Println(string(r))
// クライアントにレスポンスを書き込む
syscall.Write(nfd, []byte("HTTP/1.1 200 OK\r, Content-Length: 12\r\n\r\nHello World!"))
// ソケットを閉じる
syscall.Close(nfd)
// // socket.read()でクライアントからのデータを読み込む
// r := make([]byte, 1024)
// syscall.Read(fd, r)
// log.Println(string(r))
}
// socket.accept()でクライアントからの接続を受け付ける
// socket.read()でクライアントからのデータを読み込む
// socket.write()でクライアントにデータを書き込む
// socket.close()でソケットを閉じる
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment