创建失败
给分 必须大于20小于100 系统限制,结贴后在付100分...
------------------------
初衷:
我想要自己完成nc监听的功能,
比如nc -lp 520, 会用重复绑定的方式在本机520端口上绑定一个端口, 这个只接受一个链接, 你可以打开多个nc来监听520端口, 如果第一个nc已经接受到了一个链接, 下一个链接会被拒绝直接链接到第二个打开的nc上问题:
本人使用的是winsock2,
listen(sock,X)
x代表的的是客户端数量, 本人测试的数据
0或1: 会接受两个链接, 第三个链接会被拒绝
-1: 会接受多个链接 我对nc的源代码进行了检查,
他使用的代码是winsock1的库, 他的listen也是1, 不过使用的是wsock32.dll的库
我之后把套接字服务器的代码从winsock2库转换成了wsock32库1.1, 结果依旧... 还是能接受两个!!----------
同样的代码, 不一样的结果
为什么 到底要怎么办 本人代码:
注- 出了里面的printf函数是自己写的, 功能和writeln一样...procedure Listen(Port: integer);
var
Socket: TSocket;
SockAddrIn: TSockAddrIn;
var
wsadata: TWSAData;
SockAddr: TSockAddr;
FReUseAddr: Boolean;
Size: integer;
APeerConnection: TClientSocket;
S: string;
begin
WSAStartup(MakeWord(1, 1), wsadata); Socket := Winsock.Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if Socket = INVALID_SOCKET then Exit; SockAddrIn.sin_family := AF_INET;
SockAddrIn.sin_addr.s_addr := INADDR_ANY;
SockAddrIn.sin_port := hTons(Port); // 端口重绑定 (端口复用) - 默认不开启
FReUseAddr := True;
SetSockOpt(Socket, SOL_S0CKET, SO_REUSEADDR, @FReUseAddr, SizeOf(FReUseAddr)); // 绑定
if Bind(Socket, SockAddrIn, sizeof(SockAddrIn)) = SOCKET_ERROR then
begin
Printf('Bind Error:' + LastError, $C);
Exit;
end; // 核心代码 -1则多, 0,1则有2
if Winsock.listen(Socket, 1) = SOCKET_ERROR then
begin
RaiseLastErrorFmt('listen Error', 'listen');
end; PrintfFmt('NTD Server Listen on Port %d', [Port], $A); Sleep(5000000);winsock listen 数量winsocklisten服务器
给分 必须大于20小于100 系统限制,结贴后在付100分...
------------------------
初衷:
我想要自己完成nc监听的功能,
比如nc -lp 520, 会用重复绑定的方式在本机520端口上绑定一个端口, 这个只接受一个链接, 你可以打开多个nc来监听520端口, 如果第一个nc已经接受到了一个链接, 下一个链接会被拒绝直接链接到第二个打开的nc上问题:
本人使用的是winsock2,
listen(sock,X)
x代表的的是客户端数量, 本人测试的数据
0或1: 会接受两个链接, 第三个链接会被拒绝
-1: 会接受多个链接 我对nc的源代码进行了检查,
他使用的代码是winsock1的库, 他的listen也是1, 不过使用的是wsock32.dll的库
我之后把套接字服务器的代码从winsock2库转换成了wsock32库1.1, 结果依旧... 还是能接受两个!!----------
同样的代码, 不一样的结果
为什么 到底要怎么办 本人代码:
注- 出了里面的printf函数是自己写的, 功能和writeln一样...procedure Listen(Port: integer);
var
Socket: TSocket;
SockAddrIn: TSockAddrIn;
var
wsadata: TWSAData;
SockAddr: TSockAddr;
FReUseAddr: Boolean;
Size: integer;
APeerConnection: TClientSocket;
S: string;
begin
WSAStartup(MakeWord(1, 1), wsadata); Socket := Winsock.Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if Socket = INVALID_SOCKET then Exit; SockAddrIn.sin_family := AF_INET;
SockAddrIn.sin_addr.s_addr := INADDR_ANY;
SockAddrIn.sin_port := hTons(Port); // 端口重绑定 (端口复用) - 默认不开启
FReUseAddr := True;
SetSockOpt(Socket, SOL_S0CKET, SO_REUSEADDR, @FReUseAddr, SizeOf(FReUseAddr)); // 绑定
if Bind(Socket, SockAddrIn, sizeof(SockAddrIn)) = SOCKET_ERROR then
begin
Printf('Bind Error:' + LastError, $C);
Exit;
end; // 核心代码 -1则多, 0,1则有2
if Winsock.listen(Socket, 1) = SOCKET_ERROR then
begin
RaiseLastErrorFmt('listen Error', 'listen');
end; PrintfFmt('NTD Server Listen on Port %d', [Port], $A); Sleep(5000000);winsock listen 数量winsocklisten服务器
解决方案 »
- Oracle 存储过程问题
- 大家回帖时,可用分增加了吗?
- 怎么像二进制文件插入删除固定字节
- 大家老说郁闷,几天升星了,高兴一下,散分200!!!!!!!!!!!!!
- 高分赠高手~~求pardox数据库修复办法。
- 为什么无法改变QR的纸张设置,预览时总是A4界面?
- 请问如何整体清除EDIT筐的TEXT数据
- 谁能讲讲字符串函数中带不带B的有什么区别
- 谁能告诉我?????一个经验性的问题!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- 关于TreeView的子节点动态建立问题?
- Delphi基础Move、Shr、Shl等,帮忙解答这段代码的意思
- EhLIb的dbgrideh表格控件的使用疑问
listen 是指队列中最多有多少的 Client 在那里等待。
-1,和0表示什么不知道。
如果设置成1,表示在同一时刻,有2个Client连接上来。
(由于服务器,没有处理)
所以,只有1个在队列上。
当Accept 1 个后,队列变成空。
另一个Client重连了之后,才会在该队列上又有一个在等待。