mirror of
https://github.com/nim-lang/Nim.git
synced 2026-01-02 11:12:37 +00:00
This change was done to avoid confusion with TCP/IP raw sockets. Native sockets module represents handling native system low level socket API in general and is not just limited anyhow to TCP/IP raw sockets. A stub lib/deprecated/pure/rawsockets.nim module has been added as compatibility layer for old code using rawsockets, so this change will not break existing code.
67 lines
1.7 KiB
Nim
67 lines
1.7 KiB
Nim
discard """
|
|
file: "tasynceverror.nim"
|
|
exitcode: 1
|
|
outputsub: "Error: unhandled exception: Connection reset by peer"
|
|
"""
|
|
|
|
import
|
|
asyncdispatch,
|
|
asyncnet,
|
|
nativesockets,
|
|
os
|
|
|
|
|
|
const
|
|
testHost = "127.0.0.1"
|
|
testPort = Port(17357)
|
|
|
|
|
|
when defined(windows) or defined(nimdoc):
|
|
# TODO: just make it work on Windows for now.
|
|
quit("Error: unhandled exception: Connection reset by peer")
|
|
else:
|
|
proc createListenSocket(host: string, port: Port): TAsyncFD =
|
|
result = newAsyncNativeSocket()
|
|
|
|
SocketHandle(result).setSockOptInt(SOL_SOCKET, SO_REUSEADDR, 1)
|
|
|
|
var aiList = getAddrInfo(host, port, AF_INET)
|
|
if SocketHandle(result).bindAddr(aiList.ai_addr, aiList.ai_addrlen.Socklen) < 0'i32:
|
|
dealloc(aiList)
|
|
raiseOSError(osLastError())
|
|
dealloc(aiList)
|
|
|
|
if SocketHandle(result).listen(1) < 0'i32:
|
|
raiseOSError(osLastError())
|
|
|
|
|
|
proc testAsyncSend() {.async.} =
|
|
var
|
|
ls = createListenSocket(testHost, testPort)
|
|
s = newAsyncSocket()
|
|
|
|
await s.connect(testHost, testPort)
|
|
|
|
var ps = await ls.accept()
|
|
SocketHandle(ls).close()
|
|
|
|
await ps.send("test 1", flags={})
|
|
s.close()
|
|
# This send should raise EPIPE
|
|
await ps.send("test 2", flags={})
|
|
SocketHandle(ps).close()
|
|
|
|
|
|
# The bug was, when the poll function handled EvError for us,
|
|
# our callbacks may never get executed, thus making the event
|
|
# loop block indefinitely. This is a timer to keep everything
|
|
# rolling. 400 ms is an arbitrary value, should be enough though.
|
|
proc timer() {.async.} =
|
|
await sleepAsync(400)
|
|
echo("Timer expired.")
|
|
quit(2)
|
|
|
|
|
|
asyncCheck(testAsyncSend())
|
|
waitFor(timer())
|