utils/conn: fix a socket error in windows

This commit is contained in:
fatedier 2016-06-06 11:43:41 +08:00
parent 04014bb78f
commit 2640c0b570
4 changed files with 15 additions and 7 deletions

View File

@ -6,7 +6,7 @@
>frp 是一个高性能的反向代理应用,可以帮助你轻松的进行内网穿透,对外网提供服务,对于 http 服务还支持虚拟主机功能访问80端口可以根据域名路由到后端不同的 http 服务。 >frp 是一个高性能的反向代理应用,可以帮助你轻松的进行内网穿透,对外网提供服务,对于 http 服务还支持虚拟主机功能访问80端口可以根据域名路由到后端不同的 http 服务。
## frp 的作用? ## frp 的作用
* 利用处于内网或防火墙后的机器,对外网环境提供 http 服务。 * 利用处于内网或防火墙后的机器,对外网环境提供 http 服务。
* 对于 http 服务支持基于域名的虚拟主机支持自定义域名绑定使多个域名可以共用一个80端口。 * 对于 http 服务支持基于域名的虚拟主机支持自定义域名绑定使多个域名可以共用一个80端口。
@ -15,7 +15,7 @@
## 开发状态 ## 开发状态
frp 目前正在前期开发阶段master分支用于发布稳定版本dev分支用于开发您可以尝试下载最新的 release 版本进行测试。 frp 目前正在前期开发阶段master 分支用于发布稳定版本dev 分支用于开发,您可以尝试下载最新的 release 版本进行测试。
**在 1.0 版本以前,交互协议都可能会被改变,不能保证向后兼容。** **在 1.0 版本以前,交互协议都可能会被改变,不能保证向后兼容。**

View File

@ -46,7 +46,7 @@ Options:
-L log_file set output log file, including console -L log_file set output log file, including console
--log-level=<log_level> set log level: debug, info, warn, error --log-level=<log_level> set log level: debug, info, warn, error
--addr=<bind_addr> listen addr for client, example: 0.0.0.0:7000 --addr=<bind_addr> listen addr for client, example: 0.0.0.0:7000
--reload reload ini file and configures in common section won't be changed --reload reload ini file and configures in common section won't be changed
-h --help show this screen -h --help show this screen
-v --version show version -v --version show version
` `

View File

@ -19,6 +19,7 @@ import (
"fmt" "fmt"
"io" "io"
"net" "net"
"strings"
"sync" "sync"
"time" "time"
@ -129,10 +130,13 @@ func (c *Conn) GetLocalAddr() (addr string) {
func (c *Conn) ReadLine() (buff string, err error) { func (c *Conn) ReadLine() (buff string, err error) {
buff, err = c.Reader.ReadString('\n') buff, err = c.Reader.ReadString('\n')
if err == io.EOF { if err != nil {
c.mutex.Lock() // wsarecv error in windows means connection closed
c.closeFlag = true if err == io.EOF || strings.Contains(err.Error(), "wsarecv: An existing connection was forcibly closed") {
c.mutex.Unlock() c.mutex.Lock()
c.closeFlag = true
c.mutex.Unlock()
}
} }
return buff, err return buff, err
} }

View File

@ -2,6 +2,7 @@ package main
import ( import (
"fmt" "fmt"
"io"
"frp/utils/conn" "frp/utils/conn"
) )
@ -31,6 +32,9 @@ func main() {
func echoWorker(c *conn.Conn) { func echoWorker(c *conn.Conn) {
for { for {
buff, err := c.ReadLine() buff, err := c.ReadLine()
if err == io.EOF {
break
}
if err != nil { if err != nil {
fmt.Printf("echo server read error: %v\n", err) fmt.Printf("echo server read error: %v\n", err)
return return