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




  • 相关阅读:
    Linux----硬连接和软连接
    C4.5算法
    浅谈机器学习方法
    ID3算法(决策树)
    修改mysql数据库 允许远程访问
    CentOS 7安装Samba 4.6 版本步骤及错误解决方法
    CentOS安装mysql
    eclipse 安装lombok插件
    电脑忘记密码,破解方式
    mysql常用的信息查询函数
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/3980685.html
Copyright © 2011-2022 走看看