Last active
August 29, 2015 14:05
-
-
Save furu/26da3597c7f785cd5b89 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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