Skip to content

Instantly share code, notes, and snippets.

@furu
Last active August 29, 2015 14:05
Show Gist options
  • Save furu/26da3597c7f785cd5b89 to your computer and use it in GitHub Desktop.
Save furu/26da3597c7f785cd5b89 to your computer and use it in GitHub Desktop.
package main
import (
"fmt"
"log"
"net"
"os"
"os/signal"
"syscall"
"time"
)
/*
ソケット
---
ソケットはファイルと見なせる。サーバ側でコネクションがクローズされたとしても
ソケットに書き込まれたデータは読み出すことができる。というよりもコネクション
がクローズされているというよりもソケットがクローズされるつまりファイルがクローズ
されているということか。TCPコネクションは、ソケットではない。相手側のソケットが
クローズされていて、もう読み込むデータがない場合にデータを読み込もうとすると
golang では EOF というエラーが返される。ソケットがクローズされていない状態で
読み込むデータがない場合は、データが書き込まれるまでブロックされる。
*/
func main() {
conn, err := net.Dial("tcp", net.JoinHostPort("localhost", "4545"))
if err != nil {
log.Fatalln(err)
}
defer conn.Close()
log.Printf("Connected to %v\n", conn.RemoteAddr())
c := make(chan os.Signal, 1)
signal.Notify(c, syscall.SIGPIPE, syscall.SIGURG)
go func() {
sig := <-c // シグナルが発生するまでブロックされる
switch sig {
case syscall.SIGPIPE, syscall.SIGURG:
signal.Stop(c)
fmt.Println(sig)
}
}()
buf := make([]byte, 1)
for {
_, err = conn.Read(buf)
if err != nil {
log.Println(err)
os.Exit(0)
}
fmt.Println(string(buf))
time.Sleep(2 * time.Second)
}
// select {}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment