Skip to content

Latest commit

 

History

History
41 lines (34 loc) · 1.19 KB

2.2.md

File metadata and controls

41 lines (34 loc) · 1.19 KB

2.2 socket服务

socket服务便是judger服务器的TCP服务。负责处理TCP连接和数据的收发。启动TCP监听

func TcpStart() {
	i := 0
	ln, err := net.Listen("tcp", ":1004")
	handleError(err, nil)

	if len(os.Args) > 1 && os.Args[1] == "debug" {
		MARK = "#"
	} else {
		MARK = "\003"
	}

	for {
		conn, err := ln.Accept()
		if err != nil {
			fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())
			continue
		}
		i += 1
		if i > MAX_LCI {
			fmt.Println("reached max client limit, server stoped.")
			return
		}
		go handleConnection(conn, i)
	}

}

TCP连接监听处于for循环中,每当收到连接请求调用Accept方法创建连接,并且通过go关键词在新线程中通过handleConnection处理当前连接的信息收发。TCP连接的监听端口为1004,TCP协议的帧分割标识是\003。

这个TcpStart方法也是在由主线程创建的子线程中启动的。其代码在core包下的init.go文件中,代码如下

go TcpStart()
HttpStart()

可见TcpStart是在新线程中启动的,而HttpStart是在主线程中启动。由于是服务程序,主线程必须被阻塞,故而将同为阻塞型的方法HttpStart置于主线程中。