zoukankan      html  css  js  c++  java
  • Golang在Linux环境下的POSIX风格socket编程

    这里给出一个服务端和client,服务端能够接受多个连接,而且利用Go的杀手特性go和channel来替代select进行数据的接收。


    服务端:

    package main
    
    import (
    	"fmt"
    	. "syscall"
    )
    
    func RecvRoutine(sockfd int, session chan string) {
    	var buffer []byte = make([]byte, 3000)
    	for {
    		if length, err := Read(sockfd, buffer); err == nil {
    			session <- string(buffer[:length])
    		}
    	}
    }
    
    func main() {
    	var (
    		serversock int
    		serveraddr SockaddrInet4
    		session    chan string = make(chan string, 1000)
    		err        error
    	)
    
    	if serversock, err = Socket(AF_INET, SOCK_STREAM, IPPROTO_IP); err != nil {
    		fmt.Println("Server Socket() called error:", err.Error())
    		return
    	}
    	defer Shutdown(serversock, SHUT_RDWR)
    
    	serveraddr.Addr = [4]byte{127, 0, 0, 1}
    	serveraddr.Port = 3000
    
    	if err = Bind(serversock, &serveraddr); err != nil {
    		fmt.Println("Server Bind() called error:", err.Error())
    		return
    	}
    
    	if err = Listen(serversock, SOMAXCONN); err != nil {
    		fmt.Println("Server Listen() called error:", err.Error())
    		return
    	}
    
    	go func() {
    		for {
    			fmt.Println(<-session)
    		}
    	}()
    
    	fmt.Println("server is listening at port 3000...")
    	for {
    		if clientsock, _, err := Accept(serversock); err == nil {
    			go RecvRoutine(clientsock, session)
    		}
    	}
    }


    client:

    package main
    
    import (
    	"fmt"
    	. "syscall"
    )
    
    func main() {
    	var (
    		clientsock int
    		serveraddr SockaddrInet4
    		err        error
    	)
    
    	if clientsock, err = Socket(AF_INET, SOCK_STREAM, IPPROTO_IP); err != nil {
    		fmt.Println("Client Socket() called error:", err.Error())
    		return
    	}
    	defer Shutdown(clientsock, SHUT_RDWR)
    
    	serveraddr.Addr = [4]byte{127, 0, 0, 1}
    	serveraddr.Port = 3000
    
    	if err = Connect(clientsock, &serveraddr); err != nil {
    		fmt.Println("Client Connect() called error:", err.Error())
    		return
    	}
    
    	var msg string
    	for {
    		fmt.Scanf("%s
    ", &msg)
    		if msg != "
    " && msg != "
    " {
    			if _, err = Write(clientsock, []byte(msg)); err != nil {
    				fmt.Println("Send() error:", err.Error())
    			}
    		}
    	}
    }



    假设转载请注明出处:http://blog.csdn.net/gophers




  • 相关阅读:
    平衡二叉查找树——AVL树
    Java 输入输出(一)——流
    C++获取系统当前时间(精确到微秒)
    C++ STL中哈希表 hash_map介绍
    ubuntu下面编译libuv
    linux使用select实现精确定时器详解
    .dll,.lib,.def 和 .exp文件
    没有core文件时候如何定位segment/core dump
    C++中string、char *、char[]的转换
    map自定义结构体作为key
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/3980685.html
Copyright © 2011-2022 走看看