首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >运行用Go编写的syscall.Syscall6客户端时的异常

运行用Go编写的syscall.Syscall6客户端时的异常
EN

Stack Overflow用户
提问于 2020-11-11 14:38:42
回答 1查看 243关注 0票数 0

我试图在Go中编写一个简单的FTP客户端,它将连接到FTP服务器,下载与特定模式(*.xml)匹配的任何文件,然后从服务器中删除它们。我之所以使用Go,是因为它很容易使用交叉编译(对开发很重要),并且产生一个静态二进制(对于部署很重要)。Linux二进制文件在Ubuntu20.04(开发的主机平台)和我的Windows10Home膝上(与:GOARCH=windows go build ftp-test.go交叉编译)上运行良好。然而,在Windows 10 Pro机器上,我得到了一个异常和堆栈跟踪,它似乎与DNS解析有关(下面是完整的输出)。

最简单的客户端版本如下:

代码语言:javascript
复制
package main;

import (
    "fmt"
    "time"
    "github.com/jlaffaye/ftp"
)

func main() {
    fmt.Println("Connecting to FTP server")
    _, err := ftp.Dial("ftp.mirrorservice.org:21", ftp.DialWithTimeout(60*time.Second))
    if err != nil {
        fmt.Println(err)
    }
}

但是,完整的客户端源代码更长,因为当调用ftp.Dial时会发生异常,上面是触发它所需的最小代码。异常几乎是在60秒超时发生之前立即发生的。

完整的堆栈跟踪是:

代码语言:javascript
复制
.\ftp-test.exe
Connecting to FTP server
Exception 0xc0000005 0x0 0x7ffae1952fff 0x28cb44e0000
PC=0x28cb44e0000

syscall.Syscall6(0x7ffae07f4c70, 0x4, 0xc0000b60c0, 0x0, 0xc000037f18, 0xc000037e88, 0x0, 0x0, 0x0, 0x0, ...)
        /snap/go/6715/src/runtime/syscall_windows.go:201 +0xf2
syscall.GetAddrInfoW(0xc0000b60c0, 0x0, 0xc000037f18, 0xc000037e88, 0x16, 0x0)
        /snap/go/6715/src/syscall/zsyscall_windows.go:1718 +0xe5
net.(*Resolver).lookupIP.func1(0x0, 0x0, 0x0, 0x0, 0x0)
        /snap/go/6715/src/net/lookup_windows.go:109 +0x259
net.(*Resolver).lookupIP.func2(0xc0000985c0, 0xc0000e8120)
        /snap/go/6715/src/net/lookup_windows.go:146 +0x32
created by net.(*Resolver).lookupIP
        /snap/go/6715/src/net/lookup_windows.go:145 +0x41b

goroutine 1 [select]:
net.(*Resolver).lookupIPAddr(0x5268e0, 0x41e1e0, 0xc0000e8000, 0x3dbef9, 0x3, 0x3e146f, 0x15, 0x15, 0x0, 0x0, ...)
        /snap/go/6715/src/net/lookup.go:299 +0x685
net.(*Resolver).internetAddrList(0x5268e0, 0x41e1e0, 0xc0000e8000, 0x3dbef9, 0x3, 0x3e146f, 0x18, 0x0, 0x0, 0x0, ...)
        /snap/go/6715/src/net/ipsock.go:280 +0x4d4
net.(*Resolver).resolveAddrList(0x5268e0, 0x41e1e0, 0xc0000e8000, 0x3dc010, 0x4, 0x3dbef9, 0x3, 0x3e146f, 0x18, 0x0, ...)
        /snap/go/6715/src/net/dial.go:221 +0x49d
net.(*Dialer).DialContext(0xc0000e6010, 0x41e1a0, 0xc0000a2058, 0x3dbef9, 0x3, 0x3e146f, 0x18, 0x0, 0x0, 0x0, ...)
        /snap/go/6715/src/net/dial.go:403 +0x23c
github.com/jlaffaye/ftp.Dial(0x3e146f, 0x18, 0xc0000cbf50, 0x1, 0x1, 0x19, 0x0, 0x0)
        /home/paul/go/src/github.com/jlaffaye/ftp/ftp.go:105 +0x5fc
main.main()
        /home/paul/ftp-test.go:11 +0xe5

goroutine 19 [select]:
net.(*Resolver).lookupIP(0x5268e0, 0x41e160, 0xc0000ea000, 0x3dbef9, 0x3, 0x3e146f, 0x15, 0x0, 0x0, 0x0, ...)
        /snap/go/6715/src/net/lookup_windows.go:151 +0x1b9
net.glob..func1(0x41e160, 0xc0000ea000, 0xc0000886c0, 0x3dbef9, 0x3, 0x3e146f, 0x15, 0x0, 0x0, 0x0, ...)
        /snap/go/6715/src/net/hook.go:23 +0x79
net.(*Resolver).lookupIPAddr.func1(0x0, 0x0, 0x0, 0x0)
        /snap/go/6715/src/net/lookup.go:293 +0xc2
internal/singleflight.(*Group).doCall(0x5268f0, 0xc0000d60a0, 0xc0000a0760, 0x19, 0xc0000ea040)
        /snap/go/6715/src/internal/singleflight/singleflight.go:95 +0x35
created by internal/singleflight.(*Group).DoChan
        /snap/go/6715/src/internal/singleflight/singleflight.go:88 +0x2cc
rax     0x7ffaddecd84a
rbx     0x7ffaddecd848
rcx     0x77
rdi     0xffffffffffbadd11
rsi     0x0
rbp     0x28cb45135d0
rsp     0xbc5e7fe300
r8      0x94b
r9      0x94b
r10     0x94b
r11     0x94b
r12     0x7ffae1760000
r13     0x0
r14     0x7ffaddecd84a
r15     0xc000007a
rip     0x28cb44e0000
rflags  0x10202
cs      0x33
fs      0x53
gs      0x2b

我已经试过了:

使用go get -v -u all.

  • Forcing更新所有依赖项通过删除二进制文件重新编译代码(我通常只在necessary).

  • Running DNS手动查找时(例如nslookup ftp.mirrorservice.org )使用Makefile将IP地址i expect.

  • Connecting返回给necessary).

  • Running服务器,使用命令行上的ftp --这是一个简单的"hello“二进制文件(例如,如果我删除了fmt.Println("Connecting to FTP server")行之外的所有内容,当将Windows配置为阻止所有出站连接时,二进制文件在Windows10Home上运行时不需要任何problems).

  • Running。这会导致错误消息(不是堆栈跟踪的例外),说明二进制程序试图访问套接字,这是Windows10Home上的源代码forbidden.

  • Compiling,即不使用Linux的交叉编译。二进制文件运行在Ubuntu (使用葡萄酒)和Windows10Home上,但是在Windows10Pro机器上同样出错。

不幸的是,我对Windows 10 Pro机器的访问有限,所以我无法安装Go工具链(举个例子)。

我是个新手,很少把Windows作为一个平台,所以我不确定这个问题是否与我的代码、用于FTP的第三方库或Windows (或组合)有关。

我的Go版本是: 1.15.4 linux/ and 64和1.14.7 windows/and 64

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-16 16:12:09

对于这个问题,我找不到明确的答案--除了Windows防火墙之外,没有任何安全软件在机器上运行--但我的软件已经成功地部署到其他地方,所以我认为这是一个特定于机器的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64788528

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档