Golang在Linux环境下的POSIX风格socket编程

原创 2014年06月22日 12:26:57

这里给出一个服务端和客户端,服务端可以接受多个连接,并且利用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)
		}
	}
}


客户端:

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\r\n", &msg)
		if msg != "\r" && msg != "\n" {
			if _, err = Write(clientsock, []byte(msg)); err != nil {
				fmt.Println("Send() error:", err.Error())
			}
		}
	}
}



如果转载请注明出处:http://blog.csdn.net/gophers




golang select

golang的select与channel配合使用。它用于等待一个或者多个channel的输出。 应用场景:主goroutine等待子goroutine完成,但是子goroutine无限运行,导致主...
  • kelindame
  • kelindame
  • 2016年05月27日 11:30
  • 646

select golang

select select 语句使得一个 goroutine 在多个通讯操作上等待。 select 会阻塞,直到条件分支中的某个可以继续执行,这时就会执行那个条件分支。当多个都准备好的时候...
  • txj236
  • txj236
  • 2016年06月15日 20:07
  • 75

【GOLANG】Go语言学习-select用法

golang 的 select 的功能和 select, poll, epoll 相似, 就是监听 IO 操作,当 IO 操作发生时,触发相应的动作。 示例: ch1 := mak...
  • txj236
  • txj236
  • 2017年01月06日 15:49
  • 140

在linux下面配置golang开发环境

fedora下安装golang的步骤 (root 运行) 1,安装需要的组件   yum install gcc yum install gcc-go yum install mer...
  • vgy12304
  • vgy12304
  • 2014年08月06日 23:10
  • 2080

POSIX风格正则表达式

From: http://blog.chinaunix.net/space.php?uid=20501242&do=blog&id=1940007 4.9  POSIX风格正则表达式 POSI...
  • JoeBlackzqq
  • JoeBlackzqq
  • 2012年01月27日 13:39
  • 6161

【golang】Go语言学习-select用法

golang 的 select 的功能和 select, poll, epoll 相似, 就是监听 IO 操作,当 IO 操作发生时,触发相应的动作。 示例: ch1 := make (chan ...
  • zhonglinzhang
  • zhonglinzhang
  • 2015年05月22日 09:47
  • 15084

Golang channel select用法

http://blog.sibo.me/golang_tutorials/channels-in-go-range-and-select.html 这一篇讲的很详细,不错...
  • awawfwfw
  • awawfwfw
  • 2017年12月19日 13:24
  • 62

如何将Linux端POSIX标准的程序移植到windows端 (一)

由于项目需要,必须将Linux端POSIX标准
  • zuijinhaoma8
  • zuijinhaoma8
  • 2014年10月06日 19:18
  • 825

golang开发环境mac下编译linux环境文件

1 在mac下操作 2 进入golang的src的目录    cd /Opensource/go/src 3 设置编译目标环境    CGO_ENABLED=0 GOOS=linux GOAR...
  • u012333307
  • u012333307
  • 2015年10月09日 14:33
  • 1658

Go语言goroutine+channel+select简介

goroutine: Go语言是原生支持语言级并发的,这个并发的最小逻辑单元就是goroutine。goroutine就是Go语言提供的一种用户态线程,这种用户态线程是跑在内核级线程之上的,goro...
  • qwertyupoiuytr
  • qwertyupoiuytr
  • 2017年02月14日 16:24
  • 1467
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Golang在Linux环境下的POSIX风格socket编程
举报原因:
原因补充:

(最多只允许输入30个字)