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




相关文章推荐

【原创】k8s源码分析------第三方库etcd client分析

此博客从本人空间中转载过来, http://user.qzone.qq.com/29185807/blog/1458542207 代码为github.com/coreos/go-etcd/etcd ...

golang中net包用法(一)

net包对于网络I/O提供了便携式接口,包括TCP/IP,UDP,域名解析以及Unix Socket。尽管net包提供了大量访问底层的接口,但是大多数情况下,客户端仅仅只需要最基本的接口,例如Dial...

Linux环境编程之同步(四):Posix信号量

信号量是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语。有三种类型:Posix有名信号量,使用Posix IPC名字标识;Posix基于内存的信号量,存放在共享内存区中;System ...

Linux环境编程之共享内存区(二):Posix共享内存区

现在将共享内存区的概念扩展到将无亲缘关系进程间共享的内存区包括在内。Posix提供了两种在无亲缘关系进程间共享内存区的方法: 1、内存映射文件:由open函数打开,由mmap函数把得到的描述符映射到...

Linux环境下的c语言socket编程实现交互通信

直接上图,大家一起交流交流。基于tcp协议下的socket编译:    //服务器端代码: //客户端代码: 直接放到share文件夹下, 先运行服务器端: #...

Linux环境下的Socket编程

  • 2009年03月15日 12:50
  • 7KB
  • 下载

Linux环境下的Socket编程.doc

  • 2010年08月17日 13:33
  • 67KB
  • 下载

linux环境下SOCKET网络编程

前言   SOCKET  是对TCP/IP的封装与应用。   在同一个互联网上,通过IP地址和端口号与协议,二台主机则可以互相锁定特定的进程。   SOCKET 是一种特殊的文件。使我们不必了解...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Golang在Linux环境下的POSIX风格socket编程
举报原因:
原因补充:

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