OC UNIX WINDOWS
2006
681.3
952
Transporta un sakaru institts
..
OC UNIX WINDOWS: . . : , 2006.
316 .
,
" ", " ", "
",
"
"
.
" ",
.
"
", .
,
UNIX(*NIX) Windows.
.
, . . . .
ISBN 9984-668-56-8
.., 20062003
.........................................................................................................................................................6
1. 1 TCP/IP...............................................................................................................8
2. TCP/IP.............................................................................................................................8
1. .........................................................................................................8
2. ..........................................................................................................11
2. IPv4 (Internet Protocol)........................................................................................12
3. IP-.....................................................................................................................13
4. IPv4.....................................................................................................................20
3. IPv6......................................................................................................................23
5. IPv6......................................................................................................................................25
6. ...........................................................................................................................26
7. .................................................................................................................................28
8. IPv6..........................................................................................................................................28
9. IPv6..........................................................................................................30
10. IPv6...............................................................................................................................31
4. ICMP .......................................................................................................................................32
11. ICMP...................................................................................................................................32
12. ICMP....................................................................................................................................33
13. ICMP ................................................................................................................35
5. IGMP........................................................................................................................................42
14. ...................................................................................................................43
15. IGMP-....................................................................................................................................44
16. ..............................................................................................................................45
17. (queries) (reports) IGMP..........................................................................................45
18. ............................................................................................46
19. ...............................................................................................................................47
20. ............................................................................................................47
21. ..........................................................................................................48
6. ARP...........................................................................................................................................49
22. ARP..............................................................................................................50
7. TCP..........................................................................................................................................53
23. TCP.........................................................................................................................................53
24. ................................................................................................................................54
25. TCP............................................................................57
25.1.1.1. ............................................................................................................................57
25.1.1.2. ..............................................................................................................58
25.1.1.3. ......................................................................................60
25.1.1.4. ...........................................................................................................61
26. TCP...........................................................................................................................62
27. TCP...................................................................................................66
28. .....................................................................................................................67
29. TCP..........................................................................................................................................68
30. .............................................................................70
31. TCP-.............................................................................................................72
32. ............................................................................73
33. TCP .....................................................................73
34. TCP...................................................................................................................75
8. UDP..........................................................................................................................................78
1. 2 ......................................................................................................................81
9. .......................................................................82
10. - .................................................................84
11. ................................................................................................................................85
3
12. .......................................................................................................................85
35. ...................................................................................................................................87
35.1.1.1. . ................................................87
35.1.1.2. .......................................................................................89
13. .................................................................................93
36. connect()...................................................................................................................................93
37. bind() .......................................................................................................................................95
38. listen()......................................................................................................................................97
39. accept().....................................................................................................................................99
40. .............................................................................................100
41. ..................................................................................................103
42. select()....................................................................................................................................105
43. ................................................................................108
44. ......................................................................................................................109
45. ioctl() fcntl() .......................................................................................................................112
46. ...........................................................................................................116
47. ......................................................................................................119
48. ............................................................................124
14. UNIX-like / ...................................................................................128
15. UNIX- ..............................................................................................136
49. inetd......................................................................................................................137
16. .........................................................................................................................137
50. setsockopt()................................................................................................................139
51. getsockopt()................................................................................................................144
52. ...............................................................................................146
17. .......................................................................................................................................148
18. Nagle.....................................................................................................................................149
19. TCP/IP.................................................................................153
SYN 154
-...............................................................................................................................................154
-................................................................................................................................................154
1. 3 Windows Sockets....................................................................................................157
20. ...............................................................................................................................................157
21. -, WinSock..................................................159
22. -, Windows........................................................................162
23. .....................................................................163
24. Windows...................................................................................166
53. Windows-.................................................................................................166
54. WinSock API.......................................................................................................170
55. WinSock API.....................................................................................................174
55.1.1.1. WSAAsyncSelect()........................................................................................................174
55.1.1.2. WSAAsyncGetXByY...........................................................................................183
25. ...........................................................................................184
56. ................................................................................................185
57. WSAGetLastError()....................................................................................................186
58. ................................................................................................................................187
26. TCP- Windows ......................................................................187
59. WinTCP....................................................................................................................................188
60. WinTCP.....................................................................................................................................189
...............................................................................................................................................192
1. 4 Winsock 2.0......................................................................................................236
27. Winsock 2.0 API........................................................................................238
61. WSAAccept()........................................................................................................................239
62. WSAConnect().......................................................................................................................240
63. WSADuplicateSocket()..........................................................................................................240
Shared Sockets............................................................................................................................................241
64. WSAGetQOSByName().........................................................................................................241
4
65. WSAHtonl()...........................................................................................................................242
66. WSAIoctl().............................................................................................................................242
67. WSAJoinLeaf()......................................................................................................................243
68. WSARecv()............................................................................................................................244
69. WSARecvDisconnect()..........................................................................................................244
70. WSARecvFrom()....................................................................................................................245
71. WSASend()............................................................................................................................245
72. WSASendDisconnect()...........................................................................................................246
73. WSASendTo()........................................................................................................................246
74. WSAProviderConfigChange()................................................................................................246
28. API Winsock 2.0...............................................................247
75. WinSock Service Provider .................................................................................................247
76. SPI...................................................................................................................248
29. / Winsock 2.0...................................................................................................257
30. I/O .....................................................................................................285
31. WinSock 2.0.............................................................287
77. API ....................................................................................................................287
77.1.1.1. AcceptEx().....................................................................................................................287
77.1.1.2. ConnectEx(), DisconnectEx().......................................................................................290
77.1.1.3. TransmitFile(), TransmitPackets().................................................................................290
77.1.1.4. WSARecvMsg() ...........................................................................................................292
78. RSVP.........................................................................................292
79. Helper API............................................................................................294
80. ..........................................................................................................................300
1. 5 ............................................................................304
32. NetBIOS..............................................................................................................................304
81. NetBIOS.................................................................................................305
82. NetBIOS..........................................................................................................307
82.1.1.1. NetBIOS-..............................................................307
82.1.1.2. NetBIOS- WinSock..................................311
33. .......................................................................................312
.................................................................................................................................................322
...............................................................................................................................................324
,
, -, ,
. .
1) :
-, ,
.
-, ,
, .
TCP, IP, ICMP .
, NetBIOS.
(Berkeley)
UNIX- API [19], [17], [38], [25], WinSock 1.1, 2.0,
WinSock API WinInet API [39], [36], [2],
/++, MS Visual C++, Delphi . .
Windows.
, TCP/I,
. NetBIOS
.
- -
FTP, HTTP, DNS, SMTP, POP3 IMAP, proxy-,
Firewall , , ,
FlashGet DAP,
Wingate WinRoute, Ping Traceroute,
( CommView NetWatcher),
Traceplus32, tcpdump WinDump, , (update)
(, , Windows Update,) online, , KaZaa, DC++ .
.
2)
( - -).
HTML (
4.0 ), Java, JavaScript, VBscript, XML (Extended Markup Language), SSL, CSS,
CGI . ., HTML ,
Java Development Kit . .
3) -.
CGI,
FastCGI API MS ISAPI, Netscape NSAPI, IBM ICAPI, SSI, ASP ActiveX
.., HTTP 1.1 .
Perl, ,
PHP.
4) ,
, ,
.
6
HTML JavaScript,
-,
. (, ), ,
. . (
) , -
.
5) ,
, - .
X.25, X.400 , .
PPP,
.
(.. .1 )
" ", , .
TCP/IP,
.
IPv4 TCP.
"-".
" ", UNIX,
,
Windows, TLI.
Windows Sockets - WinSock 1.1
WIN32 API.
Windows,
, .
WinSock 2.0
. API Windows
Windows-, Windows 95 Windows Server 2003.
/,
,
. WinSock SPI,
, ,
, Ad-aware .
,
WinSock 2.0, , ..
,
, NetBIOS
.
.
, ( , )
, .
,
" , , ", "
" " "
" ",
, ,
.
lusin@tsi.lv
1. 1 TCP/IP
TCP/IP. ""
,
.
TCP/IP ,
Request for Comment (RFC) [33], [34], [35]. RFC
, .
TCP/IP RFC, RFC .
Transmission Control Protocol/Internet Protocol (TCP/IP)
, .
(Department of Defense, DoD) 25
Arpanet ,
.
TCP/IP (Vinton Cerf) (Robert
Kahn). ARPA
. ARPA
Internet Protocol (IP), TCP/IP
.
- TCP/IP
Berkeley. 4.x BSD System
(Berkeley Software Distribution), BSD Networking Releases.
.
UNIX IP
. ,
.
TCP/IP UNIX, BSD, LINUX
(Windows NT, 9, 2000 ) IBM PC
,
.
TCP/IP :
,
.
TCP/IP, .
intranet-,
WWW.
,
, .
"-".
2.
1.
TCP/IP
,
ISO/OSI (International Standard
. 1.1. TCP/IP
( IV) OSI.
TCP/IP ,
: Ethernet, Token
Ring, FDDI, 100VG-AnyLAN, "-" SLIP
PPP, X.25, frame relay.
, ATM
.
TCP/IP RFC,
IP .
( III) ,
, , . .
( OSI)
IP, ,
, ,
. IP ,
. IP ,
.
,
RIP (Routing Internet
Protocol), ARP RARP ,
ICMP (Internet Control Message Protocol)
IGMP (Internet Group Management Protocol).
( II) .
TCP (Transmission Control Protocol)
UDP (User Datagram Protocol). TCP
9
1
0
. UDP
, IP,
.
, OSI
.
( I) .
TCP/IP
. ,
FTP, Telnet,
SMTP POP3, ,
HTTP, WWW, SOAP,
RPC .
FTP (File Transfer Protocol) .
FTP TCP.
FTP . ,
, ,
. , FTP . ,
,
. FTP-
,
Anonymous. FTP
20 21 ( , ).
-,
.
TCP/IP FTP ,
. ,
FTP, ,
TFTP (Trivial File Transfer Protocol).
,
UDP.
HTTP ,
World Wide (WWW), SOAP (Simple Object Access
Protocol) .
telnet ,
.
. telnet
, ,
, - telnet
, , , Kerberos.
SNMP (Simple Network Management Protocol)
.
.
, , .. SNMP
, .
,
, . SNMP
, ,
,
.
RPC (Remote Procedure Call) ,
,
. ,
Windows DCOM, OM++.
1
1
, ,
, ,
- TCP/IP.
2.
"". , ,
(header) - .1.2 ( TCP).
. 1.2.
..
"" (. . 1.3).
1
2
. 1.3.
, "ICMP" "IGMP",
. .1.1 , IP,
IP. , IP, ,
ICMP IGMP IP-.
"ARP" "RARP". , Ethernet,
Ethernet, IP-.
,
. , Ethernet
, - Internet Protocol (IP) 0x0800;
Address Resolution Protocol (ARP) 0x0806 ..
IP
, .
TCP UDP
(. 1.7.2)
tcpdump. , tcpdump
,
BPF (BSD Packet Filter - ),
UNIX , DLPI (Data Link Provider Interface)
SVR4.
5.
1
3
IP , ().
.
:
IPv9
3.
IP-
.
(messages), TCP (segments), UDP I
(packet) (datagram),
(frame).
IP . (. 1.4):
0
15 16
31
TOS 8
HLEN 4
VERS
16
4-
4
16
DF MF
-13
TTL 8
8
16
IP-
IP-
. 1.4. IP-
4- (32- ) .
32- : 07,
815, 1623 , , 2431. big
endian (big endian ,
, "")
TCP/IP . (network byte order).
1.1.
IBM PC
IBM 370
DEC VAX, PDP
MOTOROLA 68000
PYRAMID
little endian
big endian
X
X
X
X
X
, , , , little
endian (little endian ,
),
. (
) "host byte order" .
4 0100.
00101 (5 , .. 20 ).
01111 60 .
(TOS Type Of Service) 8
0-2
("Precedence") :
111
1
7
/.
1
4
110
101 CRITIC-ECP "Critical and Emergency Call Processing".
, , ,
.
100
011
010
001
000
3-6 :
3 (Delay)
,
4 (Throughput)
,
5 (Reliability)
,
6 (Cost)
.
D,T,R,C.
.
TOS , .
TOS, TOS
.
,
, .
- 16 IP- 65536
, .
IP- ,
IP- , , 576 . 576 ,
. ,
512 64 . IP-
, 576 ( , IP-
).
. (. 1.2.2)
, , ,
MTU.
;
.
"
" MTU, Maximum Transfer Unit ,
. Ethernet 1500 (
1514 ), FDDI 4096, Token Ring 4464 , ATM - 9188 , 296 128
( .25.) SNAP Ethernet_802.3
1492 ( ),
proNET-10 2044 .
MTU=576. . TCP
MSS Maximum Segment Size (. 1.7.1).
MSS, 536. 536+40 (40
TCP IP) 576. MTU IPv4,
MTU, 68 .
PMTU -- Path Maximum Transfer Unit --
-- , ,
, , .
.
DF "Dont Fragment" IP-
. , IP-
,. IP-
. , ICMP1
1
5
" , "
(Fragmentation needed but don't fragment bit set). ,
MTU
MTU (MTU path discovery). ,
, " ,
", " " - "Black Hole".
PMTUBlackHoleDetect
.
MF, , " " (More
Fragments). ,
. (Fragment Offset)
.
, ,
.
TCP ,
TCP , ( IPv6 ).
, , ,
, IPv4 .
TTL (Time-To-Live)
. TTL
1, , ,
. , , (
).
HOP ().
. .
(by default) TTL IP-
. , Windows 9x/NT/2k - TTL=128, Solaris 2.x Intel/Sparc - TTL=255, Solaris 8 Intel/Sparc TTL=64, IRIX 6.x SGI - TTL=60, NetApp OnTap 5.1.2-5.2.2 - TTL=54 32,
64 128 (max=255),
.
TTL=0,
ICMP - 11 1Time Exeeded ( ).
,
. 1.2 . 255
.
1.2
ICMP
IGMP
GGP
"-"
TCP
EGP
""
17
UDP
27
RDP
28
IRTP
29
ISO TP4
ISO 4
80
ISO IP
ISO
89
OSPF
" "
() .
IP , 0.
1
1
6
IP .
IP , .
; , .
. , ,
. ,
( ) .
, .1.5.
0
1-2
3-7
. 1.5.
0 :
1 ;
0 .
: 0 "" 2 " ".
. .1.3 ,
IP; "-" " " , "
". "+" , ,
( ).
1.3. IP
+(11)
( )
1
7
0
LooseSourceRouting ( )
StrictSourceRouting ( )
+(4)
Stream ID.
SATNET ()
Internet Timestamp ( )
" " ,
IP- .
32 .
. "Stream ID" ""
, " " "Internet
Timestamp" traceroute.
,
,
. " " IP-
, , IP- . . 1.6
.
, (7 ).
, IP-,
. , , IP-, ,
.
4- . 9 IP-.
40 , .
0
8
16
24
------------------------------------------| (7)
|
|
|
-------------------------------------------------------|
IP-
|
-------------------------------------------------------|
IP-
|
-------------------------------------------------------|
.......
|
----------------------------------------------------------------------------------------------------. 1.6. IP-
, , ,
(
, ).
. , ,
, , . ,
4- IP- , ,
.
- IP-.
, .
, ,
;
, .
"Loose/Strict Source Routing" ( 0, 3 9
),
.
1
8
, , ,
. ,
Net
IP- Net, , .
,
, ,
, . ,
, ;
.
IP . , Strict Source Routing, IP- . 1.7.
0
8
16
24
-------------------------------------------| (137)
|
|
|
--------------------------------------------------------|
IP-
|
--------------------------------------------------------|
IP-
|
--------------------------------------------------------|
.......
|
-----------------------------------------------------------------------------------------------------. 1.7. IP-,
, ,
.
;
, . ,
Loose Source Routing, IP-.
, IP-,
.
. , ,
, , , .
. ,
. , , ,
. ,
IP-, (
; , ,
) , , .
, A B, M1
M2. "Destination Address" M1,
M2 ( . 1.7 4,
, 11).
M1 , , ,
(M2) "Destination Address", 4,
M2 3,
( M2). M2
, B ,
4. ,
(12) , .
,
,
.
1
1
9
0
8
16
24
31
---------------------------------------------------------| (68)
|
|
| | |
---------------------------------------------------------|
IP-
|
---------------------------------------------------------|
|
---------------------------------------------------------|
.......
|
---------------------------------------------------------. 1.8. . ,
( ). 4-
() ,
- ( -40 ). 4-
, .
(.1.9) :
0
1
3
, IP-
IP- (, . 1.8)
IP- , ,
IP- IP- .
. 1.9.
, ,
. ,
,
. , ,
, ,
; , . , ,
.
, ,
IP- ,
. , IP-
.
, , .
.
.
, "Loose/StrictSourceRouting"
() .
"Destination Address"
,
,
2
0
.
IP- .
, (20 ),
.
IP-, ,
.
? IP . , ,
, ,
.
, . ,
, .
32- .
{127.x.x.x, <ANY>} " , loopback" RFC-1112
, localhost.
4.
IPv4
,
, " " MTU
(Maximum Transfer Unit). ,
, .
. ,
MTU . ,
MTU , MTU .
IP
. , . " ", ,
, IP , - ,
IP- .
, IP
. .
. ,
Windows-,
(breaking point), IP MTU
. , .
() .
IP- " "
IP-. , IP-
.
MTU. . 1.4
IP-. , 16
, .
,
65535 .
IP-, , 1 65536 ( 0 65535).
, ,
0 8191, 8192 .
8 , . , 1
, 2 . .
65528 (8191*8).
2
1
65528 :
65528 7 65535 ( ).
. IP ()
. , IP, .
"
" IP- , . "" ,
( , ). "-" ,
, IP ,
.
. MTU=128, 730 . ,
- 128 , 12820=108 . 108 8,
8- . , - 104. :
730=7*104+2. , 7 20+104=124
- 20+2=22 - 8 . ,
( ), .
UNIX .
104 6 , 6*104=624
. 6- , 106 .
20 , 7- 126 (, 124),
MTU. , 8-
. Windows- 8 , UNIX 7!
,
(
,
, DoS) .
IP- IP- , IP , :
1. IP- ;
2. ( ) IP- IP;
3. IP- .
. IP
IP- , ,
.
C IP-
( UNIX- , , 30 ).
. IP-,
. , , IP
.
- . ,
, IP-.
"-", , IP
.
, IP
. IP ,
.
, .
. -,
. -
. ,
2
2
2
. -, ,
, , , .
: , .
TCP MTU, 576 ,
. .
512 TCP IP- .
MTU, ,
.
TCP/IP-,
, , , MTU
, .
, .
, , .
, .
more-fragments . (
) , .
, .
. ,
, ,
" " "" ,
. , IP- (,
)
.
N , 8
(64 ). + MTU ,
.
8- . NFB (
).
,
. "more fragments" 1.
,
. "more fragments" ,
.
6 NFB.
N .
. IP-
IP- 9876 300 (
DF 0). IP-
, MTU 128 .
IP- IP-.
IP-
|
(300 )
IP-
1 | 1 104
IP-
2| 2
104
IP- 3
3 | 92
IP- 1 :
1.
2.
9876;
5 ( );
2
2
3
3.
124 ();
4. MF
1;
5. 0 ( ).
IP- 2 :
1.
9876;
2.
5 ( );
3.
124 ();
4. MF
1;
5. 13 ( ).
IP- 3 :
1.
2.
3.
4.
5.
MF
9876;
5 ( );
112 ();
0;
26 ( ).
, ,
IP- ( ) 8.
104 (13 ), 108,
128 (128 20 = 108, 20 ).
, IP - IP-,
- RFC-791:
, , .
,
.
, "more fragments" ,
, " ".
3. IPv6
IPv6.
, IPv4.
, TCP/IP 1970- -
1980
, IP, TCP, UDP ICMP, .
,
TCP/IP .
, TCP/IP
( , )
.
, .
TCP/IP,
. 1997 Microsoft Corp.
TCP/IP Windows NT,
, [11].
, -
TCP/IP, .
.
, 100 ,
1000 .
.
2
4
intranet
TCP/IP, ,
, .
,
.
.
, , frame relay ATM,
.
,
(, Ethernet). ,
,
IP.
.
90- ,
30 , 95-
.
,
IP-. IPv4- 32 . ,
, ,
IP-, IP-
. , 1981 200 ,
2000 - 75 .
IPv4.
IPv4.
( A, B, C, D E),
. 16777214 , 65534 ,
254 . - ,
- .
, , 16 . ( ),
254 ( ).
16 384 .
A, B C
" " IP-. IP-
32- , ( ),
: , ,
, , , .
IPv4
- NAT (Network Address Translation),
. " "
10.0.0.0 10.255.255.255, - 172.16.0.0 172.31.0.0 -
192.168.0.0 192.168.255.0 - ,
NAT-,
, IP-.
,
2005-6 . :
" , "Fake -" , -".
IPv4- RFC3330 http://www.iana.org/assignments/ipv4-address-space.
IPv4- ,
,
,
.
2
5
IPv4 , (QoS
Quality of Service), , ,
, ,
(
).
, IPv4,
[11]:
;
;
;
IP-;
IPv4;
;
;
;
.
IETF - Internet Engineering Task Force - 90 . 1995
RFC-1752 The Recommendation for IP Next Generation Protocol.
IP Next Generation (IPng).
, RFC-1883, Internet Protocol version
6 (IPv6).
IPv6:
IP-.
. IPv6 128 ,
296 , IPv4.
.
Iv6- . ,
( 40 IPv6 20 IPv4),
(8 12).
IPv6 (CRC). , ,
, .
,
.
, IP-.
IP-, ,
.
IPv6 . NDP
(Neighbor Discovery Protocol - )
IPv4 ARP ICMP, .
ARP- ,
,
, Ethernet.
5.
IPv6
IPv6 IPv4.
IPv6 : 128 16 .
: 340 282 366 920 938 463 463 374 607 431 762
211 456 1015 . IP-
IP-. , IPv6
DHCPv6,
, . IPv4,
NAT-, IP-,
IP-.
2
2
6
, .
( ) IPv6 5 ,
, , :
, 6 , ,
- ( IPX),
.
2.
IPv6 ,
, -
IP-, .
,
,
.
, ,
. .
, IPv4
OSPF, RIP-2, BGP4. ,
IPv6.
CIDR Classless InterDomain Routing.
CIDR , , .
. ,
, 100 , 3 5-6
.
, .
CIDR
IPv4. , 254 65
534 . ,
, , ,
, . -
,
.
IPv6 IPv6-: (unicast), (multicast)
(anycast). Unicast .
- (point-to-point). Multicast
. ,
, ,
. anycast ,
.
IPv6 8 16- ,
0123:4567:89AB:CDEF:0123:4567:89AB:CDEF.
. , IPv6,
IPv6-.
.
6.
. 1.10 IPv6.
128 . IPv6 aggregatable
global unicast addresses .
, (
) .
6 , IPv6- .
2
2
7
. 1.10. IPv6
,
. ,
.
IP-, IPv4.
( , link-local,
1111111010),
, ( , site-local,
1111111011), .
.
IPv6 , IPv4. . 1.11
IP- 128 . 8 1.
(Flags) 4 , 0.
, , 0.
11111111
. 1.11 . IPv6
, .
(Scope) 4 ,
. . 1.4.
1.4.
34
67
2
8
F
IPv6 (anycast).
, (
) .
, ,
, , .
,
. IPv6
(Source Routing),
- .
. ,
- Source Routing,
unicast, anycast,
.
anycast unicast.
. ,
, anycast.
7.
IPv4, IPv6 , .
0.0.0.0.0.0.0.0 , .
.
0.0.0.0.0.0.0.1 (loopack, ).
.
, , .
8.
IPv6
IPv4, IPv6 (. 1.12).
(Version) 4 6, IP.
(Priority) 4 IP IP- . 0 7
, .
. 1.5.
2
9
. 1.12. IPv6
1.5.
(, )
(, )
(, HTTP FTP)
(, Telnet)
(, )
8 15 , ,
, .
, , ,
8, 15, , ,
, .
(Flow label) 24
. ,
.
().
, , ,
.
, ,
.
(Payload length) IPv4, 16
IP-, .
. IPv4, ,
IPv6- 65575 .
(Next header) 8 ,
IPv6-.
, IPv6-. , IPv4.
( limit) 8 ,
IP-.
IPv4 (TTL) IPv6
(Hop Limit). IPv4 TTL
, .
, .
. IPv4 TTL
( - ).
- ,
, TTL .
TTL
128- IP- .
, IPv6- ,
. ,
IPv6- ,
. ,
2
3
0
IP-
.
- Payload (data). , , ,
.
9.
IPv6
IPv6 IPv6-
(. . 1.13). (Next header)
.
, .
TCP
IPv6
=TCP
IPv6
=
=TCP
IPv6
=
TCP
TCP
=TCP
. 1.13. IPv6
IPv6 .
. 1.13 : Next Header ,
TCP. Next Header ,
, ,
TCP. Next Header
, . ,
.
(Hop by Hop Options Header)
( )
. ,
64 ( Jumbo Payload).
(Routing Header)
, IPv4.
, . IPv4
. IPv6 ,
.
8- (Fragment Header) ,
. ,
TCP/IPv4,
, ,
MTU. , IPv6 MTU,
MTU . MTU
, IPv6 IPv4,
- , .
.
IP Security
. IPv6, Iv4-. ( ,
IPv4, .)
3
1
ESP-
IPSec. , IPv6,
IPv4.
(Authentication Header, )
( , IP- ,
) , , IP-
. AH
. AH
, ,
. ,
, IP-
.
MD5.
AH -
,
. ,
.
"" IP-. IPv6
, ,
" ".
ESP- (Encapsulated Security Payload, ESP)
: , .
, , ESP-
, . ESP-
, , , DES
. ESP-. ESP-:
(tunneling) IP- (transport)
, , TCP.
(Destination Options) . ,
. , Iv6-,
.
:
( )
;
(
Destination Options,
);
,
IPv6;
, Hop-by-Hop Options,
;
. , ,
.
40 IPv6.
10.
IPv6
32- IPv4
3
2
. 1.14. IPv4- IPv6
, IPv4, (tunneling),
( ) .
IPv6- Iv4. ,
Iv6- , Iv4,
. Iv4-
.
(. 1.15) IPv6-agpeco, IPv4 (IPv4-mapped
Iv6 address). , IPv4.
, ,
, , ,
, IPv6.
6bone, Sprint.
IPv6 100 ,
IPv6. 6bone
41 , , .
6Bone .
WorldCom
VBSN.
IPv6 ATM. 2000
6bone, 6INIT. EU Fifth Framework.
-, IPv6.
4.
ICMP
IP-
.
TCP/IP - .
, , , ,
(Internet Control Message
Protocol, ICMPv4), IPv4.
IPv6 ICMPv6.
3- - ICMPv4, IGMP ARP.
ICMP ,
. ,
, TCP UDP, I.
, ,
, I, RAW SOCKET (. 2.10).
, .
, , I
I (. 3.)
11.
ICMP
TCP/IP IP : I
(IGMP). I, , TCP UDP,
3
3
3
ICMP
ICMP , -
. ICMP
.
, ICMP . , -
- . ,
ICMP-, -
. , .
ICMP , "" ,
-. - ,
, - .
IP- .
.
, ,
,
. , ,
- .
-.
TCP/IP ,
,
. , , ,
.
, , ICMP
- . ICMP IP,
3
3
4
-
, ICMP -
. , ICMP- IP-
. -
IP- 64 ( ) .
, - .
-
. - ICMP
. ICMPv6
ICMPv4.
ICMP
TCP/IP , ,
ICMP-. , - ICMP
.
. ., ,
ICMP-
ICMP-. IP-
. ,
, ICMP-
(broadcast storm).
ICMP- , ,
, IP- ICMP-,
. , ,
. IP- ,
ICMP- .
ICMP-
ICMP - . TCP/IP ICMP IP-. ICMP- : 8 Type 8- Code.
ICMP-.
. 1.16. ICMP
3
5
13.
0
3
4
5
8
9
10
11
12
13
14
15
16
17
18
(echo reply)
(destination unreachable)
(source quench)
(redirect)
(echo request)
(router advertisement)
(router solicitation)
(time exceeded)
(parameter problem)
- (timestamp request)
- (timestamp reply)
() (information request)
() (information reply)
(address mask request)
(address mask reply)
ICMP
. 1.5, ICMP ,
. .
, 3, " ", 16 "".
" "
ICMP ,
. ,
3 -.
ICMP, "
" (destination unreachable) . (015)
" " 1.7.
1.7. ICMP " " ( 3)
(network unreachable)
(host unreachable)
(protocol unreachable)
(port unreachable)
3
6
8
10
11
12
13
14
15
IP . IP
, , . 1.6 ,
, . , ,
, , ,
.
. 1.17.
,
IP-. ,
"", , .
.
. ,
.
, ,
. ,
ICMP
.
, , ICMP - . . 1.18
.
3
7
. 1.18. ICMP-
- ,
, IP- ICMP-. ,
ICMP- , ICMP-
IP- ( ) IP- ( 32-
ICMP-). IP- ,
, IP- , .
. 1.8 ( 5).
1.8. ICMP- "" ( 5)
( )
(TOS)
(TOS)
, ,
" " (TOS) IP- . TOS
. IP-, . 4.5.2,
ICMP ,
, . ICMP
. ,
, . ,
, ICMP-co .
. , ,
.
.
ICMP, Redirect .
(code 0) Redirect datagrams for the Network
; default ; . (code 1) ; Redirect datagrams for the
Host
. IP ; ,
( Destination IP ;
), IP ; , ,
( Gateway).
, IP ; ;
!
ICMP ; . , ICMP ,
Redirect datagrams for the Network
3
8
,
. , ,
. IP-
TTL, .
1.9. ICMP- " " ( 11)
TTL
. ,
. , , .
ICMP- 11 1-Time Exeeded ( ).
" "
Parameter Problem (
), .
I-, 1.11.
1.11. ICMP- " " ( 12)
IP-
1 ,
TCP/IP ().
" IP-" ,
. . 1.19 ICMP "
". (pointer) ,
ICMP-. 1 (" ")
.
" "
,
, , .. ,
. TCP
. , ,
. IP ,
.
,
"" , - ICMP-co
" " ( 4). " " (Source Quench
, ) -
3
3
9
. , "
" IP.
ICMP-co.
, .
ICMP- " ",
. ICMP-
, . ,
. ICMP " " ,
" ", 4.
" " ,
0 .
source quench " ".
, ,
. UNIX-
TCP/IP ICMP- . TCP-,
, " ".
UDP- ,
/ .
RFC-1812 , .
- ICMP
, I -,
, , . .
, .
" "
. ,
, ICMP
.
ICMP : " "
Router Solicitation ( 9) " " - Router Advertisement ( 10).
- (,
), ,
. " " , . ICMP " " ICMP-, .
, - ,
. -
, .
4
0
. 1.20.
. 1.20 . "
" " ",
" " IP- .
. 1.20, ICMP- ,
IP. " " ICMP-
, .
" " 32- .
. , (32-
32- ). " " ,
. TTL IP! ICMP-
. , , 450 600 ,
" " 30 . "
"
.
" "
" "- TimeStamp - ( 13 14)
. . 1.21
.
(13 14)
(0)
, :
. -
. ICMP .
4
4
1
" " , . ,
. -
" ", . ,
- " " ,
. " " ,
,
.
""
ICMP- "" Echo Request Echo reply ,
. ICMP- " ",
" " , ,
. - "" ICMP,
, Ping (Packet INternet Grouper). ,
Ping - "",
. , ,
( , TCP/IP ICMP-)
. . 1.22 - "".
, ,
.
(8 0)
(0)
. 1.22. ""
-
(InterNIC) ,
.
. .
IP- ,
. , IP. RARP - IP- .
, IP- .
4
4
2
C RARP- IP-
, . ,
ICMP- 17 ( .
1.23) 18.
ICMP-
, .
.
(BOOTP - Bootstrap Protocol)
TFTP, UDP 67 68 .
5. IGMP
IP- (unicast), (broadcast) (multicast).
.
,
.
- -
.
,
, .
, unicast,
, .
,
.
( )
, , .
( )
.
"" .
,
, online-, - ,
..
( , .).
TCP. UDP
: , .. ,
,
, .
(IGMP Internet Group
Management (Membership) Protocol), ,
.
,
. , (
)
4
4
3
,
.
, ,
.
, IP- .
. - ,
, , ,
.
IGMP 2 RFC-2236. IGMP
, .
DVMRP (Distance Vector Multicast Routing Protocol),
MOSPF (Multicast OSPF), PIM
(Protocol-Independent Multicast) . ,
FreeBSD mrouted multicasting route daemon DVMRP.
14.
" ". IP- IP- A, B, C
D, . . [6].
(.1.25) -, ..
, . -
IP-
.
. IPv4- D '1110'.
28- .
. 1.24 IPv4
- IP- 224.0.0.0
239.255.255.255. , ,
IP-. " " , 32- ,
23- "" . ,
, IP- "" .
OSI - (DataLink Layer) (Network Layer). , ,
Ethernet FDDI, , .
IP- ,
.
IP-
Ethernet-.
IP-, 224.0.0.0 239.255.255.255,
(. 1.25) MAC-,
Ethernet-, 001-00-5E.
4
4
01
00
5E
. 1.25
,
. IP ,
Ethernet- . ,
, IP_ADD_MEMBERSHIP (.
2.9) , MAC, .
. , ,
() .
, , ,
, .
(DVMRP, MOSPF, PIM),
.
(IGMP)
ICMP, IGMP IP-. ICMP, IGMP
IP-. , , IGMP
, . . 1.26 IGMP IP.
IGMP-
. 1.27 8- IGMPv1 (RFC-1112, 1992 .)
. 1.27. IGMPv1
4
5
. 1.28. IGMPv2
IGMPv2 -:
0x11 = - Membership Query.
:
- , , ,
.
- - , , ,
.
IP- ,
.
0x16 = 2 .
0x17 = .
, IGMPv1:
0x12 = 1 .
8-15 Membership Query ( )
Max Response Time (8 ) .
- .
16.
,
( ,
.)
, .
, .
, .
, - API .
"", .
.
.
, , ,
, . IP,
Berkeley UNIX, API .
17.
IGMP- ,
, .
. IGMP-, .
,
, , .
, .
4
4
6
1. , ,
. , , ,
( ), .
2. IGMP- (. ),
, - - .
.
0,
, .
3. IGMP- IGMP- ,
.
,
,
. , ,
( )
, ,
.
. 1.29 IGMP-: , , ,
. ,
,
.
. 1.29. IGMP
IGMP ,
, , UDP.
18.
224.0.0.1 " " Membership Query "Group Address".
; ,
, 125 . ,
. - Membership Report,
, . "Max Response Time"
Membership Query , Membership
Report ( 10 .)
: , ,
.
Membership Report ,
"Group Address". , ,
, .
,
.
Membership Report, .
4
7
, ,
. (
260 .), , .
, Leave Group
224.0.0.2 (" "); , ,
"Group Address". , Membership
Query . Leave Group,
Membership Query . ,
"Max Response Time" ( 1 .),
Membership Report, ,
. 2 .
, IGMP,
IP- ( ,
Membership Query IP- , ,
IGMP). .
, , IGMP
, , IP,
.
19.
224.0.0.0 238.255.255.255
. 239...
.
224.0.0.0 224.0.0.255 ,
, .
, TTL.
,
.
224.0.0.1 . 1.29 , IGMP- IP-
224.0.0.1. (all-hosts).
,
.
, ,
4
4
8
. (
). "" ,
.
224.0.0.2 (all-routers).
.
224.0.0.4
DVMRP,
.
224.0.0.5 224.0.0.5 OSPF.
224.0.0.6 OSPF-.
224.0.0.9 RIP-2.
224.0.0.10 IGRP-.
224.0.1.1 NTP
PIM ..
:
224.0.0.3 .
Multicast RFC-1112,
, .
0 " IP-".
,
IPv4 ( IPv6). :
, .
1 " , IP-".
, .
IP-, " 0" " 1".
2 " IP-".
.
.
, TCP/IP (IGMP).
. 2.9.3.
21.
1992
- Multicast Backbone
(MBONE). IETF,
-
.
MBONE ,
,
, . 1996 MBONE
2800 . , ,
, , MBONE, .
MBONE , ,
.
,
.
IP-,
4
9
IP-.
MBONE DVMRP.
MBONE
UDP.
SAP (Session Announcement Protocol) SDP
(Session Description Protocol). , SAP/SDP
[19].
, IGMP
,
.
UDP.
,
.
- , ,
, .
.
Flooding, Spanning Tree, Reverse Path Broadcasting, Truncated Reverse Path Broadcasting,
Reverse Path Multicasting, Core-Based Tree.
, DVMRP, MOSPF, PIM[5].
,
.
,
, , .
,
,
.
6. ARP
,
ARP
Address Resolution Protocol. . 1.30 - -,
WinDump.
1- 4-, ARP-, .
- .
. 1.30. - -
5
0
ARP
, - ""
. Ethernet- [1], Token-Ring, FDDI, ATM .. ..
MAC, .
MAC- MAC-. MAC-
Ethernet-, .
Ethernet- IP-? ARP, ,
IP- Ethernet-.
IP-, IP, Ethernet
.
, "",
ARP-. ARP-
. IP- Ethernet-.
IP- Ethernet- IP-.
. 1.31 ARP :
IP address
223.1.2.1
223.1.2.3
223.1.2.4
Ethernet address
08-00-39-00-2F-C3
08-00-5A-21-A7-22
08-00-10-99-AC-54
. 1.31. ARP
6- Ethernet- 16- (
) .
ARP- , IP- Ethernet- ,
. IP- ,
. IP-
. , Ethernet- . (), Ethernet-.
.
, TELNET,
TCP, TCP- TCP IP-.
IP- , TCP IP-.
IP- Ethernet,
Ethernet- ( ) .
, .
ARP- "/" ARP.
ARP ?
" , ... ". ARP-
, :
5
5
1
. 1.32. ARP-
ARP IP- ,
IP-, Ethernet-.
ARP- ", IP- ,
MAC-." ARP- "/"
(. 1.33):
. 1.33. ARP-
-. Ethernet
Type Ethernet- ARP- ARP-. ARP ARP- IP- ARP-.
(. 1.34) :
. 1.34. ARP-
ARP :
5
5
2
1.
2.
3.
4.
ARP- .
IP- .
ARP- IP-to-Ethernet ARP-.
IP- ARP-,
IP- Ethernet-.
5. Ethernet- IP- .
ARP-
ARP-, .
- , ARP-,
. IP , .
.
Ethernet . . 1.35
( ), , ,
Ethernet. ,
. (
"raw formats") Ethernet_II Ethernet_802.3,
. 4 ,
Ethernet_II, ""
, :
Internet Protocol (IP) 0x0800;
Address Resolution Protocol (ARP) 0x0806;
AppleTalk 0x809B;
Xerox Network System (XNS) 0x0600;
NetWare IPX/SPX 0x8137.
. 1.35. Ethernet
5
3
(
) ARP .
, IP ARP .
, .
ARP .
, ARP .
,
ARP . ,
.
7.
TCP
TCP
TCP . ,
TCP ,
. , "
". TCP. ""
"" ,
. 0, 3, 125 599 , .
TCP ,
( " ") ( PSH . 1.7.4
1). TCP,
, .
, , ,
MSS (Maximum
Segment Size), . ,
IPv4- ,
IPv45
5
4
(Well Known Numbers, Assigned Numbers - . ). ,
, . ,
, UNIX
(magic numbers).
TCP/IP
. UNIX-
/etc/protocols RFC-1340 Assigned Numbers.
/etc/protocols:
# Internet (IP) protocols
# from: @(#)protocols
# Updated for FreeBSD based on RFC 1340, Assigned Numbers (July 1992).
ip
icmp
igmp
ggp
ipencap
st
tcp
egp
pup
udp
hmp
xns-idp
rdp
iso-tp4
xtp
idpr-cmtp
rsvp
vmtp
ospf
ipip
encap
..
0
1
2
3
4
5
6
8
12
17
20
22
27
29
36
39
46
81
89
94
98
IP
ICMP
IGMP
GGP
IP-ENCAP
ST
TCP
EGP
PUP
UDP
HMP
XNS-IDP
RDP
ISO-TP4
XTP
IDPR-CMTP
RSVP
VMTP
OSPFIGP
IPIP
ENCAP
protocols,
. 5,
http://compnetworking.about.com/library/ports/blports_glossary10.htm.
,
.
, TCP UDP.
WKS (Well Known Services) .
5
5
5
: , FTP,
World Wide Web ..
/etc/services. ,
.
/etc/services:
tcpmux
1/tcp
echo
7/tcp
echo
7/udp
...
ftp
21/tcp
# 22 unassigned
telnet
23/tcp
# 24 private
smtp
25/tcp
# 26 unassigned
time
37/tcp
time
37/udp
rlp
39/udp
whois
43/tcp
domain
53/tcp
domain
53/udp
bootps
67/tcp
bootps
67/udp
bootpc
68/tcp
bootpc
68/udp
tftp
69/udp
gopher
70/tcp
gopher
70/udp
finger
79/tcp
www
80/tcp
www
80/udp
..
mail
timeserver
timeserver
resource
# resource location
nicname
nameserver # name-domain server
nameserver
# BOOTP server
# BOOTP client
# Internet Gopher
http # WorldWideWeb HTTP
# HyperText Transfer Protocol
5
6
. 1.36.
TCP/IP .
, WKS Well Known Services
( - ephemeral - -
.)
, ,
, ,
( UNIX d
daemon , httpd).
TCP UDP ,
WKS. HTTP
, , ,
.
(. 1.37). .
, - (Source) 8080, WKS
(-) 80 (Destination). SYN ACK 1.7.4.
, , WKS,
, , WKS. ,
WKS,
. (IP-, ) (
""). , , http- ,
, 144.206.130.137:80, , , 144.206.130.138:8080.
5 Well Known Numbers -
.
. 1.37.
5
7
UDP 69 , Lovesan
tftp get, .
DNS 53 (. - 4). ,
TCP/IP, 0
1023.
( - Internet Assigned Numbers Authority (IANA).)
1992 1 255.
256 1023 UNIX- .
UNIX-, .
IANA 0 1023.
- UNIX-
Telnet rlogin.
. Telnet TCP/IP
23. .
rlogin, , UNIX ( -UNIX
).
80- 513.
BSD- TCP/IP
1024 5000. 5000
( ). , Amerika Online
5190,5191,5192, ,
BSD- TCP/IP.
Solaris 2.2 . , TCP
UDP 32768.
UNIX- .
.
0 1023 (, rlogin,
rsh) -.
,
, :
0-1023 ,
1024-49151-
49152-65535 () .
IANA
http://www.iana.org/assignments/port-numbers, .
, TracePlus/Ethernet ,
, IANA.
.
, . ,
, , .
RFC 147 - The Definition of a Socket, 7 May 1971 - .
25.
TCP
25.1.1.1.
TCP ,
( ) .
TCP
(sliding window). , ,
,
5
5
8
,
TCP.
,
TCP ( TCP
NACK). ,
, , .
(, TCP 1 ACK . 1.7.4),
, .
W, N,
, N+W.
,
.
" "
. :
"" ,
TCP- TCP-, .
, ,
TCP-. TCP-
() (). Receive Window,
- Send Window.
, TCP , ,
RCV.NXT RCV.NXT+RCV.WND-1 (. 1.7.8), ,
. ,
, .
, -
1/2-32 .
TCP,
TC- -
- ( acknowledgement).
.
TCP- , .
, . RWIN
RWIN=n*MSS, n=2,4,8 10, MSS=MTU-40, 40
( ) TCP IPv4. ,
, .
,
.
4.2BSD by default () 2048
. 4.3BSD 4096 . SunOS 4.1.3, BSD/386, SVR4
4096 . , Solaris 2.2,
4.4BSD, AIX 3.2, , 8192
16384 .
API
. .
25.1.1.2.
,
( ).
""
, , :
5
9
.
, TCP.
,
, ,
. ,
,
, .
: "".
, , ,
( )
( ). .1.38 ,
, ,
.
. 1.38.
, ,
. ,
, . . 1.39
N .
, ,
, 1 N. 1
N-1 1.
1 , ,
- 1 ( )
(
TCP .)
6
0
. 1.39. ""
- , N ,
. (sliding window)
() , ,
.
,
.
,
.
, RFC-793 TCP ,
. RFC 5 :
(ACK) ;
(Delayed ACK); 500 ms
. , ACK ;
() (ummulative ACK),
ACK n ACK
k < n;
(Negative ACK), ,
; ;
() (Selective ACK, SACK), ,
, ().
:
TCP (Delayed ACK),
. " ACK" ,
TCP ACK ,
"ACK-", .
25.1.1.3.
(.1.40) ,
4 , 4 , 4-
, :
() - 1,2,3,5,6,7,8 (4- );
ACK 1,2,3,3,3,3,3 ( 1,2,3);
4 ( ) ACK 8;
6
1
.1.40
. ACK ( 200 ),
: -, , -, 200
, ACK- ACKs piggybacking.
,
,
.
, TCP ,
. TCP.
.
PUSH .
25.1.1.4.
, . ,
.
, - .
"" TCP,
, , .
, .
.
"" ( URG TCP- 1).
6
6
2
,
.
1.7.6 2.9.1.
-
. ,
, , ACK-, . ,
TCP
. , TCP
RST URG .
- ,
(. TCP).
,
.
26.
TCP
TCP .
. 1.41. TCP
(SOURCE PORT) 2 , -;
(DESTINATION PORT) 2 , ;
(SEQUENCE NUMBER) 4 , ,
; TCP
PAWS
;
(ACKNOWLEDGEMENT NUMBER) 4 ,
, ;
;
(Data Offset) 4 , TCP,
32- .
, OPTIONS;
6
6
3
(RESERVED) 6 , ;
(CODE BITS) 6 ,
, :
URG () .
ACK . -,
- ( ). ,
,
TCP, .
.
:
ACK=1 , .
TCP ( ACK, ).
PSH ;
:
PUSH- TCP-.
TCP-,
. , PUSH-,
, TCP -.
TCP ,
TCP-, PUSH . ,
, , PUSH .
TCP- , , ,
TCP , , .
, TCP- PUSH-, ,
.
, , API TCP- ,
PUSH , PUSH- .
PUSH- , TCP ,
. Berkeley PUSH-,
"" . PUSH-
write() , .
Berkeley PUSH-,
.
RST . (
), ,
- . ,
,
, ,
. RST
RST.
, SYN_SENT (. ),
(RST) SEQ.
, .
SYN_SENT ( RST
SYN), RST , ACK
SYN. RST ,
. ()
LISTEN, .
SYN_RECEIVED, LISTEN.
CLOSED.
- ,
CLOSED, .
"" (reset) TCP ,
,
.
6
6
4
SYN ,
; , , SYN;
FIN
.
:
,
. RFC-1025 ,
(SYN, URG, PSH, FIN 1 ), "" (
, - " ", "
" ..).
(WINDOW) 2 ,
; ,
IP-TTL, .
Window TCP- . ,
AIX - , Window=0x3F25. TCP/IP Windows
NT5, OpenBSD FreeBSD, Window=0x402E;
(CHECKSUM) 2 , .
/ ,
8 16- . (0)
.
0;
(URGENT POINTER) 2 ,
URG, , ,
;
(OPTIONS) ;
, ,
; SYN ACK+SYN (
TCP . .)
(PADDING) ,
, 32- ;
.
SYN.
() TCP,
SYN
TCP- , , .
,
. .
(firewall),
(incoming) SYN- ,
-.
SYN- (, )
, "-" .
- ,
, TCP- "" , .
, TCP- SYN-,
SYN- ACK ()
-
. TCP- SYN-
, ACK- !
TCP
6
6
5
TCP .
, TCP RFC-793,
, (nop) MSS.
.1.42.
. 1.42. TCP
1 , .
0 1 .
, .
NOP " " ,
, 4 . , TCP
4.4BSD, tcpdump TCP SYN:
<mss 512, nop, wscale 0, nop, nop, timestamp 146647, 0>
MSS
MSS,
. MSS SYN-.
MSS , 536 ,
( IPv4)
576 .
wscale TCP 16 32 .
TCP- ,
16- , 16-
. TCP "" 32- .
1- 0 ( ) 14.
14 1.073.725.440 (65535 * 2 14).
SYN; ,
.
, SYN.
, , SYN-,
, , ,
6
6
6
SYN-.
.
, ,
, ,
0.
, .
Host Requirements RFC , TCP
. ( , ,
SYN.) , TCP
, . ,
.
,
S R . 16
, , R ,
. ,
, 32- , S
(16- ) TCP-.
(timestamp)
. ,
RTT (Round Trip Time, ) ACK.
( " ACK", " ", TCP
ACK.)
RTT , , 8
. , , RTT.
,
. , ,
SYN-. SYN- ,
.
Sack-Permitted (SACK ). 4.
SYN-.
SACK. 5 .
.1.42 .
Windows , Win98SE.
27.
TCP
.
,
. , TCP-
6
6
7
.
( ), ,
. TCP
URG Urgent Pointer, ,
. ,
Out Of Band OOB. , [19]
, 2.9.1.1,
" " , . ,
" " "
", , .
URG ,
. , ,
( , ..)
? ,
.
, . ,
, .
[19]. ,
FTP, telnet rlogin.
28.
TCP
.
. TCP.
, , ..
, . ,
, ,
.
, ,
TCP , ( ).
, .
, N ,
.
.
, ,
.
, , , .
0 2**32-1.
TCP , ,
.
. TCP
. ( TCP IP .)
- -. ,
(. 2.4). - .
.
TCP IP, IPv4-.
- TCP. - -,
IP- .
TCP. TCP -
.
6
8
- ( I-), TCP-
- , , .
(
), ,
. .
29.
TCP
,
. ,
. , TCP
, .
TCP , .
,
, . TCP
, .
, .
(Retransmission TimeOut, RTO).
. , ,
. ,
, .
(-) ,
TCP.
- ,
, .
, ,
"" .
-
, . TCP -
.
(
RTT, Round Trip Time),
RTO. RTT
, .
. - ,
. ,
2. -
.
TCP ,
. ,
. TCP
[7] .
" ". .
. ,
.
. ,
,
. ,
.
6
6
9
. .
,
. -
.
,
( , ). - ,
,
, .
, .
.
, .
(quiet timer) TIME_WAIT (. 1.7.13),
, ;
,
IP . 2MSL
TCP- Maximum Segment Lifetime.
RFC-793, MSL 2 ., TIME_WAIT 4
. . , , BSD, MSL 30 .,
TIME_WAIT 1 .
30 . 2 . , TIME_WAIT,
, 2MSL .
, , 2MSL, ,
2MSL
, 2MSL
.
,
, ,
, .
, TCP
.
, RFC-793 , TCP
MSL .
" " (quiet time).
, MSL.
( IP-).
.
(persistence timer) ,
, ,
, .
, ,
. , ,
, , .
, . , - ,
, , .
. 60 .
TCP- " " (
- 5 .)
7
0
. , TCP
"". , , ,
, , ,
( ) . ,
- - .
- , ,
, . -
TCP- ,
. " " (NOP),
. , TCP/IP.
(keep-alive).
(keep-alive timer) ,
(idle timer) .
.
, ,
5 45 . 360
.
Windows 4.1.6.
30.
TCP .
(Transmission Control Block, ),
, ,
.
.
.
,
. 1.9.
1.9.
SND.UNA
Send Unacknowledged
SND.NXT
Send Next
SND.WND
Send Window
SND.UP
URG=1
SND.WL1
SND.WL2
SND.PUSH
ISS
RCV.NXT
RCV.WND
7
1
RCV.UP
URG=1
RCV.IRS
.
LISTEN, SYN_SENT, SYN_RECEIVED, ESTABLISHED, FIN_WAIT_1, FIN_WAIT_2,
CLOSE_WAIT, CLOSING, LAST_ACK, TIME_WAIT, CLOSED
( , , TCP,
.)
:
LISTEN
SYN_SENT
TCP.
.
.
SYN_RECEIVED ,
.
ESTABLISHED ,
. .
FIN_WAIT_1
TCP,
.
FIN_WAIT_2
TCP.
CLOSE_WAIT .
CLOSING
TCP
.
LAST_ACK
,
TCP (
).
TIME_WAIT
, ,
TCP (. 2.11)
CLOSED
.
TCP .
(, , , , , ),
, , SYN, ACK, RST FIN,
.
TCP .
,
. TCP , ,
,
. . 1.43
"" ,
. ,
. TCP .
7
2
. 1.43. TCP-
31.
TCP-
TCP
, TCP
, connection oriented.
,
. TCP
, .
TCP
( , end-points).
IP- ( ) .
.
TCP-.
:
(
). TCP (active
open).
TCP- -
, .
TCP-
(passive open), , .
,
( , )
(active port).
- .
.
.
7
7
3
, TCP
ACK
.
. , , .
, .
- TCP-
. ,
TCP- "
", " " . , -
TCP, - TCP .
, , TCP SYN . SYN|ACK ,
. TCP- RST ,
. ,
..
TCP,
.
32.
, TCP
, .
, , ,
.
.
ISN Initial Sequence
Number. ISN ,
, ISN.
,
. , Linux
1.2.8 ISN = +1000000, , .
Windows NT4.0 ISN=10, .
, RFC-793 , ISN 32- ,
4 .
4.4BSD ( Berkeley )
1.
64000 0 9,5 . (
, 8 , 4 .)
, , , 64000.
ISN Host Requirements RFC.
: ISN [10].
TCP- - , TCP ( )
-, , .
33.
TCP .
7
4
, (SYN,
ACK Seq_Client+1=ISN +1,
Seq_Server=ISN Mss_Server), SYN_RECEIVED.
ACK Seq_Server+1=ISN +1
, ESTABLISHED,
ESTABLISHED.
. 1.44 TCP-
7
5
. 1.45.
34.
TCP
() TCP- .
, .
, TCP
(). graceful close
.
. ,
. (.1.45).
( , -)
() , , ,
TCP- FIN ACK. ACK
,
.
, CK,
LOSE_WAIT FIN ACK,
(LAST_ ACK).
, FIN ACK , ACK-,
TIME_WAIT, , time-to-live.
, , .
TIME_WAIT TCP
TIME_WAIT [19][18]
TCP-.
, TIME_WAIT
, " " .. FIN-. ,
TCP- .
. 1.46 .
close(), TCP- FIN,
FIN_WAIT_1 ( FIN).
FIN , FIN_WAIT_2 (
7
7
6
FIN- ). FIN-,
TIME_WAIT.
. 1.46. TIME_WAIT
, -
. ,
TIME_WAIT MSL (MSL maximum segment lifetime),
TTL,
. , TIME_WAIT ,
.
:
, FIN-
, ,
TIME_WAIT.
? , - ,
, .
, , TCP
. , ACK ( ,
), FIN, ,
TIME_WAIT, RST. TIME_WAIT
,
. 2SL-,
TIME_WAIT .
, TIME_WAIT -
" ", ,
.
IP- , TCP
. , IP- , ,
-,
. TCP ,
SN , .
?
, TCP-
7
7
RST-. , RST- ,
.
,
, .
.
""
, , .
TIME_WAIT ,
, , , . ,
[19].
TIME_WAIT,
. RFC-1337,
, TIME_WAIT.
"" (
) , ,
.
RFC-1337 TCP ,
TIME_WAIT RST,
TCP-.
. 2.9.1
SO_LINGER TIME_WAIT.
, ""
TIME_WAIT .
l_linger linger , RST, ,
TIME_WAIT. TIME_WAIT. ,
,
TCP-.
TCP .
, , Netscape -. .
MS Internet Explorer (IE) - (
FIN-ACK ) RST,
, IE ...
. firewall SYN, reset',
SYN- ,
connect().
,
. .
.
, , , .
TCP ,
. , UNIX, , UNIX
, . TCP
-. ( )
.
"" (half-close).
TCP "".
"" , .
.
, FIN , ,
. - ,
.
7
7
8
,
, , .
TCP ,
.
TCP .
. , ,
.
, .
,
.
.
. 1.47
1
2
3
...
IP
IP
. 1.47.
. :
( ,
,
, . .).
IP-
IP . 0.0.0.0.
, , .
IP-
IP- .
Windows
(. 4.5.3)
8. UDP
TCP , .
. pooo User Datagram
Protocol (UDP ). , ,
Domain Name Service (DNS - ), Trivial File Transfer Protocol (TFTP
) Remote Procedure Call (RPC
). , ,
.
,
. UDP ,
. UDP TCP,
, TCP.
UDP . UDP- TCP. UDP- . 1.48.
, 16 .
(16 )
(16 )
7
7
9
(16 )
. 1.48. UDP
UDP- :
.
(, ), , , .
.
- ICMP
. TCP .
, TCP;
, . , ,
, ,
IP .
UDP_CHECKSUM (*nix) 0 (. 2.9.1),
. , UDP
"" , .
UDP
IP (.. 16- ), . ,
UDP ,
16- . ,
,
. , UDP TCP
-. 9.
UDP
UDP ,
UDP-. , UDP
p ,
. ,
, UDP-p
.
, ,
, UDP . ,
UDP-p .
,
.
. ,
, UDP p-
, IP-p , UDP-p.
UDP-
, IP-p , IP-,
UDP-. ,
-p .
, UDP,
(. 1.49). IP- IP-
IP-p ,
. (17 UDP)
UDP UDP-p ( ).
IP-,
.
7
8
0
. 1.49. UDP
, UDP,
, , , ,
. , .
, ,
, .
, , UDP ,
TCP/IP .
RFC-3828 "" (UDP-Lite), UDP,
,
(discard). ,
UDP-Lite c UDP.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
TCP ?
OSI TCP/IP?
.
, TCP.
? TCP
.
? .
,
TCP.
UDP.
TCP?
Next Header IPv6?
UDP? ?
MTU MSS? TCP-?
IP- 8?
IP-
?
ICMP?
ping traceroute? .
TTL IP, IGMP DNS?
TCP-? .
?
,
.
,
.
8
8
1
20.
21.
22.
23.
IP TCP? .
? ?
TCP-?
ACK ?
1. 2
- ,
Windows-
? ,
8
8
2
Delphi -
Delphi 6 Internet (TServerSocket TlientCocket) FastNet,
Indy Delphi 7. WINHTTP (-WinInet),
MFC-.
, ,
, .
, :
, (
, ),
VCL- .
,
,
.
Windows Socket, (
Winsock2.0) ,
/ Windows-
.
9.
(API Application
Programming Interface) , TCP/IP, :
(sockets API)
. 2.1
,
.
(
) ,
.
8
8
3
,
,
, ,
.
, (overlapped - Windows) /,
- ( ) ,
, , .
UNIX.
, Microsoft Windows, ,
8
4
(
, WindowsMe).
,
Windows, .
, , ,
, . , 2
(UNIX-).
( Windows).
10. -
,
- UNIX. TCP/IP
UNIX, UNIX
. ,
, .
Windows
,
UNIX " ".
UNIX .
, ,
, . , UNIX
. , ,
. UNIX
(file descriptor, fd).
, .
, , , ..
,
"".
- , - UNIX.
, ,
Open-Read-Write-Close. , "
", .
UNIX -
, - ,
.
, - , -
" "
.
- , ,
"-".
API - UNIX,
-, . API
-, . UNIX
- ,
-.
, - UNIX,
"" , " "
. , ()
-
. ( )
, .
. , , IP, 8
8
5
(IP-), .
- UNIX - " " - ,
.
, ,
- UNIX,
API ( ).
, ,
UNIX. , -
, , .
.
, UNIX,
, UNIX.
*nix- /++.
11.
.
, . ,
, ,
.
, ,
,
, , , . .
, ,
,
.
,
.
, . ,
UNIX, -
- UNIX.
:
, , , .
, TCP RFC 793, 2.7
"well-known sockets", "well-known numbers",
UNIX ( ),
(, , , ,
: ).
, . - ,
. , .
.
(),
.
. ,
API, .
. .
12.
(
) , (socket descriptor, sd) -
8
8
6
. ,
(endpoint),
-.
,
. , ,
,
. - ,
,
.
, TCP/IP
.
, -
. .
( IP) . TCP/IP UNIX,
-
, : API TCP/IP -,
.
, ""
(socket).
Socket (, ) - ,
.
TCP/IP , socket
(. ) .
Socket- /
, , :
1. ;
2. ;
3. (/);
4. .
,
.
- . ,
socket(), ,
. ,
() , .
UNIX ,
, .
socket():
int socket(int domain, int socket_type, int protocol);
, : ( ),
( ) . ,
, TCP/IP IPX/SPX.
:
(. .) 4.1 BSD
socket() 4 , , .
, , :
, . "protocol" ,
, TCP. socket()
.
8
8
7
errno() ,
. errno- :
EPROTONOSUPPORT
;
EMFILE
;
ENFILE
;
EACCESS
,
;
ENOBUFS
.
35.
TCP/IP ,
UNIX. TCP/IP, UNIX API .
, API TCP/IP, .
API
.
35.1.1.1.
, socket(), ,
, " ."
,
.
: , Windows
, UNIX- - ?
API,
.
. ,
.
,
, :
, .
,
.
-
. UNIX (path) UNIX, /dev/printer,
UNIX . UNIX
, , AF_UNIX.
(). PF_INET, ,
(Protocol Family) TCP/IP. , ,
"PF_". PF_UNIX UNIX, a PF_NS .
(Address Family) .
.
,
. ,
, "AF_".
, winsock2.h:
8
8
#define AF_UNIX
#define AF_INET
#define AF_IMPLINK
#define AF_PUP
#define AF_CHAOS
#define AF_NS
#define AF_IPX
#define AF_ISO
#define AF_OSI
#define AF_ECMA
#define AF_DATAKIT
#define AF_CCITT
#define AF_SNA
#define AF_DECnet
#define AF_DLI
#define AF_LAT
#define AF_HYLINK
#define AF_APPLETALK
#define AF_NETBIOS
#define AF_VOICEVIEW
#define AF_FIREFOX
#define AF_UNKNOWN1
#define AF_BAN
#define AF_ATM
#define AF_INET6
#define AF_CLUSTER
#define AF_12844
#define AF_MAX
1
2
3
4
5
6
AF_NS
7
AF_ISO
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
8
9
35.1.1.2.
DARPA- ""
( ) (
). .
UNIX ""
sockaddr,
, ,
<sys/socket.h> 16 . UNIX (kernel) (
Windows.)
struct sockaddr
{
u_short sa_family;
char
sa_data[14];
}
/* */
/* 14 */
sa_family
sa_data
2
14
. 2.2. sockaddr
. . 16 .
:
struct sockaddr
{
uint8_t sa_len;
sa_family_t sa_family;
char sa_data[14];
}
/* */
/* */
/* 14 */
sa_len (
TCP/IP ).
, ,
(sockaddr *) ,
C-.
uint8_t, sa_family_t _t ,
Posix.1g.(. 3.1.)
POSIX OSE (POSIX - Portable Operating System Interface for Computer Environments, OSE - Open
System Environment) (Portable Standards Committee)
IEEE (IEEE Computer Society). POSIX
(API) ().
POSIX
SystemV Release 4 Unix.
3.1 , Posix 1g
int8_t
8-
<sys/types.h>
uint8_t
8-
<sys/types.h>
int16_t
16-
<sys/types.h>
uint16_t
16-
<sys/types.h>
int32_t
32-
<sys/types.h>
9
0
uint32_t
32-
<sys/types.h>
sa_family_t
<sys/socket.h>
socklen_t
, uint32_t
<sys/socket.h>
inaddr_t
Iv4-, uint32_t
<netinet/in.h>
inport_t
<netinet/in.h>
c IPv4 sockaddr .
sockaddr_in (in Internet): sockaddr_in
UNIX- <netinet/in.h>.
struct sockaddr_in
{
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
}
/*
/*
/*
/*
AF_INET */
(. 2.5.12)*/
. */
*/
sin_family
sin_port
sin_addr
sin_zero
. 2.3. sockaddr_in
, 4.2BSD, sin_addr
in_addr, (union),
IP- , :
u_char (4 ,
u_short (2*2
u_long
) S_un_b;
) S_un_w;
(4 , ) S_addr,
:
struct in_addr
{
union {
struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
struct { u_short s_w1,s_w2; } S_un_w;
u_long S_addr;
}
}
S_un;
in_addr , unsigned
long.
, socket(),
TCP-, (
TCP):
Local IP
Remote IP
Local port
2
. 2.4. TCP
IPv6 sockaddr_in6:
struct sockaddr_in6
Remote port
2
9
1
{
short int sin6_family; /*
. AF_INET6.*/
struct in6_addr sin6_addr;
/* IPv6 -.*/
uint32_t sin6_flowinfo;
/* . */
uint16_t sin6_port;
/* . */
RFC-2133 ,
.
, . ,
, ,
. ,
(. connect(), bind()).
UDP TCP .
, ,
.
:
#include <sys/types.h> <sys/socket.h>.
IPX/SPX IPX- :
struct sockaddr_ipx
{
short sa_family;
/* AF_IPX */
char
sa_netnum[4];
/* */
char
sa_nodenum[6];
/* */
UNIX
UNIX, (, )
UNIX, 108 .
inode .
( unlink(), .
2.5.2). ,
.
UNIX, ( /tmp),
. UNIX
, . sockaddr_un
UNIX <sys/un.h>.
BSD :
struct sockaddr_un
{
short sun_family;
char sun_path[108];
}
/* AF_UNIX */
/* */ }
4.4 BSD :
struct sockaddr_un
{
u_char sun_len;
u_char sun_family;
char sun_path[104];
}
/* */
/* AF_UNIX */
/* */
1024 , UNIX,
, .
9
2
- (32 ).
- . 198.144.204.1.
, , .
" ", .
, garfield.cs.wisc.edu 128.105.1.3,
80690103 , 2154365187 .
,
. <sys/socket.h>.
:
SOCK_STREAM - ;
SOCK_DGRAM - ;
SOCK_RAW
- .
Linux
:
SOCK_RDM
(reliably-delivered message - ).
.
SOCK_PACKET .
SOCK_SEQPACKET ( ).
, SOCK_STREAM. ,
read() ,
.
.
SOCK_STREAM SOCK_DGRAM.
. [19] (
), UNIX
- AF_ROUTE, UNIX-like .
protocol
socket() .
, .
TCP/IP IPPROTO_. , TCP
IPPROTO_TCP, IPPROTO_UDP
UDP. , socket() :
sd = socket (F_INET, SOCK_STREAM, IPPROTO_TCP);
,
(F_INET), TCP (IPPROTO_TCP) ,
(SOCK_ STREAM).
0, TCP/IP
.
socketpair()
" " ,
UNIX socketpair(),
:
#include <sys/socket.h>
int socketpair(int domain, int type, int protocol, int socket_vector[2]);
. ,
, socket _vector [0] socket _vector [1].
AF_LOCAL, 0.
SOCK_STREAM, SOCK_DGRAM. SOCK_STREAM " " stream pipe.
9
9
3
, , . ,
SOCK_SEQPACKET,
, , .
, ,
, ,
. MSG_EOR.
, . - "" ,
. -,
, .
( *nix-). "
" "-IP-",
, , . ,
, "-IP-"
. , , IP-
. IPC , IP-
, .
"-IP-" , "" .
,
.
. , ,
AF_INET. UNIX, , AF_UNIX.
. ,
, , .
, .
UNIX .
UNIX .
.
13.
36.
connect()
,
, .
(point-to-point) .
, TCP ( )
(
), .
- TCP/IP ,
. - .
-
.
-
connect(). connect()
,
( )
. connect():
int connect(int sockfd, const struct sockaddr *serv_addr, int addrlen);
9
4
" "
, ,
.. - connect() TCP-
" ".
, ()
RST (ECONNREFUSED),
,
;
TCP
;
TCP .
, connect() (-1)
. ,
, :
EADDRNOTAVAIL ;
EAFNOSUPPORT
EINPROGRESS
- ,
;
EALREADY
-
;
EBADF
ENOTSOCK
EISCONN
EADDRINUSE
ETIMEDOUT
,
, ;
, "server is down",
;
ECONNREFUSED
.
- ;
ENETDOWN
EHOSTDOWN
,
;
ENETUNREACH
EHOSTUNREACH
( ), -
,
.
,
.
:
. 2.5.9
,
,
.
connect(), ,
socket(). ,
. ,
.
9
5
connect() ,
. , ,
, , .
, ,
. connect()
,
( connect()).
""
connect(),
,
. ,
.
connect(), ,
( ), . (
) ( ,
). , ,
. connect(),
, ,
" ".
connect() ,
TCP- (
.)
, UDP (. ) (raw) ,
send() recv(), ..
connect() bind() (. 2.5.5).
.
, - ,
connect(), ,
socket().
:
TCP- SYN-
connect(), (, 5,8 ., 24 . )
, 75 . ( 4.4BSD, 45 . - Windows) connect()
. , connect()
"" .
37.
bind()
connect() .
, .
, .
.
- ( ) .
-, ,
,
. , ,
, -, ,
.
bind()
( ) .
int bind(int sd, const struct sockaddr *name, int addrlen);
9
6
sd , name ,
.
, . 2.1.
addrlen .
IP- INADDR_ANY ( = 0)
, . INADDR_ANY
" ",
. bind()
, ( INADDR_ANY),
.
INADDR_ANY , IP-
; , ,
-. Linux, bind()
INADDR_ANY,
. INADDR_LOOPBACK (127.0.0.1)
. INADDR_BROADCAST - 255.255.255.255
.
,
1024-5000 (
). bind() getsockname() (. 2.5.13),
.
:
IPv6 INADDR_ANY .
;
;
;
, ;
;
.
Berkeley 0IPPORT_RESERVED-1.
.
2.1 bind() UNIX:
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>
#include <iostream.h>
#define NAME "socket"
int main(void) {
int sd, length;
struct sockaddr_un name; // name - a UNIX-
9
7
char buf[1024];
//
// UNIX,
sd = socket(AF_UNIX, SOCK_DGRAM, 0);
if(sd<0)
{
cerr<<" \n";
exit(1);
}
// UNIX-
name.sun_family = AF_UNIX;
strcpy(name.sun_path,NAME);
if(bind(sd,&name,sizeof(struct sockaddr_un))<0)
{
cerr<<" \n";
exit(1);
}
cout<<"socket -->"<<NAME<<"\n";
if (read(sd, buf, 1024) <0)
//
cerr<<" \n";
cout<<"-->"<<buf<<"\n";
//
close(sd);
//
// unlink() .
unlink(NAME);
}
UDP-,
, (.. connect() ), bind()
? - bind() UDP . UDP
, .
, ,
bind().
, , UDP-, , bind()
connect()?
-, " ", .. UDP . -,
(IP-
), connect(), connect()
. "", UDP
"" .
"" UDP-
(. 2.5.5).
38.
listen()
, . -,
, .
, ,
. ,
.
, ,
, .
() ( )
. , .
UNIX (lightweight processes), Windows
(threads). . 2.5 ) ,
. 2.5 ) . 3-4
, .
3
(, UNIX- fork(),
9
9
8
TCP-), (), ,
.
. - ( -)
.
.
,
"" , ..
. ,
. ,
, , ,
, . , TCP
(), UDP .
. 2.5.
, ,
() ()?
. ,
, .
listen().
listen() ,
"" . ,
, , ,
, .
, "listen - " . listen()
" ". -
,
"" .
:
, "" ,
-.
: ""
. ,
. listen() :
9
9
9
int listen(int sd, int backlog);
sd , backlog
( , ,
5). .
.
,
, .
, TCP
- . backlog 0
( 0, 1).
TCP/IP backlog .
, , .
, , -
, .
, listen() ,
TCP UDP .
TCP- listen() :
- (.. ,
handshake);
- (.. ,
handshake
).
backlog,
1 , (
).
2.12.
, , (UDP),
, -/ (
, recvfrom()). , .
listen() 0 1 .
39.
accept()
, bind()
() . -
connect() ,
. , ,
. , connect() bind()
.
, ,
. , bind(),
.
accept(), , listen().
accept():
int accept(int sd, struct sockaddr *client_addr, int *addrlen);
sd , ( , listen()),
client_addr ( , NULL)
, , addrlen
. NULL addrlen .
1
0
accept() .
, TCP.
, accept() .
, newsd = accept(sd, addr, addrlen);
, (!) , sd,
newsd . accept(),
IP TCP , IP-
( ) .
-1.
accept(),
, .
, accept()
.
accept(),
connect() ,
.
40.
,
.
send()
.
.
write()
.
.
writev()
.
.
sendto()
.
.
sendmsg()
.
.
sendto() recvfrom() TCP,
. sendto() TCP-
- to tolen - .
,
, .
(IP- )
.
,
, . send(), write() writev()
. ,
. writev(), write(),
, .
writev() , .
write():
size_t write(int sd, const char *message_buffer, size_t buffer_length);
. write() ,
, .
1
1
0
, .
, .
, 1
errno.
writev():
size_t writev(int sd, const struct iovec *io_vector, int vector_length);
. , , . ,
.
; . writev() ,
.
, .
writev() , .
, writev() -,
, .
, , .
.2.6 -.
/ scatter-gather I/O.
readv()/writev() sys/uio.h.
, 1
errno.
. 2.5. , writev()
write() ,
, writev(). ,
, writev(). send() ,
. send():
int send(int sd, const void *buf, int buflen, unsigned int flags);
. ,
, .
, .
, .
send() ,
.
1
0
MSG_DONTROUTE. c ,
, .
MSG_DONTWAIT. , -
,
, - .
MSG_OOB. send() , .
TCP 1 .
recv() ,
. , Telnet
Ctrl+C. -
( , RFC793 RFC1122).
.
:
, send() ,
, ,
. ,
. ,
( TCP/IP).
:
MSG_PEEK. , MSG_PEEK,
.
. MSG_PEEK recv()
recvfrom() (..
).
, , FTP. ,
TCP .
MSG_WAITALL. 4.3BSD Reno. ,
,
.
:
, MSG_EOR (OSI )
MSG_EOF (T/TCP).
1
0
, recvfrom() (. ) recv().
, UDP connect(), "
" , TFTP. DNS
UDP, DNS- connect().
sendmsg() ,
.
sendmsg(). ,
:
res = sendmsg (sd, message_structure, special_f lags);
. sendmsg() writev() ,
.
, writev(),
. . 2.7 , sendmsg().
0
31
/
/
. 2.7. , sendmsg()
(, 4.4BSD) .
41.
, .
: read(), readv(), recv(), recvfrom(), recvmsg() ,
. , recv() send()
, recv() , a send() .
writev() readv(). writev() ,
readv() . ,
.
recvfrom() recvmsg() sendto() sendmsg(). . 2.1
:
2.1.
send()
recv()
write()
read()
writev()
readv()
sendto()
recvfrom()
sendmsg()
recvmsg()
,
, . ,
1
1
0
TCP .
, .
, .
: recv(), read() readv().
.
, ,
readv().
"" , 1.
- , ..
, recv()
.
"-"
, - , recv() ,
send(). , send() 1 .
:
k=recv(sd,file,1024*1024,0);
if(k!=1024*1024)
{
.....
}
recv() 1 !
recv() TCP ,
message_buffer, buffer_length .
. ,
. ,
, recv().
recv() , , TCP
,
. recv() 0, ,
.
(, - ),
(.. 1).
TCP/IP.
:
EBADF
ENETDOWN
ENOTCONN
EINTR
EFAULT
ENOTSOCK
ESHUTDOWN
EWOULDBLOCK
EAGAIN
sd .
,
.
.
shutdown()
,
,
,
-
1
1
0
EINVAL
ECONNABORTED
ECONNRESET
, - ,
.
bind()
-
recvfrom().
UDP , ? recvfrom():
recvfrom(int sd, void *message_buf, size_t buf_length, int special_lags, struct
sockaddr *remote_socket_address_structure, socketlen_t *address_structure_length);
UDP , ,
remote_socket_address_structure, ,
"sys/socket.h".
/ ,
API /
. select(),
, SO_RCVTIMEO
SO_SNDTIMEO,
2.9.1.
42.
select()
,
"select()". select()
*nix-. select():
int
select(int
number_of_sockets,
fd_set
*readable_sockets,
*writeable_sockets, fd_set *error_sockets, struct timeval *timeout);
fd_set
select() . ,
(number_of_sockets), (
, 64).
readable_sockets, writeable_sockets error_sockets
fd_set, .
(readable_socket) ,
recv() recvfrom().
, (writable_socket) , .
, send() sendto().
select() , ,
(exception) error_sockets.
.
number_of_sockets 1
, UNIX .
:
Windows- - number_of_sockets
0.
select(), timeval
:
struct timeval
{
int tv_sec;
int tv_usec;
};
/* */
/* */
,
UNIX- 100 , .
1
0
timeval
0, select() timeout ,
res = -1 (, -
;)
res = 0 -
.
.
select() /
- ,
a . 2.8:
. 2.8
, , recvfrom(). , :
( ),
recvfrom()
( );
, recvfrom()
.
recvfrom().
, , "" .
.
select() ,
, ,
select(). select()
.
select() ,
. select() res
, - .
, select() ,
. select(), ,
, - . ,
, , , -
(, ). select()
, .
1
1
0
select(), ,
, . select()
, , -.
select()
.
select(), ,
. ,
. , , ,
, , , .
select() ,
, , ,
, . ,
, .
, long integer
; FD_SETSIZE. UNIX-
FD_SETSIZE 64 ( 256).
select() " /". ?
, ()
.
( [19]), (
, ) - .
1. , :
low water-mark (
setsockopt() SO_RCVLOWAT, . 2.9.1)
. TCP UDP low water-mark 1.
,
( , ).
TCP- ( FIN).
(
).
(TCP), .
, .
(-1) rrn c .
, , , getsockopt()
SO_ERROR (. 2.9.2), .
2. , :
, (UDP).
, ,
(, ,
).
SO_SNDLOWAT.
2048 TCP UDP.
, , .
SIGPIPE.
, .
(-1) rrn,
. , , ,
getsockopt() SO_ERROR.
3. , , ,
(out-of-band)
.
1
1
0
3 :
- SIGIO: , -.
, ;
- SIGURG: , -. ,
;
- SIGPIPE: , . , .
, ""
( - fd).
- fd_set. :
FD_ZERO (fd_set *set)
fd
fd
fd
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#define STDIN 0
/* */
main ()
{
struct timeval tv;
fd_set readfds;
tv.tv_sec = 2;
tv.tv_usec = 500000;
FD_ZERO(&readfds);
FD_SET (STDIN, &readfds);
/* writefds errorfds */
select (STDIN+1, &readfds, NULL, NULL, &tv);
/* Enter*/
if (FD_ISSET (STDIN, &readfds))
printf (" ! \n ")
else
printf ("Timed out \n ");
}
number_of_sockets
, sockfd+1,
, STDIN,
fd = 0 , Windows- , ..
.
2.3 sd1
sd2:
2.3
#include <sys/time.h>
#include <sys/types.h>
1
0
fd_set read_sd;
struct timeval wait;
int sd1,sd2,nb;
...
for (;;)
{
wait.tv_sec = 1; /* */
wait.tv_usec = 0;
FD_ZERO(&read_sd);
FD_SET(sd1, &read_sd);
FD_SET(sd2, &read_sd);
nb = select(FD_SETSIZE, &read_sd, (fd_set *) 0, (fd_set *) 0, &wait);
if (nb <= 0)
{
printf ("select , select timeout.\n");
}
if (FD_ISSET(sd1, &read_sd))
{
printf (" 1 .\n ");
}
if (FD_ISSET(sd2, &read_sd))
{
printf (" 2 .\n ");
}
}
select() . ,
, listen() "" ,
, ,
readable_socket.
,
( )
.
,
,
timeval=0.
44.
- UNIX-
, , ,
[19].
/.
/ .
?
connect() .2.9.
1
1
. 2.9 connect()
connect()
, ()
connect() .
connect() timeout (
, timeout ),
" " ,
.
,
: connect(), accept(), write(), send(), read()
recv() . . .
.
, recv()
TCP-,
-
.
: recv(),
, -
. , ,
.
- recv() ""
, ""
, - , , read() recv(),
,
, (, ).
select() .
, "" recv(),
select() -
TCP .
( ), .
, .
2.4 ReceiveNBytes()
int ReceiveNBytes(int sd, char *pBuffer, int iStillToReceive)
1
1
{
int
iRC
= 0;
int
iReceiveStatus
= 0;
timeval ReceiveTimeout;
fd_set fds;
FD_ZERO(&fds);
FD_SET(sd, &fds);
ReceiveTimeout.tv_sec = 0;
// 0,5.
ReceiveTimeout.tv_usec = _500000;
//.. ..
while(iStillToReceive > 0)
{
//
iRC = select(0, &fds, NULL, NULL, &ReceiveTimeout);
//
if(!iRC) return -1;
// - select()
if(iRC < 0) return WSAGetLastError();
//
iReceiveStatus = recv(sd, pBuffer, iStillToReceive, 0);
// recv()
if(iReceiveStatus < 0)
{
return WSAGetLastError();
}
else
{
//
iStillToReceive -= iReceiveStatus;
pBuffer += iReceiveStatus;
}
}
return 0;
}
.
, . UNIX-
.
( /)
,
, /
.
/ :
( ), ,
.
:
. , , recv() read(),
,
select().
connect(), , . .
select(). ,
, connect() ,
. connect()
,
.
1
1
/, , UNIX- ,
/,
(InterProcess Communication - IPC), ..
, .
, " signal.h ".
/ ,
SIGIO. :
1. ,
( , ) SIGIO.
sigaction() signal().
2.
(, recvfrom().)
3. ,
SIGIO,
recvfrom(), ,
. .
"" / Posix.1g
UNIX- .
, ,
. / Posix.1g
aio_ [19].
45.
ioctl() fcntl()
,
ioctl() ( FIONBIO) fcntl() ( FNDELAY, BSD
O_NDELAY System V). (ioctl input/output control, fcntl file control)
UNIX-
/ , ,
: , . ""
.
:
#include <sys/ioctl.h>
int ioctl(int sd, int cmd, char *argp);
sd , cmd ,
, argp ().
ioctl()
. , , ,
, . cmd argp
,
. ioctl()
(, ).
. cmd
, , argp .
, cmd, <sys/ioctl.h>.
ioctl() (
Linux/i386 421 .)
ioctl()
, fcntl()
- - cmd.
#include <unistd.h>
#include <fcntl.h>
int fcntl(int fd, int cmd);
int fcntl(int fd, int cmd, long arg);
int fcntl(int fd, int cmd, struct flock *lock);
, UNIX-like .
1
1
1
fcntl()
F_SETFL
-, F_SETFL
ioct1()
O_NONBLOCK
FIONBIO
O_ASYNC
FIOASYNC
F_SETOWN
SIOCSPGRP FIOSETOWN
F_GETOWN
SIOCGPGRP FIOGETOWN
TCP
FIONREAD
SIOCATMARK
,
,
.
,
fcntl() .
, ,
/ /, ,
FNDELAY FASYNC fcntl().
fcntl()
:
/.
_NONBLOCK, F_SETFL .
/.
_ASYNC, F_SETFL, SIGIO,
.
F_SETOWN , (
) SIGIO SIGURG.
, /,
(out-of-band) .
:
O_NONBLOCK .
FIFO . , open()
, " ". O_NONBLOCK, open() . O_NONBLOCK
: ,
, , .
. TCP- sd F_SETFL
O_NONBLOCK.
#include <fcntl.h>
#include <unistd.h>
sd = socket (AF_INET, SOCK_STREAM, 0);
fcntl (sd, F_SETFL, O_NONBLOCK);
accept() EWOULDBLOCK;
connect() EINPROGRESS;
,
;
1
1
1
(, select() sd connect()).
2.5
.
.
fd_set rsds, wsds;
struct timeval tv;
tv.tv_sec = 0; tv.tv_usec = 500;
FD_ZERO(&rsds);
FD_ZERO(&wsds);
int max_sd = -1;
/* . ,
handshake TCP- (SYN), (ACK)
*/
FD_SET(sd, &wsds);
FD_SET(sd, &rsds);
if(sd > max_sd) max_sd = sd;
select(max_sd+1, &rsds, &wsds, NULL, &tv);
/* select() -
, . , , ,
getsockopt() (. 2.9.2) */
if(FD_ISSET(sd, &wsds) || FD_ISSET(sd, &rsds))
{
socklen_t err_len;
int error;
err_len = sizeof(error);
if(getsockopt(sd, SOL_SOCKET, SO_ERROR, &error, &err_len) < 0 || error != 0)
{ /* .*/ }
else
{ /* . */ }
}
.
.
sd,
(return(0)) .
1
1
, :
1. int flags,sd;
2.
/* .
, */
flags=fcntl(sd,F_SETFL,0);
fcntl(sd, F_SETFL, fcntl(sd, F_GETFL, 0) & ~O_NONBLOCK);
fcntl()
. &
.
Posix.
getsockopt()
connect() ( [19]) :
1. connect(). ,
EISCONN,
.
2. read() c buf_len=0.
connect() , read() ,
0. read() .
3. getsockopt() getpeername() (. 2.5.13.3),
ENOTCONN ( ),
getsockopt().
,
/ .
,
/ .
/.
UDP- c recvfrom()
.
, recvfrom() ,
,
-1, errno EWOULDBLOCK.
. 2.10 UDP
, (
) ,
1
1
1
.
. 6.
46.
/
. , ,
, .
1.7.12. ,
, .
, ,
, , , TCP-
.
, ,
, , .
, ,
, ,
. ,
, , .
, EOF.
close(),
: close(sd); sd .
, " ", ,
close() sd, ,
, , - . ,
, TIME_WAIT.
close()
(. 1.7.13).
API UNIX-
shutdown(), close() , ,
, - .
#include <sys/socket.h>
/* UNIX */
/* Windows */
Windows
Posix.1g
SD_RECEIVE
SHUT_RD
SD_SEND
SHUT_WR
SD_BOTH
SHUT_RDWR
.
how=0. .
EOF,
- .
,
shutdown(), - TCP
.
1
1
UNIX , ( -
) , .
, TCP- ACK-
, .
WinSock
,
. , shutdown(sd,0) Windows .
how=1. . ,
.
, TCP FIN, , .
(half close) " ".
shutdown() , (*nix
Windows).
how=2. , shutdown()
, how=0, how=1.
1
1
TCP - -.
. 2.11 TCP-, "" .
ACK-. , ,
close() FIN-, ,
-1. ACK FIN
. -1 TCP-
RST ( ) .
. 2.11 TCP-,
shutdown() c how=1 (
) FIN-. ,
. ,
, .
:
TCP- - ,
/
TCP .
. ,
" ",
. UNIX lsof,
. , , UNIX -
, , ,
.
1
1
1
Once the application is in the ESTABLISHED state, there are two paths for closure. If your application
initiates the closure, it is known as an active socket closure; otherwise, the socket closure is passive. Figure
1-2 illustrates both an active and a passive closure. If you actively initiate a closure, your application sends a
FIN packet. When your application calls closesocket() or shutdown() (with SD_SEND as its second
argument), your application sends a FIN packet to the peer, and the state of your socket changes to
FIN_WAIT_1. Normally, the peer responds with an ACK packet, and your socket's state becomes
FIN_WAIT_2. If the peer also closes the connection, it sends a FIN packet and your computer responds by
sending an ACK packet and placing your socket in the TIME_WAIT state.
47.
" "
? " ",
, .
4 ,
(hosts), (networks), (protocols)
(services).
UNIX /etc/hosts, /etc/networks/, etc/protocols /etc/services. UNIX
,
"",
, . .
<netdb.h>.
:
( )
( )
( )
( )
,
:
gethostbyname() gethostbyaddr().
gethostbyname()
- hostent:
struct hostent *gethostbyname(const char *host_name);
gethostbyname("www.microsoft.com").
:
gethostbyname2(),
.
DNS (IPv4)
(IPv6), ,
CNAME.
gethostbyaddr() hostent:
struct hostent *gethostbyaddr(const char *inaddr, int inaddr_type);
. , inaddr, -
, - , - 192.145.38.56. ,
inaddr_type, ; ,
inaddr_type AF_INET. IPv6,
size_t
1
1
2
.
hostent. DNS PTR
(IPv4 IPv6).
hostent :
struct hostent
{
char *h_name;
char **h_aliases;
int h_addrtype;
*/
int h_length;
/* .*/
/* , */
/* ; AF_INET
/* . AF_INET 4
*/
char **h_addr_list;
/* IPv4 (IPv6) .
, . */
#define h_addr h_addr_list[0]/* h_addr */
};
, gethostbyaddr() gethostbyname() ,
, .
, , name
() .
UNIX- /etc/hosts.
DNS (Domain Name Service),
DNS. -
, . /etc/hosts
gethostbyname(), , . DNS
, ,
.
hostent .
,
.
API . ,
, - .
API , ,
, , :
API , ,
, ,
, .
gethostbyname() gethostbyaddr() ,
h_errno, errno!
h_errno, :
extern int h_errno;
, h_errno:
HOST_NOT_FOUND
TRY_AGAIN
,
. .
NO_RECOVERY
NO_ADDRESS NO_DATA
, -.
1
2
gethostbyaddr() gethostbyname()
, DNS. ,
, , .
DNS,
.
:
, .
- ,
.
gethostbyaddr() gethostbyname() ( getXXbyYY()) .
"" (resolver).
. . [19]
:
,
IP- , .
UNIX ,
, gethostbyaddr() gethostbyname()
. , sendmail,
DNS- MX,
.
_res. ,
DNS- , [24],
.
. gethostent()
. stayopen , ,
gethostbyname() gethostbyaddr() (
).
struct hostent *gethostent();
.
, .
endhostent();
.
,
:
2.6
#include <stdio.h>
#include <netdb.h>
int main (void)
{
struct hostent *pe;
int i, j;
char *pstr;
sethostent (1);/* */
1
2
while ((pe = gethostent()) != NULL)
{
printf (" : %s\n", pe->h_name);
printf (" :\n");
for (i = 0; (pstr = pe->h_aliases[i]) != NULL; i++)/* NULL */
{
printf (" %s\n", pstr);
}
printf (" : %d\n", pe->h_addrtype);
printf (" : %d\n", pe->h_length);
printf ("IP- :\n");
for (i = 0; (pstr = pe->h_addr_list[i]) != NULL; i++)
{
for (j = 0; j < pe->h_length; j++)
{
printf (" %d", (unsigned char) pstr[j]);
}
printf ("\n");
}
}
endhostent ();/* */
return 0;
, Compuserv, AOL, Swift, FidoNet, Relcom . .
getnetbyaddr() getnetbyname(),
() . ,
, , .
getnetbyaddr() getnetbyname()
/etc/networks netent ( net entry
) :
struct netent
{
char
char
int
in_addr_t
};
*n_name;
**n_aliases;
n_addrtype;
n_net;
/*
/*
/*
/*
*/
*/
*/
*/
, .
:
setnetent(stayopen)
.
stayopen int , ,
getnetbyname() getnetbyaddr() .
getnetent()
/etc/networks,
.
endnetent()
.
getprotobynumber(protocol), getprotobyname(name),
. /etc/protocols
protoent :
1
1
2
struct protoent
{
char *p_name;
char **p_aliases;
int p_proto;
/* */
/* */
/* . protocol
socket() */
};
, .
setprotoent(stayopen)
getprotoent()
/etc/protocols,
.
endprotoent()
. socket()
protocol , ,
, .
()
Service database database-
.
getservbyname() getservbyport(),
. /etc/services.
servent :
struct servent
{
char *s_name;
char **s_aliases;
int s_port;
char s_proto;
};
/*
/*
/*
/*
*/
*/
,
*/
*/
getservbyname():
struct servent *getservbyname (const char *servname, const char *proto);
getservbyname() ,
proto. ,
. , ; ,
, -
, DNS
UDP TCP. , . ,
Telnet-,
:
servname,
, Telnet-, TCP
:
sp = getservbyname ("telnet", "tcp");
2.7 getservbyname()
struct servent *se;
...
if ((se = getservbyname("daytime", "tcp")) == NULL)
{
fprintf(stderr, " , .\n");
}
getservbyport():
struct servent *getservbyport (const char *port, const char *proto);
1
2
getservbyport() port,
() proto. port
. , :
2.8 getservbyport()
struct servent *se;
...
if ((se = getservbyport(htons(53), "udp")) == NULL)
{
fprintf(stderr, " ,
.\n");
,
. ,
. ,
.
?
.
, - .
,
Internet Assigned Numbers Authority (IANA).
,
. . ,
.
uname()
.
#include <sys/utsname.h>
int uname(struct utsname *name);
utsname,
, :
#define _UTS_NAMESIZE 16
#define _UTS_NODESIZE 256
struct utsname
{
char sysname[_UTS_NAMESIZE ];
char nodename[_UTS_NODESIZE ];
char release[_UTS_NAMESIZE ];
char version[_UTS_NAMESIZE ];
char machine[_UTS_NAMESIZE ];
};
48.
/* , 4.4BSD */
/*
/*
/*
/*
/*
*/
*/
*/
*/
*/
, 2.5.3 .
.
.
" " , ,
() .
" " - "big-endian". ""
, " network
byte order".
IBM- -
"" ,
1
1
2
- . " ",
- "litle-endian". Motorolla
.
, 247 :
247 - ;
742 - .
,
" host byte order".
, ,
-
, - .
, getservbyname() gethostbyname() inet_addr()
, ,
sockaddr_in.
.
htons() ntohs(), sin_port. htonl()
ntohl(), sin_addr. (, struct in_addr
long unsigned int.) "netinet/in.h".
unsigned short int htons (unsigned short int hostshort);
hostshort .
unsigned short int ntohs (unsigned short int netshort);
netshort .
unsigned long int htonl (unsigned long int hostlong);
hostlong .
unsigned long int ntohl (unsigned long int netlong);
netlong .
32- IPv4.
<arpa/inet.h>.
inet_addr() - , ,
32- IPv4- :
in_addr_t inet_addr(const char *addr_str);
:
ina.sin_addr.s_addr = inet_addr ("132.241.5.10");
INADDR_NONE .
inet_ntoa()
-
, ("ntoa"
"number to ascii"):
char *inet_ntoa(struct in_addr char inaddr);
:
printf ("%s", inet_ntoa (ina.sin_addr));
, inet_ntoa() IP-
IP- - .
:
1
1
2
2.9 inet_ntoa()
struct inaddr_in inaddr1,inaddr2;
char *addr1, *addr2;
.
.
addr1 = inet_ntoa (inaddr1.sin_addr); /* , 200.155.122.110 */
addr2 = inet_ntoa (inaddr2.sin_addr); /* , 198.201.6.20 */
printf (" 1: %s\n ", a1);
printf (" 2: %s\n ", a2);
:
1: 198.201.6.20
2: 198.201.6.20
, strcpy()
.
IPv6 ,
IPv6 IPv4 inet_pton() inet_ntop().
presentation ( ), n number (
).
int inet_pton(int addr_family, const char *addr_str_ptr, void *addr_prt);
: 1- , 0
, -1 .
const char inet_ntop(int addr_family, const void *addr_prt, char *addr_str_ptr,
size_t len);
: , NULL .
:
inet_lnaof()
- - .
inet_makeaddr() - .
inet_netof ()
- .
inet_network()
.
getpeername() getsockname().
"get",
getpeername() getsockname().
"sys/socket.h".
int getpeername (int sd, struct sockaddr *addr, size_t *length_ptr);
getpeername() sd
,
sockaddr, addr length_ptr.
*length_ptr. length_ptr
, addr. ,
(). ,
. getpeername() 4.2BSD.
:
"peername" , "" ,
() . " ()"
, - .
0 , :
1
1
2
EBADF
- sd - .
ENOTSOCK
- - .
ENOTCONN
- .
ENOBUFS
- .
UNIX- , fork(),
,
, , ,
, , [20].
fork() exec()
, ""
.
:
fork() , exec()
" " ,
, .
, "" ,
, , , Telnet
inetd() . 2.8.
, exec() (
) ,
exec()
,
,
0,1 2, inetd().
2.9.
2.10
#include
#define BACKLOG 5
.
.
int
listensd, acceptsd;
sock1en_t
client_len;
struct sockaddr_in server, client;
/* IPv4 */
listensd = socket(AF_INET, SOCK_STREAM, 0);
/* IPv4 */
/* server{} */
.
.
bind(listensd, &server, sizeof(server));
/* */
listen(listensd, BACKLOG);
/* */
for ( , , ) {
client_len = sizeof(c1ient);
acceptsd = accept(listensd, &c1ient, &c1ient_len);
if (fork() == 0)
{
close(listensd);
/*
*/
/*
*/
dup2(acceptsd, STDIN_FILENO);
/* */
dup2(acceptsd, STDOUT_FILENO);
/* */
dup2(acceptsd, STDERR_FILENO);
/* */
close(acceptsd);
/* acceptsd */
xec();
/* */
1
2
}
close(acceptsd):
}
.
.
/* */
:
STDIN_FILENO, STDOUT_FILENO STDERR_FILENO Posix1
UNIX- 0,1 2 (STDIN, STDOUT STDERR).
, 3
? , , TCP-
, .. , STDIN
, STDOUT- ,
STDERR .
getpeername().
,
, , .
getsockname()
int getsockname (int sd, struct sockaddr *addr, size_t *length_ptr);
getsockname() ,
addr length_ptr. , length_ptr ;
addr,
.
.
:
1. connect()
TCP, bind(), getsockname()
IP- , .
2. TCP- bind(),
.
3. TCP, bind() IP INADD_ANY, (
accept() ), getsockname(),
IP- . sd ( )
, .
get getaddrinfo()
getnameinfo(), Posix.1g. getaddrinfo(),
, addrinfo.
IPv4 IPv6
, , .
[19]
14. UNIX-like /
- TCP-
-,
TCP- (. 2.12)
. read() write() send() recv().
1
2
. 2.12. TCP- -
TCP-
,
. TCP. , , :
TCP- ( )
( )
. TCP-
, , 3490 (
, 1024). :
Tcp_client.exe www.aport.ru .
numbytes,
.
2.11 UNIX TCP-
#include <stdio.h>
/* */
#include <unistd.h> /* */
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <netdb.h>
#define port 3490
/* (),
*/
1
3
#define MAXDATASIZE 100 /* , */
int main( int argc, char *argv [])
{
int sd, numbytes;
/* */
char buf [MAXDATASIZE];
/* */
struct hostent *he;
/* he hostent */
struct sockaddr_in their_addr;
/* */
if (argc! = 2)
{
fprintf (stderr, " : hostname\n ");
exit (1);
}
if ((he=gethostbyname (argv [1])) == NULL) /* DNS
IP- */
{
herror ("gethostbyname");
/* herror() */
exit (1);
}
/* , , */
if ((sd = socket (AF_INET, SOCK_STREAM, 0)) == -1)
{
perror ("socket");
/* perror() */
exit (1);
}
their_addr.sin_family = AF_INET;
/* */
their_addr.sin_port = htons (port);
/* short, */
their_addr.sin_addr = * ((struct in_addr *) he -> h_addr);
bzero(&(their_addr.sin_zero), 8);
/* struct */
/* struct sockaddr_in their_addr */
if (connect (sd, (struct sockaddr *)&their_addr, sizeof (struct sockaddr)) == -1)
{
perror ("connect");
/* */
exit (1);
}
if ((numbytes=recv (sd, buf, MAXDATASIZE, 0)) == -1)
{
/* */
perror ("recv");
exit (1);
}
/* */
buf [numbytes] = '\0 ';
printf (" : %s ", buf);
close (sd);
/* , , */
return 0;
}
TCP-
( ):
, ,
<stdio.h>
<unistd.h>
<stdlib.h>
<errno.h>
1
3
#include <string.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/wait.h>
/* WNOHANG*/
#define MYPORT 3490
/* , */
#define BACKLOG 10
/* */
int main()
{
int sd, newsd; /* sd, newsd */
struct sockaddr_in my_addr;
/* */
struct sockaddr_in their_addr; /* () */
int sin_size;
/* , , */
if ((sd = socket (AF_INET, SOCK_STREAM, 0)) == -1)
{
perror ("socket");
exit (1);
}
my_addr.sin_family = AF_INET;
/* */
my_addr.sin_port = htons (MYPORT);
/* short, */
/* - IP- */
my_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(my_addr.sin_zero), 8);
/* struct */
/* - */
if (bind(sd, (struct sockaddr *)&my_addr, sizeof (struct sockaddr)) == -1)
{
perror ("bind");
exit (1);
}
/* MYPORT */
if (listen (sd, BACKLOG) == -1)
{
perror ("listen");
exit (1);
}
while(1)
/* accept()*/
{
sin_size = sizeof (struct sockaddr_in);
if ((newsd = accept (sd, (struct sockaddr *)&their_addr, &sin_size)) == -1)
{
perror ("accept");
continue;
/* , */
}
/* */
printf (" : %s\n ", inet_ntoa (their_addr.sin_addr));
if(!fork ())
{
/* */
/* , , newsd */
/* - */
/* 14 */
if (send(newfd, " , ! \n", 14, 0) == -1)perror ("send");
close(newsd);
/* newsd */
exit (0);
/* */
}
/* -*/
close (newsd);
/* newsd */
while (waitpid (-1, NULL, WNOHANG) > 0);
/* */
}
/* accept()*/
}
/* */
1
3
, UNIX-,
.
UNIX fork(). , (,
child) (, parent) .
- , ,
( ,
). init .
()
. exec()
.
wait(). exit().
,
:
- ,
wait(), ;
wait(),
"", .. , ,
.
,
init().
, fork() ""
2 ,
close(newsd), , , ,
.
while (waitpid (-1, NULL, WNOHANG) > 0);
-.
.
wait(), waitpid()
. -,
pid. ,
1 , .
WNOHANG. ,
() waitpid(),
-. wait()
- pid.
- NULL , -
.
- UDP-
-, UDP- (. 2.13)
.
1
3
. 2.13. UDP- -
bind() connect() .
UDP-
UDP- , :
Udp_client.exe localhost Hello, World!
2.13 UNIX UDP-
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/socket.h>
#define MYPORT 4950
/* , */
int main(int argc, char *argv[])
{
int sd;
struct sockaddr_in their_addr;
/* */
struct hostent *he;
/* he hostent */
int numbytes;
if (argc != 3) /* , */
{
fprintf(stderr, "usage: talker hostname message\n");
exit(1);
}
if ((he=gethostbyname(argv[1])) == NULL) /* - */
{
herror("gethostbyname");
exit(1);
}
if ((sd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
{
/* UDP- */
1
3
perror("socket");
exit(1);
}
/* () */
their_addr.sin_family = AF_INET;
/* */
their_addr.sin_port = htons(MYPORT);
/* short, */
their_addr.sin_addr = *((struct in_addr *)he->h_addr);
bzero(&(their_addr.sin_zero), 8);
/* */
if ((numbytes=sendto(sd, argv[2], strlen(argv[2]), 0, (struct sockaddr *)&their_addr,
sizeof(struct sockaddr))) == -1)
{
perror("sendto");
exit(1);
}
printf("sent %d bytes to %s\n",numbytes,inet_ntoa(their_addr.sin_addr));
close(sd);
return 0;
}
UDP-
"" (, 4950.)
2.14 UNIX UDP-
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define MYPORT 4950
/* , */
#define MAXBUFLEN 100
main()
{
int sd;
struct sockaddr_in my_addr;
/* */
struct sockaddr_in their_addr;
/* ,
() */
int addr_len, nb;
char buf[MAXBUFLEN];
if ((sd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
{
perror("socket");
exit(1);
}
my_addr.sin_family = AF_INET;
/* */
my_addr.sin_port = htons(MYPORT);
/* short, */
my_addr.sin_addr.s_addr = INADDR_ANY;
/* IP- */
bzero(&(my_addr.sin_zero), 8);
/* */
if (bind(sd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
{
perror("bind");
exit(1);
}
addr_len = sizeof(struct sockaddr);
/* "" , */
/* recvfrom() */
if ((nb=recvfrom(sd, buf, MAXBUFLEN, 0, (struct sockaddr *)&their_addr, &addr_len)) == -1)
{
perror("recvfrom");
1
3
exit(1);
}
/* */
printf("Got packet from %s\n",inet_ntoa(their_addr.sin_addr));
printf("Packet is %d bytes long\n",nb);
/* */
buf[nb] = '\0';
printf("Packet contains \"%s\"\n",buf);
/* */
close(sd);
}
TCP/UDP
bzero(). API
UNIX. T : bzero(), bcopy() bcmp()
,
, . , BSD.
System V: memset(), memcpy() memcmp().
void *bcopy (void *from, const void *to, size_t size)
memmove(), , . . .
void *bzero (void *block, size_t size) - memset(),
, . . .
bzero( buf, sizeof( buf) );
/* buf, BSD. */
memset( buf, 0, sizeof( buf) );
/* buf, System V. */
.sin_zero ,
. 0 UNIX
"panic". , ? ,
"",
.
Windows , ,
.
perror() herror().
#include <stdio.h>
#include <errno.h>
void perror(const char *s);
void herror(const char *s);
perror() (STDERR )
, ,
. . ( s NULL
*s NULL) s, "connect".
- , , ,
.
, .
, -1 errno
(
errno.h). .
perror() . ,
errno :
, (, ,
, ). , , , perror(), errno .
herror().
gethostbyname() gethostbyaddr()
.
h_errno, , ,
1
1
3
. , ,
herror(), perror().
, gethostbyname(),
:
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netdb.h>
"localhost". , 127.0.0.1.
15. UNIX-
UNIX-
, , login, shell, telnet,
ftp, pop3 .. ""
, .
( inetd) /etc/inetd.conf
/etc/services.
select(). ,
, select() (. 2.14).
inetd xinetd, IPv6
. xinetd RedHat 7-
. ,
xinetd inetd .
inetd
UNIX- .
, inetd,
:
, inetd:
socket(), bind(), listen(), accept().
0,1 2 (
). -
exit() .
/etc/services /etc/inetd.conf.
TCP- inetd , ,
, stdin, stdout stderr,
. ,
1
1
3
inetd
"/etc/inetd.conf" inetd, .
, , ,
, . , "*",
.
:
service style protocol wait username program arguments .
service , .
, "/etc/services". inetd service, ,
.
style protocol .
,
"SOCK_", , "stream" "dgram".
, "/etc/protocols". "tcp"
"udp" .
user , . inetd
root, ID
. "root" ;
, Telnet FTP, username .
root ,
, .
program - .
, .
,
.
"/etc/inetd.conf":
ftp stream tcp nowait root /libexec/ftpd ftpd,
talk dgram udp wait root /libexec/talkd talkd .
"/etc/inetd.conf" ,
inetd , inetd SIGHUP.
ID inetd, , ps.
16.
TCP/IP
.
1
1
3
(TCP, UDP, IP), IP, TCP UDP
.
. "sys/socket.h".
, ,
TCP/IP
. ,
.. , Windows,
, , UDP_CHECKSUM Windows
UDP_CHECKSUM _COVERAGE.
Windows MSDN.
. 2.15
getsockopt() optname
.
int getsockopt (int sd, int level, int optname, void *optval, size_t *optlen_ptr);
, optval.
*optlen_ptr ; ,
, .
optval int.
getsockopt() 0 -1 .
errno :
EBADF
sd .
ENOTSOCK
sd .
ENOPROTOOPT
ptname .
setsockopt() , optname
.
int setsockopt (int sd, int level, int optname, void *optval, size_t optlen);
optval, optlen.
: , , ,
. (on/off),
optval , , - ,
. optlen sizeof (int). , optval
, , optlen -
. , Windows BOOL,
MSDN DWORD. BSD 4.*, int. POSIX
, socklen_t.
1
3
setsockopt() , getsockopt().
level :
2.
int SOL_SOCKET
int IPPROTO_TCP
int IPPROTO_IP
int IPPROTO_UDP
int IPPROTO_ICMPV6
int IPPROTO_IPV6
TCP
IPv4
UDP
ICMPv6
IPv6
:
IPv6 . IGMP IPv4 IPv4.
setsockopt() getsockopt() ,
.
50.
setsockopt()
; "sys/socket.h". , ,
getsockopt(), Unix- . Windows
,
MSDN.
SO_DEBUG
TCP-. int; "".
trpt.
SO_REUSEADDR
bind()
. ,
-, IP- .
IP- (aliases ),
(primary) IP- .
. ,
UDP [19].
,
, FTP, .
.
int; "".
"" . ,
TIME_WAIT, TCP ,
"" , 2MSL,
"Address already in use".
SO_REUSEPORT
4.4BSD
.
1
1
4
SO_KEEPALIVE
, TCP- keepalive
probe . ,
. int;
"". TCP- 120 ,
(, )
TCP- .
SO_DONTROUTE
.
,
. .
int; "".
SO_LINGER
close() TCP-.
close() ,
, FIN.
close() ,
linger.
struct linger
{
int 1_onoff;
/* / . */
int 1_1inger;
/* . Posix1.g - ,
*/
};
:
int l_onoff
. ,
SO_LINGER , . 1_1inger .
l_onoff , l_linger.
int l_linger
l_onoff ( ), l_linger=0,
" 0 ", TCP- .. FIN,
RST (hard close). l_linger ,
, close(), . TCP-
(graceful close),
. close() EWOULDBLOCK,
.
Windows- API
shutdown(), closesocket().
SO_DONTLINGER
.
SO_LINGER l_onoff=0.
SO_BROADCAST
, UDP- .
int; "".
,
(Ethernet, Token Ring . .).
- .
,
, . , UDP
IP- ,
1
1
4
, . ,
, , :
, EACCESS.
SO_SNDBUF
(get) (set) .
size_t .
SO_RCVBUF
(get) (set) .
size_t .
, WinSock SO_SNDBUF SO_RCVBUF
TCP [MSDN], Windows
Alun
Jones
:
[http://groupsbeta.google.com/group/microsoft.public.win32.programmer.networks/browse_thread/thread/3f4ea7497cb02a6a/73e5239c03d
bad25?q=arkadyf+%22large+tcp+window%22#73e5239c03dbad25]: "To set the window size larger, I increase the send and
receive buffer using setsockopt() before calling listen() or connect(). That may be a slight overkill, but it guarantees me what
I need. I also need to set the options discussed previously to enable large window scale options at all."
http://www.microsoft.com/technet/prodtechnol/windowsserver2003/technologies/networking/tcpip03.mspx#EGAA.
Unix-, , ,
[19].
SO_RCVLOWAT, SO_SNDLOWAT
/,
select(). TCP 1 .
- ,
, TCP- 2048.
SO_RCVTIMEO, SO_SNDTIMEO
, /
. timeval
. WinSock 2
timeval .
:
Windows SO_RCVTIMEO, SO_SNDTIMEO recv()
send() ,
connect().
SO_OOBINLINE
TCP, URG , Urgent Pointer.
" ",
TCP 8 (1 ) , "
out-of-band data".
.
SO_OOBINLINE, , ioctl()
SIOCATMARK - .
SIGURG.
URG=1 TCP- , - ,
, .
16- Urgent Pointer ,
" ".
1
4
. 2.16
.2.12 -.
, . N
, ""
1, 2 OOB .
Urgent Pointer OOB .
.
"" :
2.15
.....
write(sd, "abc",3);
printf(" 3 abc"\n);
/* 1 . TCP_ */
sleep(1);
send(sd, "9",1,MSG_OOB);
/* */
printf(" 1 9"\n);
......
send() MSG_OOB.
, -
; ,
recv() MSG_OOB.
OOB- ,
TCP-, ( )
, TCP-
. , TCP.
, - " "
( MSG_OOB)
TCP- SO_OOBINLINE.
SO_OOBINLINE int; "".
, ,
SIGURG - . , F_SETOWN
fcntl().
. TCP-
accept().
( SIGURG select()) ,
, , ,
. , , recv()
EWOULDBLOCK.
, , "out-of-band mark"
, " ".
Posix1.g sockatmark()
ioctl() SIOCATMARK, :
success = ioctl (sd, SIOCATMARK, &result);
() ,
, :
1
1
4
2.16 ""
int read_until_mark (int sd)
{
while (1)
{
char buf[1024];
int flag, success;
/* , flag=1*/
success = ioctl (sd, SIOCATMARK,&flag);
if (success < 0) perror ("ioctl");
if (flag) return;
/* , */
success = read (sd, buf, sizeof buf);
/* */
if (success < 0) perror ("read");
}
}
() TCP,
. " "
telnet Ctrl+C.
.
"" "
", , .
SO_KEEPALIVE , . -,
2 . -,
,
, SO_KEEPALIVE,
. "" , 1
, 5 . " "
[19]
(RFC-793 RFC-1122),
,
. , Urgent Pointer,
""
OOB.
FreeBSD 5.0-CURRENT SO_ACCEPTFILTER,
accept-. - dataready httpready.
HTTP- (, Apache)
,
HTTP-, .
TCP
IPPROTO_TCP
TCP.
TCP_KEEPALIVE
"keep alive" .
SO_KEEPALIVE.
TCP_MAXSEG
1
1
4
MSS TCP-.
TCP_NODELAY
Nagle, (
MSS) , ACK (ACK ).
UDP
IPPROTO_UDP
UDP.
UDP_CHECKSUM
, UDP.
int. 0 = OFF, non-zero = ON.
IP
IPPROTO_IP
IP.
IP_HDRINCL
SOCK_RAW, IP-
.
IP_OPTIONS
, IP-o IP-
.
IP_TOS
type-of-service IP- .
IP_TTL
time-to-live IP- .
Windows IPX/SPX NSPROTO_IPX,
Windows Me/98/95 ,
.
51.
getsockopt()
SO_DEBUG
, , .
SO_BROADCAST
, , .
SO_ACCEPTCONN
, ( ,
listen()).
SO_ERROR
so_error, <sys/socketvar.h>,
, so_error .
SO_LINGER
close(), linger-.
SO_OOBINLINE
, , .
SO_KEEPALIVE
1
1
4
,
. TCP_KEEPALIVE
.
. [19] :
SO_KEEPALIVE TCP 2
, TCP
(keepalive probe). TCP,
.
1 , .
( ). TCP
2
2. , RST, TCP,
. , ,
ECONNRESET, .
3. . TCP,
, 75 ,
. TCP , 11
15 . TCP
, , , ETIMEDOUT,
. ICMP
, , .
ICMP Host unreachable ( )
, , . ,
, EHOSTUNREACH.
SO_RCVLOWAT
, .
SO_RCVTIMEO
timeout .
SO_REUSEADDR
, , bind(),
.
SO_SNDLOWAT
, .
SO_SNDTIMEO
timeout .
SO_TYPE
. getsockopt(). ,
(SOCK_DGRAM SOCK_STREAM) ,
.
TCP
TCP_KEEPALIVE
( ) keepalive.
int. SO_KEEPALIVE.
UDP
UDP_CHECKSUM
, UDP.
,
.
1
1
4
IP_RECVDSTADDR
, , IP-
, IP- UDP
. recvmsg()
, . ,
. BSD/386, 4.4BSD AIX 3.2.2
. SVR4, SunOS 4.x Solaris 2.x .
IP
IP_HDRINCL
, IP- .
IP_OPTIONS
, IP- IP-
.
IP_TOS
type-of-service IP- .
IP_TTL
time-to-live IP- .
, Sockets
API . , 1.1 WinSock
IP.
2.16 setsockopt()
getsockopt() . , optval .
2.17 setsockopt() getsockopt()
# include
<sys/socket.h>
.
int
res,sd;
int
sockbufsize=16384;
int
sbufsize;
size_t len = sizeof(sbufsize);
sd=socket(AF_INET,SOCK_STREAM,0);
.
/* */
res = setsockopt(sd, SOL_SOCKET, SO_SNDBUF, &sockbufsize, sizeof(sockbufsize));
.
/* */
res = getsockopt (sd, SOL_SOCKET, SO_SNDBUF, &sbufsize, &len);
.
52.
, , ,
IGMP. bind() D,
( 0, TCP/IP ).
.
API . ,
setsockopt()
getsockopt(). level getsockopt() setsockopt() IPv4
- IPPROTO_IP.
1
4
. (struct im_req),
in_addr.
IP_ADD_MEMBERSHIP
IP_ADD_MEMBERSHIP
. ,
. ,
. ,
MAC-, .
:
struct ip_mreq
{
struct in_addr imr_multiaddr; /* "" */
struct in_addr imr_interface; /* , */
}
c,
. setsockopt() SO_REUSEADDR,
. TCP/IP
IGMP Host Membership Report 224.0.0.1 ( "-").
IP_DROP_MEMBERSHIP
IP_DROP_MEMBERSHIP .
TCP/IP .
IP_DROP_MEMBERSHIP ,
1.
( ) 0, MAC . IGMP-.
IP_MULTICAST_IF
IP_MULTICAST_IF ,
/ .
. ,
,
.
.
IP_MULTICAST_LOOP
IP_MULTICAST_LOOP
, , .
. ,
, , ,
.
IP_MULTICAST_TTL
TTL , .
, ,
TTL -1. 7
WinSock API, .
IPv6 IP_ IPV6_,
.
IPV6_MULTICAST_HOPS, .
1
4
17.
(Raw Socket) ,
, ,
, ICMP,
. . [19] Raw Socket "
" . , ,
.
SOCK_STREAM SOCK_DGRAM
SOCK_RAW. ,
, ICMP.
Af = AF_INET, type = SOCK_RAW, protocol = IPPROTO_ICMP
IP- ,
. "" IP- ,
IP, .
, ( IP) , . ICMP, ICMP-, .
ICMP-, ,
. ,
, .
.
, , . ,
TCP UDP ; ICMP- ,
"", .
""
PING. TCP/IP ICMP- ECHO (
, , ). ECHO, ECHO
,
. ,
( WinSock 1.1) 3.
Windows- Windows 200, Windows XP RAW .
ICMP ""
, , ICMP
.
, :
IP_HDRINCL:
IPv4-,
IP-.
IGMP;
, , , ,
OSPF, BGP IP.
, ,
TCP UDP. ,
.
. 9.
.
1
1
4
,
. bind() connect()
, .
, ,
"" .
*nix [19].
: socket(AF_INET, SOCK_RAW, IPPROTO_RAW),
IPPROTO_RAW, 255 IP.
, IPPROTO_RAW , .
IP-
? -
TCP/IP, ,
+. Linux- . ,
Linux- SOL_RAW.
, Linux- Raw Sockets ,
IP, ICMP TCP,
(. 5.2).
. ,
( , BSD) .
18. Nagle
TCP-, ,
TCP- (HTTP, FTP, ,
News), (, telnet
rlogin, IRC ). ( ) [37],
90% , 10% . ,
, , (512
), . ,
, 90% , telnet rlogin, 10
.
TCP ,
.
() rlogin (remote login). ,
(Nagle)
, . telnet.
, rlogin- [37].
, TCP/IP, ,
, IP-
. , 1
( ). , rlogin ,
. TCP-:
1.
,
6. ,
7.
8. .
. 2.17 .
1
5
. 2.17. rlogin
( )
- ( ACK).
rlogin .
rlogin- 1 . IP-
41 : 20 IP-, 20 TCP- 1 .
, telnet ,
, .
tcpdump,
Client 1023 Server rlogin:
1
Client.1023 -> Server.login: P 0:1(1)
2
Server.login -> Client.1023: P 1:2(1)
3
Client.1023 -> Server.login: .
4
Client.1023 -> Server.login: P 1:2(1)
5
Server.login -> Client.1023: P 2:3(1)
6
Client.1023 -> Server.login: .
7
Client.1023 -> Server.login: P 2:3(1)
8
Server.login -> Client.1023: P 3:4(1)
9
Client.1023 -> Server.login: .
10
Client.1023 > Server.login: P 3:4(1)
11
Server.login -> Client.1023: P 4:5(1)
12
Client.1023 -> Server.login: .
13
Client.1023 -> Server.login: P 4:5(1)
14
Server.login -> Client.1023: P 5:7(2)
15
Client.1023 -> Server.login: .
16
Server.login -> Client.1023: P 7:37(30)
17
Client.1023 -> Server.login: .
18
Server.login -> Client.1023: P 37:44(7)
19
Client.1023 -> Server.login: .
ACK window
ack 1 win 4096
ack 1 win 4096
ack 2 win 4096
ack 2 win 4096
ack 2 win 4096
ack 3 win 4096
ack 3 win 4096
ack 3 win 4096
ack 4 win 4096
ack 4 win 4096
ack 4 win 4096
ack 5 win 4096
ack 5 win 4096
ack 5 win 4096
ack 7 win 4096
ack 5 win 4096
ack 37 win 4096
ack 5 win 4096
ack 44 win 4096
, "date\n",
, , 30 .
BSD/386, TOS IP- rlogin-
, . P Push ,
BSD , .
1
1
5
1 1 (d). 2
( .) 3 ,
. 4-6 a, 7-9 t,
10-12 - e.
13-15.
(UNIX- , ENTER),
. (CR/LF),
.
16 date, . 30
28
Sat Feb 6 07:52:17 MST 2004
CR/LF .
( , tiny , )
, ,
. RFC 896 (John Nagle,1984),
, (Nagle algorithm).
, TCP-
"" , . TCP ""
, MSS.
, . , , ,
TCP-,
. :
, .
, ,
.
, , - RTT,
.
: -
, ;
, ,
. TCP Nagle .
Nagle
, Nagle .
UNIX- X Window: (
) ,
.
,
.
,
escape- ASCII. TCP- 1 ( ) ,
(ASCII ESC), ,
. ,
, -, .
ACK, ,
200 .
.
Host Requirements RFC , TCP
Nagle,
. API TCP_NODELAY,
Nagle.
1
5
Nagle
[37].
1: Nagle - ( !)
"" . "ServerApp"
"hello\n" CLIENT APP, .
TCP CLIENT APP
[ ]
"h" ------>
[1 ]
------------------>
-----------> "h"
[ack , 0,2 .]
[ ]
"hello\n" --->
[6 bytes]
------------------>
------------> "hello\n"
<------------ "HELLO\n"
[6 , ack 6 ]
<-----------------"HELLO\n" <---[ack ]
.
.
1
1
5
. [ack 6 ]
------------------>
: 3. = RTT (. . ).
19. TCP/IP
, ,
TCP/IP.
- TCP,
.
2.18.
TCP, -.
4- :
, TCP,
socket(). TCP
SO_SNDBUF SO_RCVBUF (. 2.9.1). send(),
IPC (Inter Process Communication)
TCP , , .
TCP ( ,
IPC
TCP
connect()
send()
send()
recv()
IPC
TCP
SYNACK
TCP
TCP
TCP
TCP
2.18 TCP
TCP-
accept()
send()
recv()
send()
), send()
( - ,
). TCP ,
. ,
send() .
connect() 2.18
, TCP.
, . -, connect()
, SYN
ACK SYN- TCP
.
, .
, - .
, ,
.
TCP, UDP ,
. TCP
Receive Window,
TCP TCP. TCP ,
, .
- ,
, TCP
.
UDP , , , ..
. UDP ,
, UDP
. UDP
.
, SO_RCVBUF SO_SNDBUF
, , .
- 4096 ,
8192 61 440 .
UDP 9000 , NFS;
UDP 40 000 ,
250.
TCP
TCP, , SO_RCVBUF
connect(), ,
1isten().
, accept(),
, accept()
threeway handshake,
.
TCP-
MSS -
, 4MSS, 8xMSS.
, .
1. 3 Windows Sockets
20.
WinSock Windows Sockets (API)
MS Windows TCP/IP [16], [30], [2], [12],
[27],[28]. Windows- TCP/IP (
WinSock ). ,
- UNIX, API
. Windows Windows 9x,
(DLL).
winsock.dll (16 , WinSock 1.1) wsock32.dll ( BSD-sockets)
ws2_32.dll (32 , WinSock 2.0).
UNIX Windows , Windows Sockets
, WinSock API Windows,
"", Windows .
WinSock:
WinSock 1.0 WinSock 1.1
WinSock 2.0
WinSock 2.2.0
TCP/IP
, 1992
TCP/IP
, 1993
WinSock 1.1 AF_INET
TCP/IP
,
1994 .
,
1996 .
3.1 WinSock
WinSock
Windows 95
1.1 (2.2)
Windows 98
2.2
Windows Me
2.2
2.2
Windows CE
1.1
WinSock :
Windows
Windows,
.
TCP/IP, .
( , , )
TCP/IP, ,
WinSock. . 3.1 , WinSock
TCP/IP- Windows. ,
WinSock, 3.2
3.2 WinSock
Winsock.dll
Wsock32.dll
Ws2_32.dll
Mswsock.dll
Ws2help.dll
- ,
WinSock
Wshtcpip.dll
TCP
Wshnetbs.dll
NetBT
Wshirda.dll
IrDA
Wshatm.dll
ATM
Wshisn.dll
Netware
Wshisotp.dll
OSI-
Sfmwshat.dll
Macintosh
Nwprovau.dll
IPX
Rnr20.dll
Winrnr.dll
LDAP
Msafd.dll
WinSock
Afd.sys
.
WinSock , SOCKET, .
UNIX ( )
. , Windows UNIX, ,
. , .
WinSock .
WinSock SOCKET (unsigned).
INVALID_SOCKET.
(SOCKET)(~0) (-1) .
,
INVALID_SOCKET-1. , , , 0xFFFF. . UNIX Windows,
, ,
( ), WinSock.
, WinSock Windows.
, -.
21. -,
WinSock
.
.
. 3.4 , WinSock.
3.4. ,
accept()
.
, .
.
closesocket() . close()
Connect()
recv()
Recvfrom()
select()
-
.
send()
sendto()
( .)
- WinSock
read()
recv()
write()
send()
close()
closesocket()
ioctl()
ioctlsocket()
close() Windows , ..
. , closesocket()
.
ioctlsocket(). - ioctl()
fcntl() . :
int ioctlsocket(SOCKET sd,long cmd, u_long FAR *argp);
:
sd
cmd
argp
[in]
[in] , sd
[in/out] cmd
SOCKET_ERROR .
ioctlsocket() :
FIONBIO
argp, ,
sd. argp , .
argp . BSD.
WSAAsyncSelect() WSAEventSelect() .
WSAAsyncSelect() WSAEventSelect() ,
ioctlsocket() WSAEINVAL.
, WSAAsyncSelect(), WSAAsyncSelect()
lEvent, , WSAEventSelect(), WSAEventSelect()
lNetworkEvents, .
FIONREAD
, , ,
sd. argp ,
ioctlsocket() . sd (SOCK_STREAM), FIONREAD
, recv();
, ,
TCP/IP. sd (SOCK_DGRAM), FIONREAD
(), .
SIOCATMARK
, OOB- . (.
" "). ,
inline-
(SO_OOBINLINE). OOB-, TRUE.
FALSE, recv(), ,
, .
SIOCATMARK, , . ,
, . ( recv()
OOB .) argp
, ioctlsocket() (Boolean).
ioctlsocket() Windows 2000
, " " - promiscuous
mode, - ,
.
IP Ethernet-, .
, MAC-
. setsockopt() SIO_RCVALL
(SOCK_RAW)
127.0.0.1 - "", , ,
, IP.
, , 127.0.0.1 .
SIO_RCVALL Mstcpip.h.
SIO_RCVALL
.
sockaddr_in sa;
ULONG PromiscuousMode=1;
sd=socket(AF_INET, SOCK_RAW, IPPROTO_IP);
if (sd==INVALID_SOCKET) return 1;
memset(&sa,0,sizeof(sockaddr_in));
sa.sin_family=AF_INET;
sa.sin_addr.s_addr=inet_addr(server_ip);
sa.sin_port=htons(0);
if ( bind(sd,(LPSOCKADDR)&sa,sizeof(sa)) )
{
printf("bind error\n");
return 1;
}
if ( ioctlsocket(sd,SIO_RCVALL,&PromiscuousMode) )
{
printf("ioctlsocket error\n");
return 1;
}
.
.
. , , , readv(), writev(), recvmsg() sendmsg().
, . 3.5, - .
, .
, , ,
.
3.5 , WinSock API.
bind()
() .
() .
htonl()
32- .
htons ()
16- .
inet_addr()
IP- 32- (
).
inet_ntoa()
IP- - .
ioctlsocket()
, -.
listen()
ntohl()
32- .
ntohs()
16- .
setsockopt()
() .
shutdown()
( ).
socket()
gethostbyaddr()
() IP-, .
gethostbyname()
() IP-, .
gethostname()
getprotobyname()
(, TCP).
getprotobynumber()
getsenbyname()
(, time) ,
.
getservbyport()
,
.
. 3.53.6 ,
hostent.
WinSock . ,
, ,
, , ,
. , ,
WinSock.
WinSock
( Windows) ,
gethostname(). Windows-
. Windows
. . 3.7
. WinSock API.
3.7. WinSock I
gethostbyaddr()
WSAAsyncGetHostByAddr()
gethostbyname()
WSAAsyncGetHostByName()
gethostname()
He
getprotobyname()
WSAAsyncGetProtoByName()
getprotobynumber()
WSAAsyncGetProtoByNumber()
getservbyname()
WSAAsyncGetServByName()
getservbyport()
WSAAsyncGetServByPort()
, Windows-
WSA (Async ). WSA - Windows
Sockets API - WinSock 1.1,
WinSock 2.0
22. -, Windows
WinSock
,
, - Windows.
Windows . . 3.8
Windows-, WinSock API 1.1,
, . 3.7.
3.8. - Windows (
)
WSAAsyncSelect()
select().
WSACancelAsyncRequest()
WSAAsyncGetXByY().
WSACancelBlockingCall()
API.
WSACleanup()
WinSock , DLL.
WSAGetLastError()
WSAIsBlocking()
, winsock.dll .
WSASetBlockingHook()
. (. . .)
WSASetLastError()
WSAGetLastError().
WSAStartup()
winsock.dll.
WSAUnhookBlockingHook()
. ,
Windows, 3.6.1, ,
Windows-.
23.
winsock.dll (16-bit ) wsock32.dll (32-bit ),
Windows Sockets 1.1 MS Windows MS
Windows CE.
WindSock 2.0 ws2_32.dll
WSAStartup(),
:
int WSAStartup (WORD wVersionRequested, LPWSADATA lpWSAData);
WSAStartup() lpWSAData
WSADATA,
Windows Sockets.
, .
WSADATA :
typedef struct WSAData
{
WORD
wVersion;
WORD
wHighVersion;
char
szDescription[WSADESCRIPTION_LEN+1];
char
szSystemStatus[WSASYS_STATUS_LEN+1];
unsigned short
iMaxSockets;
unsigned short
iMaxUdpDg;
char FAR *
lpVendorInfo;
} WSADATA;
typedef WSADATA FAR *LPWSADATA;
szDescription szSystemStatus
WSAStartup() , , Windows
Sockets .
WSASYSNOTREADY
WSAVERNOTSUPPORTED
WinSock
WSAEINVAL
DLL, WinSock, ,
wVersionRequested
Windows Sockets
, Windows Sockets 1.1,
WSAStartup() ,
WSAStartup() Windows Sockets DLL ,
, ,
.
3.10
Windows Sockets.
3.10. winsock.dll
,
DLL
wVersionR
equested
wVersion
wHighVersion
1.1
1.0 1.1
1.0
1.1
1.1
1.0
1.0 1.1
1.1
1.0
1.0 1.1
1.0 1.1
1.0
1.1
1.0 1.1
1.1
1.1
1.0
1.1
1.1
1.0
1.1
1.1
1.0
1.0
1.1
1.0
--1.1
1.1
1.0
1.1
1.1
1.0
--1.1
1.1
1.0
1.0
1.1
WSAVERNOTSUPPORTED
1.1
1.1 2.0
2.0
1.1
1.1
2.0
2.0
1.1
1.1
1.1
1.1
1.1
3.1 , , Windows
Sockets 1.1, WSAStartup():
3.1
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
/* , winsock.dll, , */
return;
}
/* , winsock.dll 1.1.*/
/* 1.1 wVersion, , */
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
/* , WinSock.dll, , */
WSACleanup( );
return;
}
/* winsock.dll a. . */
MAKEWORD(), WORD
:
WORD MAKEWORD(BYTE bLow, BYTE bHigh);
:
3.2
rc = WSAStartup (MAKEWORD(1, 1), &WSAData);
if(rc != 0)
{
MessageBox(NULL, "WSAStartup Error", "Error", MB_OK);
return FALSE;
}
3.3 , WSAStartup()
winsock.dll, 1.1:
3.3 WSAStartup()
/* , >= 1.1. */
/* , . */
if ( LOBYTE( wVersionRequested ) < 1 || ( LOBYTE( wVersionRequested ) == 1 &&
HIBYTE( wVersionRequested ) < 1 )
{
return WSAVERNOTSUPPORTED;
}
/* 1.1, wVersion wHighVersion 1.1. */
lpWsaData->wVersion = MAKEWORD(1,1);
lpWsaData->wHighVersion = MAKEWORD(1,1);
WSACleanup() WinSock-DLL
WinSock. , WSACleanup()
(, Windows 95 N).
SOCKET_ERROR .
WSAGetLastError(),
Windows Sockets
3.7.2. ,
. WSACleanup(),
WSAGetLastError() , 3.11:
3.11.
WSANOTINITIALISED
WSAENETDOWN
WSAEINPROGRESS
WSACleanup()
Windows Sockets
24. Windows
.
"" " ",
, .
, , ,
.
, ,
Windows . ,
Windows
, . ,
Windows- WinSock API
. , - ioctl() fcntl()
ioctlsocket() WinSock ( WSAIoctl () 2.0)
. , ,
!
53.
Windows-
Windows- ,
.
. Windows-,
.
Windows .
WinMain()
Windows-, ,
WinMain(). (++)
main(). (), ,
, ( ).
,
. Windows ,
, .
Windows
Windows- ,
(header) . HANDLE, HWND, BYTE, WORD,
DWORD, UNIT, LONG, BOOL, LPSTR LPCSTR. HANDLE 32- ,
. ,
// () ;
// ;
// ;
// ;
// ;
// .
, , Windows
, (handle) ,
() (16- 32-). 16-
wParam , ,
32- lParam , -
. ,
, .
Windows- - .
. ,
. Windows .
WinMain() .
:
MSG msg;
/*, */
while (GetMessage(&msg, 0, 0, 0))
{
TranslateMessage (&msg) ;/*
-*/
DispatchMessage (&msg); /* */
}
. ,
while . ,
GetMessage() FALSE. ,
WM_QUIT, ,
. , API
PostQuitMessage(), .
PostQuitMessage(100) 100.
GetMessage() MSG,
. WM_QUIT,
GetMessage() TRUE, .
GetMessage() - , .
NULL, , ,
. - NULL,
.
,
.
0, .
MSG,
API:
TranslateMessage()
DispatchMessage().
TranslateMessage() ,
WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN WM_SYSKEYUP
WM_CHAR, WM_DEADCHAR, WM_SYSCHAR WM_SYSDEADCHAR.
, .
DispatchMessage() ,
Windows-, .
, ,
DefWindowProc().
, , . .
Windows-
, ,
. .
Windows, .
.
.
. Windows-, , Windows
callback functions. ,
,
,
.
Windows, ,
. , ,
Windows. ,
, Windows , .
3.4
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_CREATE:
break;
case WM_DESTROY:
PostQuitMessage(0); // WM_DESTROY
break;
default:
return DefWindowProc(hWnd, msg, wParam, lParam);//
// ,
//.
}
return 0;
}
("") ,
.
.3.2
GetMessage() , , -
. , , ,
GetMessage() PeekMessage(),
.
BOOL PeekMessage(
LPMSG lpMsg,
HWND hWnd,
UINT wMsgFilterMin,
UINT wMsgFilterMax,
INT wRemoveMsg
// MSG,
// .
// ,
// .
// . 100,
//
// 100, , .
// . 200,
//
// 200, ,
// . PM_NOYIELD
// PM_NOREMOVE
// PM_REMOVE - .
);
( ) , lpMsg.
GetMessage(), PeekMessage() ,
.
PeekMessage() , ,
, Win32 API IsChild(),
, wMsgFilterMin wMsgFilterMax.
hWnd NULL, wMsgFilterMin wMsgFilterMax ,
PeekMessage() . (PeekMessage()
, , .)
hWnd
. :
PM_NOREMOVE
.
PM_NOYIELD
PM_REMOVE
WM_USER. Windows
WM_USER,
:
#define WM_USER
#define WM_NETEVENT
0x0400
(WM_USER+1)
/* WM_USER */
/*
WM_NETEVENT */
. " ",
RegisterWindowMessage().
54.
WinSock API
, ,
. ,
WIN32 API FindWindow(), user.dll (user32.dll),
( ).
hWnd NULL, PeekMessage()
, .
, ,
CPU,
select() - .
blocking hooks, , ,
, ,
, . (hook)
Windows, ,
, .
, .
Windows,
WinSock API blocking hook
, .
Windows- ,
:
- , ,
,
.
UNIX, Windows- , FIONBIO
ioctlsocket() WSAAsyncSelect() ( 3.6.3.1)
. c,
WSAAsyncSelect() / WSAAsyncGetXByY() select() getXbyY(),
.
WinSock .
, ,
.
API WinSock, WinSock
,
:
3.6
.
for(;;)
{
/* */
while(BlockingHook()); /* BlockingHook() */
/* WSACancelBlockingCall() */
if(operation_cancelled()) break; /* , */
if(operation_complete()) break; /* */
}
.
BOOL BlockingHook(void) /* */
{
MSG
msg;
BOOL
ret;
/* , */
ret = (BOOL)PeekMessage(&msg,NULL,0,0,PM_REMOVE);/* */
if (ret)
/* , ( ) */
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
/* TRUE */
return ret;
}
Windows-c
; ,
.
WinSock : WSASetBlockingHook() WSAUnhookBIockingHook(). (. )
.
(blocking hook)
, .
WSASetBlockingHook()
WinSock 1.1 WSASetBlockingHook().
,
. :
FARPROC WSAAPI WSASetBlockingHook (IN FARPROC lpBlockFunc);
lpBlockFunc
.
- ,
GUI-,
.
( GUI- ) .
:
WSASetBlockingHook() , WinSock 1.1 ( ,
, (thread) WSAStartup() 1.0
1.1) WinSock 2 (. 4) WinSock
1.1 . WinSock 2 .
, WSASetBlockingHook():
WSANOTINITIALISED
WSAENETDOWN
WSAEINPROGRESS
WSAEFAULT
WSAStartup().
.
WinSock 1.1,
(callback function).
lpBlockFunc
.
:
() - , . - ,
Windows, , (callback functions),
. "WINAPI = CALLBACK =
__stdcall"
: () - , . -
, Windows, ,
(callback functions).
WinSock :
WSAIsBlocking() WSACancelBlockingCall(). ,
.
WSAIsBlocking() WSACancelBlockingCall()
WSAIsBlocking() ( ) TRUE,
. :
BOOL PASCAL FAR WSAIsBlocking (void);
. :
1. ,
. WSAIsBlocking() .
2. , WinSock "
" ( WSASetBlockingHook()).
WSAEINTR.
connect() WinSock ,
, (
) . ,
SO_LINGER 0.
accept() select() c,
. ;
, ,
.
, , accept() select(),
.
WSACancelBlockingCall() -
TCP- , WinSock
, closesocket(), WSAECONNABORTED.
:
, ,
WSACancelBlockingCall(), , ,
.
, WSACancelBlockingCall() . , WSACancelBlockingCall() ; , ,
, WSAEINTR .
Windows
(, ),
, Windows,
, ,
, - ,
.
,
, ,
, .
, Windows-,
API, ,
, .
:
,
,
,
.
, , ,
- ,
.
,
.
, .
55.
WinSock API
/
/ Windows (. 4.3),
Windows.
, WinSock API,
,
, .
WSAEWOULDBLOCK, ,
. recv() WSAEWOULDBLOCK,
,
, .
WSAEWOULDBLOCK
WinSock API:
WSAEWOULDBLOCK
WSAAccept() accept()
losesocket()
WSAConnect() connect()
,
.
,
setsockopt() SO_LINGER,
( ).
. ,
.
. .
WSARecv(), recv(),
WSARecvFrom() recvfrom()
WSASend(), send(), WSASendTo() .
sendto()
.
WSAEWOULDBLOCK,
. ,
, . recv()
100 recv()
MSG_PEEK.
,
.
, Windows
. , Windows .
, Windows
(, ), .
WinSock , :
(. ).
WSAAsyncSelect() WSAEventSelect() (. 4.3). WinSock
WSAAsyncGetXByY()
(WSAAsyncGetProtoByName(),
WSAAsyncGetServByPort() . .). ""
, .
55.1.1.1.
WSAAsyncSelect()
WSAAsyncSelect() Windows-
:
int WSAAsyncSelect (SOCKET sd, HWND hWnd, unsigned int wMsg, long lEvent);
, , UNIX-.
timeout.
:
sd
hWnd
wMsg
lEvent
, .
, ,
.
, , .
, ,
.
WSAAsyncSelect() 0, - SOCKET_ERROR.
:
WSAStartup()
WSANOTINITIALISED
WSAAsyncSelect().
WSAENETDOWN
.
,
WSAEINVAL
,
.
Windows 1.1,
WSAEINPROGRESS
(callback) .
WSAENOTSOCK
- .
:
: FD_CONNECT
WSAEAFNOSUPPORT
WSAECONNREFUSED
WSAENETUNREACH
WSAEFAULT
WSAEINVAL
WSAEISCONN
WSAEMFILE
WSAENOBUFS
WSAENOTCONN
WSAETIMEDOUT
.
.
namelen .
.
.
.
. .
.
.
: FD_CLOSE
WSAENETDOWN
.
WSAECONNRESET
.
WSAECONNABORTED - .
: FD_ACCEPT, FD_ADDRESS_LIST_CHANGE, FD_GROUP_QOS, FD_OOB, FD_QOS,
FD_READ, FD_WRITE
WSAENETDOWN .
: FD_ROUTING_INTERFACE_CHANGE
WSAENETUNREACH .
WSAENETDOWN
.
, , Windows
, , wMsg lEvent
:
rc = WSAAsyncSelect(s, hWnd, 0, 0);
WSAAsyncSelect() select():
select() .
WSAAsyncSelect() ,
, Uinx- FD_SET
.. .
select()
, .
Windows WSAAsyncSelect() .
, WSAAsyncSelect()
, ,
(
)
.
(Worren
Yung,
http://www.tangentsoft.net/wskfaq/)
. , ,
. Windows.
WSAAsyncSelect()
, ioctlsocket() .
WSAAsyncSelect() , .
, (
WSADuplicateSocket()),
WSAAsyncSelect() (
) .
,
,
.
WinSock 1.1 :
FD_READ
FD_WRITE
FD_OOB
FD_ACCEPT
FD_CONNECT
( )
.
FD_CLOSE
()
WinSock 2.0 :
QOS.
FD_GROUP_QOS
QOS (
).
FD_ROUTING_INTERFACE_CHANGE
.
FD_ADDRESS_LIST_CHANGE
.
.
FD_QOS
FD_READ:
WSAAsyncSelect(),
, .
2. , FD_READ .
3. recv() recvfrom() ( MSG_PEEK),
.
1.
setsockopt() SO_OOBINLINE ,
, .
FD_WRITE:
1. WSAAsyncSelect(),
send() sendto().
2. connect() accept() .
3. send() sendto(),
WSAEWOULDBLOCK, send()
sendto().
4. bind() . FD_WRITE
( ) . ,
bind().
FD_OOB: , setsockopt() SO_OOBINLINE
( ).
1. WSAAsyncSelect(),
( MSG_OOB) OOB-.
2. OOB-, FD_OOB .
3. recv() recvfrom(), / MSG_OOB , OOB .
FD_ACCEPT:
1. WSAAsyncSelect(),
.
2. , FD_ACCEPT .
3. accept(),
FD_CONNECT:
1. WSAAsyncSelect(),
.
2. connect(), , connect()
, .
3. WSAJoinLeaf(), .
4. connect(), WSAConnect(), WSAJoinLeaf()
.
WSAEWOULDBLOCK, .
, ,
FD_CONNECT .
.
FD_CLOSE:
( SOCK_STREAM).
1. WSAAsyncSelect(),
.
2. , ,
. , ,
,
, FD_CLOSE ,
.
3.
shutdown() "End of Data"
(, TCP FIN), .
FD_QOS,
FD_GROUP_QOS,
FD_ROUTING_INTERFACE_CHANGE FD_ADDRESS_LIST_CHANGE -
, Windows
. , Windows :
(16- 32-).
16- , ,
32- . 16
.
wParam ,
. lParam (
FD_XXX), - , .
lParam WinSock WSAGETSELECTEVENT
WSAGETSELECTERROR . WinSock
WSAGetSelectEvent() WSAGetSelectError().
. ,
.
FD_CONNECT ,
. "
", connect(), -
accept() ( , ,
). FD_CONNECT ,
(, ).
lParam,
, .
FD_ACCEPT
. ,
.
, sd
, :
rc = WSAAsyncSelect(sd, hWnd, wMsg, FD_READ|FD_WRITE);
WSAAsyncSelect() FD_READ,
TCP- ( , ,
, ), FD_READ. ,
FD_READ TCP ,
. , SO_RCVLOWAT
TCP, FD_READ.
-, .
, WSAAsyncSelect() ,
. , WSAAsyncSelect(), ,
"connection" FD_CONNECT. ,
,
, . WSAAsyncSelect()
, ioctlsocket() FIONBIO.
WinSock
, WSAAsyncSelect().
, ,
, .
,
.
, .
,
.
, "|" ()
, .
WSAAsyncSelect() FD_READ|FD_CLOSE ,
. FD_CLOSE,
, Microsoft , FD_CLOSE ,
, , ""
FD_CLOSE. FD_READ, FD_CLOSE.
. , accept() (
2.7.1.3), WSAAsyncSelect(), ,
:
3.7 ( )
#define W_ACCEPT
(WM_USER + 1)/* */
// sd
// W_ACCEPT
int rc;
rc = WSAAsyncSelect (sd , hWnd, W_ACCEPT , FD_ACCEPT );
if(rc > 0)
{
closesocket (sd);
MessageBox(NULL, "WSAAsyncSelect Error", "Error", MB_OK);
return;
}
sd.
FD_ACCEPT. , " "
hWnd W_ACCEPT,
.
FD_ACCEPT accept(),
"" .
3.7 WSAAsyncSelect()
:
3.8 WSAAsyncSelect()
//
WIN32 API wsprintf().
Windows sprintf(). windows.h
:
int FAR CDECL wsprintf(LPSTR lpszOut, LPCSTR lpszFmt, ...);
,
, . - , ,
. :
c
d, i
ld, li
u
lu
lx, lX
s
, .
, (
Windows) , .
. ,
, , .
,
, "
". Win32 API ,
. , (handle) ,
FindWindow(). , .
,
,
. SetConsoleTitle(). Microsoft
(Knowledge Base KB124103) :
GetConsoleTitle(), .
SetConsoleTitle(), .
Sleep(40), .
SetConsoleTitle() , 1,
.
HWND . , ,
HWND , GetWindowText() HWND
, GetConsoleTitle(). , ,
HWND .
3.9 GetConsoleHwnd(),
(HWND). ,
, , NULL. ,
.
3.9
HWND GetConsoleHwnd(void)
{
#define MY_BUFSIZE 1024 // .
HWND hwndFound;
// , .
char pszNewWindowTitle[MY_BUFSIZE]; // .
char pszOldWindowTitle[MY_BUFSIZE]; // .
// .
GetConsoleTitle(pszOldWindowTitle, MY_BUFSIZE);
// "" NewWindowTitle.
wsprintf(pszNewWindowTitle,"%d/%d", GetTickCount(), GetCurrentProcessId());
// .
SetConsoleTitle(pszNewWindowTitle);
// .
Sleep(40);
// NewWindowTitle.
hwndFound=FindWindow(NULL, pszNewWindowTitle);
// .
SetConsoleTitle(pszOldWindowTitle);
return(hwndFound);
}
,
,
3.10:
3.10 :
HWND MakeWorkerWindow(void)
{
WNDCLASS wndclass;
CHAR *ProviderClass = "AsyncSelect";
HWND Window;
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = (WNDPROC)WindowProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = NULL;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = ProviderClass;
if (RegisterClass(&wndclass) == 0)
{
printf("RegisterClass() failed with error %d\n", GetLastError());
return NULL;
}
// Create a window.
if ((Window = CreateWindow(
ProviderClass,
"",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
NULL,
NULL)) == NULL)
{
printf("CreateWindow() failed with error %d\n", GetLastError());
return NULL;
}
return Window;
}
"" 3.8 ,
, MessageLoop,
. , ,
, .
WSAIoctl()
ioctlsocket().
, .
, ,
wMsg2 FD_WRITE:
Rc = WSAAsyncSelect(sd, hWnd, wMsg1, FD_READ);
Rc = WSAAsyncSelect(sd, hWnd, wMsg2, FD_WRITE);
WSAGetLastError()
,
lParam
WS2_32.DLL
.
,
, ,
.
FD_READ
FD_WRITE
FD_OOB
55.1.1.2.
WSAAsyncGetXByY
.
"" WinSock 1.1.
, .
"database"- WSAAsyncGetXByY().
, .
.
"asynchronous task handle", ,
. , .
, .
blocking hook,
, .
-,
. , .
,
WSAAsyncGetHostByName() WSAAsyncGetHostByAddr().
WSAAsyncGetHostByName(),
,
.
WSAAsyncGetHostByName() :
struct hostent FAR * gethostbyname (const char FAR * name);
HANDLE WSAAsyncGetHostByName(
HWND
hWnd,// ,
//
unsigned int wMsg,
// ,
//
HANDLE ,
WSACancelAsyncRequest()
wParam .
, ,
WSAGetLastError().
WSAEWOULDBLOCK, ,
.
Winsock .
, ,
, -
() .
, ,
.
, ,
. ,
.
,
(, ). , ,
-.
(hidden) .
.
.
Windows' USER heap ( -"") -
.
25.
, Windows WinSock 1.1
, - Windows , ,
API Windows .
, Windows
, API
,
. , API Windows
Berkeley perror() herror(), ,
.
Windows Berkeley- errno h_errno,
"" "".
Windows Sockets : - ( thread-based)
-.
- (task-based):
1.
task-based , WSAGetLastError()
WinSock.
- :
WSAAsyncSelect() FD-
( -
WSAGETSELECTERROR (lParam)).
getsockopt() SO_ERROR (
0).
WSAStartup() ,
, , . ,
WSAGetLastError(), , WSAStartup()
, WSANOTINITIALISED.
winsock.h h_errno Berkeley ( WSAGetLastError()).
errno WINSOCK.H, errno - (, ).
()
Berkeley. WinSock BSD, WSABASEERR. WinSock API
BSD , "WSA". , , BSD
" ", errno.h Berkeley :
#define EWOULDBLOCK 35,
winsock.h :
#define WSAEWOULDBLOCK (WSABASEERR+35).
( ) WinSock
Microsoft C. ,
Windows NT .
( ) Windows.
, Windows, WinSock ,
WinSock.DLL, .
Windows WINSOCK.H.
"WSA" WSABASEERR (10000).
WSABASEERR . ,
Windows API . :
WinSock.
56.
: , ,
, . ,
. ,
, , (fixable):
WSAEADDRINUSE
(10048)
(/IP-/).
IP-/,
,
, ,
.
WSAECONNABORTED
(10053)
WSAECONNREFUSED
(10061)
WSAECONNRESET
WSAEDESTADDRREQ
WSAEHOSTUNREACH
WSAEMFILE
WSAENETDOWN
(10054)
(10039)
(10065)
(10024)
(10050)
WSAENETRESET
WSAENOBUFS
WSAENETUNREACH
WSAETIMEDOUT
(10052)
(10055)
(10051)
(10060)
WSAHOST_NOT_FOUND
WSASYSNOTREADY
WSANOTINITIALISED
WSANO_DATA
(11001)
(10091)
(10093)
(11004)
WSANO_RECOVERY
WSATRY_AGAIN
(11003)
(11002)
WSAVERNOTSUPPORTED
(10092)
57.
( TCP)
,
(
)
TCP
( )
WSAStartup()
,
( DNS)
A- (
DNS). .
winsock.dll
WSAGetLastError()
errno
. , , . ,
errno " ",
. , errno
. ( Windows Sockets WSASetLastError().)
BSD-:
r = recv(...);
if (r == -1 && errno == EWOULDBLOCK)
{...}
:
r = recv(...);
if (r == -1
{...}
Berkeley, ,
, "WSA" . ,
:
r = recv(...);
if (r == -1
{...}
1 :
r = recv(...);
58.
-
API WSAGetLastError() , "Berkeley-"
- "errno" -
. WSAGetLastError()
"per thread" -.
WSAGetLastError() ,
Microsoft C. ,
Windows Sockets, ,
Microsoft C. ,
, Microsoft C, Windows,
"WSA", .
,
, .
Windows Sockets.
WinSock API ,
Windows.
WSASetLastError()
:
, WSAGetLastError().
void PASCAL FAR WSASetLastError ( int iError );
:
,
WSAGetLastError() . , Windows
Sockets, , , .
IError
,
WSAGetLastError().
.
WSANOTINITIALISED
API WSAStartup().
WSAGetLastError()
:
, .
int WSAGetLastError (void);
:
, . API Windows
, , .
.
API Windows-, .
, 3-11, 3-12,
SOCKADDR_IN. , 16-
8 , 8 _sin_zero - Unix-like
Unix-.
Windows , -, ,
TCP/UDP Windows.
. "" [14] [23].
59.
WinTCP
3.911
TCP-
#include <winsock.h>
#define PORTNUM
5000
#define HOSTNAME "localhost"
//
// .
//
main()
{
int index = 0,
iReturn;
// recv()
char szClientA[100];
// ascii
TCHAR szClientW[100];
// Unicode
TCHAR szError[100];
//
SOCKET ServerSock = INVALID_SOCKET;
//
SOCKADDR_IN destination_sin;
//
PHOSTENT phostent = NULL;
// hostent
WSADATA WSAData;
// Windows Sockets.
if (WSAStartup (MAKEWORD(1,1), &WSAData) != 0)
{
wsprintf (szError, TEXT("WSAStartup failed. Error: %d"), WSAGetLastError ());
MessageBox (NULL, szError, TEXT("Error"), MB_OK);
return FALSE;
}
// TCP-, .
if ((ServerSock = socket (AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
{
wsprintf (szError, TEXT("Allocating socket failed. Error: %d"), WSAGetLastError ());
MessageBox (NULL, szError, TEXT("Error"), MB_OK);
return FALSE;
}
// .
destination_sin.sin_family = AF_INET;
// , .
if ((phostent = gethostbyname (HOSTNAME)) == NULL)
{
wsprintf (szError, TEXT("Unab1e to get the host name. Error: %d"), WSAGetLastError ());
MessageBox (NULL, szError, TEXT("Error"), MB_OK);
closesocket (ServerSock);
return FALSE;
}
// IP-
memcpy ((char FAR *)&(destination_sin.sin_addr),phostent->h_addr,phostent->h_length);
//
destination_sin.sin_port = htons (PORTNUM);
// .
if (connect (ServerSock,(PSOCKADDR) &destination_sin,sizeof (destination_sin)) == SOCKET_ERROR)
{
wsprintf (szError,TEXT("Connecting to the server failed. Error: %d"), WSAGetLastError());
MessageBox (NULL, szError, TEXT("Error"), MB_OK);
closesocket (ServerSock);
return FALSE;
}
//
if (send (ServerSock, "To Server. ", strlen ("o Server. ")+1,0)== SOCKET_ERROR)
{
wsprintf (szError,TEXT("Sending data to the server failed. Error:%d"),WSAGetLastError());
MessageBox (NULL, szError, TEXT("Error"), MB_OK);
}
//
shutdown(ServerSock,0x01);
// .
iReturn = recv (ServerSock, szClientA, sizeof (szClientA), 0);
// , . , .
if (iReturn == SOCKET_ERROR)
{
wsprintf (szError, TEXT("No data is received, recv failed. ") ,TEXT(" Error: %d"),
WSAGetLastError());
MessageBox (NULL, szError, TEXT("Client"), MB_OK);
}
else if (iReturn == 0)
{
MessageBox (NULL, TEXT("Finished receiving data"), TEXT("client"), MB_OK);
}
else
{
// ASCII Unicode.
for (index = 0; index <= sizeof (szClientA); index++) szClientW[index] = szClientA[index];
// ,
MessageBox (NULL, szClientW, TEXT("Received From Server"), MB_OK);
}
// ServerSock.
shutdown (ServerSock, 0x02);
closesocket (ServerSock);
// .
WSACleanup ();
// .
return true;
}
60.
WinTCP
3.102 TCP
#include <winsock.h>
#define PORTNUM
5000
#define MAX_PENDING_CONNECTS 5
int main(void)
{
//
int index = 0,
iReturn;
// , recv()
char szServerA[100] ;
// ASCII
TCHAR szServerW[100];
// Unicode
TCHAR szError[100];
//
SOCKET Listen_Socket = INVALID_SOCKET;
//
SOCKET ClientSock = INVALID_SOCKET;
//
SOCKADDR_IN local_sin,
//
accept_sin;
//
int accept_sin_len;
// accept_sin
WSADATA WSAData;
// WinSock
// WinSock
if (WSAStartup (MAKEWORD(1,1), &WSAData) != 0)
{
wsprintf (szError, TEXT("WSAStartup failed. Error: %d"), WSAGetLastError ());
MessageBox (NULL, szError, TEXT("Error"), MB_OK);
return FALSE;
}
// C TCP-, Listen_socket.
if ((Listen_socket = socket (AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
{
wsprintf (szError, TEXT("Allocating socket failed. Error: %d"), WSAGetLastError());
MessageBox (NULL, szError, TEXT("Error"), MB_OK);
return false;
}
// a.
local_sin.sin_family = AF_INET;
local_sin.sin_port = htons (PORTNUM);
local_sin.sin_addr.s_addr = htonl (INADDR_ANY);
// a Listen_socket.
if (bind (Listen_socket,(struct sockaddr *) &local_sin,sizeof (local_sin)) == SOCKET_ERROR)
{
wsprintf (szError, TEXT("Binding socket failed. Error: %d"), WSAGetLastError());
MessageBox (NULL, szError, TEXT("Error"), MB_OK);
closesocket (Listen_socket); // .
return FALSE;
}
//
if (listen (Listen_socket, MAX_PENDING_CONNECTS) == SOCKET_ERROR)
{
wsprintf (szError,TEXT("Listening to the client failed. Error: %d"), WSAGetLastError());
MessageBox (NULL, szError, TEXT("Error"), MB_OK);
closesocket (Listen_socket);
// .
return FALSE;
}
accept_sin_len = sizeof (accept_sin);
//
ClientSock = accept (Listen_socket,(struct sockaddr *) &accept_sin,(int *) &accept_sin_len);
closesocket (Listen_socket);
//
if (ClientSock == INVALID_SOCKET)
{
wsprintf (szError, TEXT("Accepting connection with client failed.") TEXT(" Error: %d"),
WSAGetLastError());
MessageBox (NULL, szError, TEXT("Error"), MB_OK);
return FALSE;
}
for (;;)
// .
{
iReturn = recv (ClientSock, szServerA, sizeof (szServerA), 0);
if (iReturn == SOCKET_ERROR) // , , , .
{
wsprintf (szError, TEXT("No data is received, recv failed. ") TEXT(" Error: %d"),
WSAGetLastError());
MessageBox (NULL, szError, TEXT("Server"), MB_OK);
break;
}
else if (iReturn == 0)
{
MessageBox (NULL, TEXT("Finished receiving data"), TEXT("Server"), MB_OK);
break;
} else
{
// ascii Unicode.
for (index = 0; index <= sizeof (szServerA); index++) szServerW[index] = szServerA[index];
// , .
MessageBox (NULL, szServerW, TEXT("Received From client"), MB_OK);
}
// .
if (send (ClientSock, "To Client. ", strlen ("To Client. ") + 1, 0) == SOCKET_ERROR)
{
wsprintf (szError,TEXT("Sending data to the client failed. Error: %d"), WSAGetLastError ());
MessageBox (NULL, szError, TEXT("Error"), MB_OK);
// ClientSock.
shutdown (ClientSock, 0x02);
closesocket (ClientSock);
// ClientSock.
}
WSACleanup();
// Windows-
return 0;
}
}
:
wsock32.lib, MFC
precompiled headers ( MS Visual C++).
1.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
WinSock?
WinSock ?
UNIX Windows?
?
WSAStartup().
?
WSADATA?
WSAAsyncSelect() select()?
Windows-?
A,W,Ex ?
?
WinSock?
1
IPv4
/* add hi 16 to low 16 */
/* add carry */
/* truncate to 16 bits */
, TCP UDP.
2
IPV6
IPv6 3-11 .
, "Format Prefix".
IPv6,
, .
NSAP
IPX
0000 0000
0000 000
0000 00
0000010
0000011
0000 1
0001
001
010
011
100
1/256
1/256
1/128
1/128
1/128
1/32
1/16
1/8
1/8
1/8
1/8
101
110
1110
1111 0
1111 10
1111 110
1111 11100
1111 1110 10
1111 1110 11
1111 1111
1/8
1/8
1/16
1/32
1/64
1/128
1/512
1/1024
1/1024
1/256
3
PING
,
Ping. :
(,
).
ICMP (nIcmpId nIcmpSeq)
ECHO- ECHO-.
, ECHO- , .
. Berkeley,
ICMP , IP
, ICMP .
, IP_TTL, TTL
ICMP ECHO, ICMP-
, .
- Windows.
/* ICMP types */
#define ICMP_ECHOREPLY 0
/* ICMP : */
#define ICMP_ECHOREQ 8
/* ICMP : */
/* ICMP RFC 792 */
typedef struct icmp_hdr
{
u_char icmp_type;
/* */
u_char icmp_code;
/* */
u_short icmp_cksum;
/* */
u_short icmp_id;
/* */
u_short icmp_seq;
/* */
char icmp_data[1];
/* */
} ICMP_HDR, *PICMPHDR, FAR *LPICMPHDR;
#define ICMP_HDR_LEN sizeof(ICMP_HDR)
/* IP 4 RFC 791 */
#define IPVERSION 4
typedef struct ip_hdr {
u_char ip_hl;
/* */
u_char ip_v;
/* */
u_char ip_tos;
/* */
short ip_len;
/* */
u_short ip_id;
/* */
short ip_off;
/* */
u_char ip_ttl;
/* TTL */
u_char ip_p;
/* */
u_short ip_cksum;
/* . */
struct in_addr ip_src;
/* */
struct in_addr ip_dst;
/* */
} IP_HDR, *PIP_HDR, *LPIP_HDR;
#define IP_HDR_LEN sizeof(IP_HDR)
(LPSTR)lpIcmpHdr,
/* */
nEchoDataLen+ICMP_HDR_LEN+sizeof(long),
/* */
0,
/* */
(LPSOCKADDR)lpstToAddr,
/* */
sizeof(SOCKADDR_IN));
/* */
if (nRet == SOCKET_ERROR) {
WSAErrMsg("sendto()");
}
return (nRet);
} /* icmp_sendto() */
/* Function: icmp_recvfrom()
: icmp -,
ICMP . */
u_long icmp_recvfrom(SOCKET s, LPINT lpnIcmpId, LPINT lpnIcmpSeq, LPSOCKADDR_IN lpstFromAddr)
{
u_long lSendTime;
int nAddrLen = sizeof(struct sockaddr_in);
int nRet, i;
/*-------------------- ICMP - ------------------*/
stFromAddr.sin_family = AF_INET;
stFromAddr.sin_addr.s_addr = INADDR_ANY;
stFromAddr.sin_port = 0;
nRet = recvfrom (s,
/* */
(LPSTR)achIOBuf,
/* */
PNGBUFSIZE+ICMP_HDR_LEN+sizeof(long)+IP_HDR_LEN,
/* */
0,
/* */
(LPSOCKADDR)lpstFromAddr,
/* */
&nAddrLen);
/* */
if (nRet == SOCKET_ERROR) {
WSAErrMsg("recvfrom()");
}
/*------------------------- -------------------------- . : ,
Berkeley Sockets. , IP-,
. ,
, IP- ( 0x45 ). */
/* */
if (achIOBuf[0] == 0x45) { /* IP- ? */
i = IP_HDR_LEN + ICMP_HDR_LEN;
lpIcmpHdr = (LPICMPHDR) &(achIOBuf[IP_HDR_LEN]);
} else {
i = ICMP_HDR_LEN;
lpIcmpHdr = (LPICMPHDR) achIOBuf;
}
/* ICMP ID */
*lpnIcmpId = lpIcmpHdr->icmp_id;
*lpnIcmpSeq = lpIcmpHdr->icmp_seq;
/* ICMP- */
_fmemcpy (&lSendTime, (&achIOBuf[i]), sizeof(u_long));
return (lSendTime);
} /* end icmp_recvfrom() */
/* Function: cksum()
(one's complement sum of 16-bit words). IP, ICMP, UDP, IGMP. */
u_short cksum (u_short FAR*lpBuf, int nLen) {
register long lSum = 0L; /* */
/* : , ()
0 */
while (nLen > 0) {
lSum += (lpBuf++);
/* */
nLen -= 2;
/* 2 */
}
/* 32-bit 16-bit */
lSum = (lSum & 0xffff) + (lSum>>16);
lSum += (lSum >> 16);
/* .*/
return (~lSum);
} /* cksum() */
4
Log- 3- Internet-
Packet #1, Direction: Out, Time:20:55:56,780
MAC- DNS
Ethernet II
Destination MAC: FF:FF:FF:FF:FF:FF
,,
Source MAC: 44:45:53:54:00:00
MAC
Ethertype: 0x0806 (2054)
2054 (ARP)
ARP
Hardware: 0x0001 (1) Ethernet
Protocol: 0x0800 (2048) IP
IP
Hardware address length: 0x06 (6)
6
Protocol address length: 0x04 (4)
4
Operation: 0x0001 (1) ARP Request
ARP-
Sender MAC address: 44:45:53:54:00:00
MAC
Sender IP address: 195.216.161.32
IP-
Target MAC address: 00:00:00:00:00:00
MAC-
Target IP address: 195.216.160.130
IP-
Raw Data:
0x0000
FF FF FF FF FF FF 44 45-53 54 00 00 08 06 00 01
DEST......
0x0010
08 00 06 04 00 01 44 45-53 54 00 00 C3 D8 A1 20
......DEST..
0x0020
00 00 00 00 00 00 C3 D8-A0 82
......
DNS
Mac-
MAC
2048 (IP)
IP-
IP- 4
20
TOS 0
58
63744
DF 0
MF 0
0
IP TTL 128
UDP
IP
IP DNS
UDP
1055
DNS-53
UDP-
DNS
DNS-
20
00
A0
00
02
53
3A
82
00
72
52
F9
04
00
75
43
00
1F
00
00
00
00
00
00
00
00
00
35
00
01
44
80
00
03
00
45-53
11-78
26-56
77-77
01-
54
5E
48
77
00
C3
00
05
00
D8
09
61
08
A1
01
70
00
20
00
6F
1
www.aport.ru
45
C3
00
72
00
D8
01
74
SRC..DEST....E.
.:....x^
...5.&VH......
.......www.aport
.ru.....
DNS
Recursion Available: 1
Result code: 0x00 (0) Success
Question records: 0x0001 (1)
Answer records: 0x0002 (2)
Authority records: 0x0003 (3)
Additional records: 0x0003 (3)
Question section
Record: 0x1 (1)
Name: www.aport.ru
Type: 0x0001 (1) A
Class: 0x0001 (1) IN
Answer section
Record: 0x1 (1)
Name: www.aport.ru
Type: 0x0005 (5) CNAME
Class: 0x0001 (1) IN
TTL: 1534 25 Minutes 34 sec
CNAME: aport.ru
Record: 0x2 (2)
Name: aport.ru
Type: 0x0001 (1) A
Class: 0x0001 (1) IN
TTL: 1534 25 Minutes 34 sec
IP address: 194.67.26.89
Authority section
Record: 0x1 (1)
Name: aport.ru
Type: 0x0002 (2) NS
Class: 0x0001 (1) IN
TTL: 333 5 Minutes 33 sec
NSDNAME: ns1.gldn.net
Record: 0x2 (2)
Name: aport.ru
Type: 0x0002 (2) NS
Class: 0x0001 (1) IN
TTL: 333 5 Minutes 33 sec
NSDNAME: ns2.gldn.net
IP- www.aport.ru
. RFC 1034
Raw Data:
0x0000
44
0x0010
00
0x0020
A1
0x0030
00
45
C6
20
02
53
38
00
00
54
A2
35
03
00
00
04
00
00
00
1F
03
20
3E
00
03
53-52
11-7A
B2-7C
77-77
43
31
3F
77
00
C3
00
05
00
D8
09
61
08
A0
81
70
00
82
80
6F
45
C3
00
72
00
D8
01
74
DEST.. SRC....E.
.8...>.z1
.5...|?....
.......www.aport
5
( IANA)
1. ()
1
2
3
5
7
9
11
13
15
17
18
19
20
21
22
23
24
25
27
29
31
33
35
37
38
39
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
242
243
244
245
246
247
248
256
257
258
259
260
261
262
263
264
280
281
282
308
309
310
311
312
313
314
315
316
317
321
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
387
388
HDAP
BGMP
HTTP-MGMT
PERSONAL-LINK
CABLEPORT-AX - Cable Port A/X
NOVASTORBAKCUP - Novastor Backup
ENTRUSTTIME
BHMDS
ASIP-WEBADMIN - Appleshare IP Webadmin
VSLMP
MAGENTA-LOGIC
OPALIS-ROBOT
DPSI
DECAUTH
ZANNET
PIP
PDAP - Prospero Data Access Protocol
PAWSERV - Perf Analysis Workbench
ZSERV - Zebra server
FATSERV - Fatmen Server
CSI-SGWP - Cabletron Management Protocol
MFTP
MATIP-TYPE-A - MATIP Type A
MATIP-TYPE-B - MATIP Type B or bhoetty
DTAG-STE-SB - DTAG, or bhoedap4
NDSAUTH
BH611
DATEX-ASN
CLOANTO-NET-1 - Cloanto Net 1
BHEVENT
SHRINKWRAP
TENEBRIS_NTS - Tenebris Network Trace Service
SCOI2ODIALOG
SEMANTIX
SRSSEND - SRS Send
RSVP_TUNNEL
AURORA-CMGR
DTK - Deception Tool Kit
ODMR
MORTGAGEWARE
QBIKGDP
RPC2PORTMAP
CODAAUTH2
CLEARCASE - Clearcase
ULISTSERV - Unix Listserv
LEGENT-1 - Legent Corporation
LEGENT-2 - Legent Corporation
HASSLE - Hassle
NIP - Amiga Envoy Network Inquiry Proto
TNETOS - NEC Corporation
DSETOS - NEC Corporation
IS99C - TIA/EIA/IS-99 modem client
IS99S - TIA/EIA/IS-99 modem server
HP-COLLECTOR - HP Performance Data Collector
HP-MANAGED-NODE - HP Performance Data Managed Node
HP-ALARM-MGR - HP Performance Data Alarm Manager
ARNS - A Remote Network Server System
IBM-APP - IBM Application 386 ASA - ASA Message Router Object Def.
AURP - Appletalk Update-Based Routing Pro.
UNIDATA-LDM - Unidata LDM Version 4
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
SNARE
FCP - FirstClass Protocol
PASSGO EXEC - Remote Process Execution
LOGIN - Remote Login via Telnet;
SHELL - Automatic Remote Process Execution
PRINTER - Printer Spooler
VIDEOTEX
TALK
NTALK
UTIME - Unix Time
EFS - Extended File Server
RIPNG
ULP
IBM-DB2
NCP
TIMED - Time Server
TEMPO - newdate
STX - Stock IXChange
CUSTIX - Customer IXChange
IRC-SERV
COURIER - rpc
CONFERENCE - chat
NETNEWS - readnews
NETWALL - Emergency Broadcasts
MM-ADMIN - MegaMedia Admin
IIOP
OPALIS-RDV
NMSP - Networked Media Streaming Protocol
GDOMAP
APERTUS-LDP - Apertus Technologies Load Determination
UUCP - UUCPD (Unix to Unix Copy)
UUCP-RLOGIN - uucp (Unix to Unix Copy) - rlogin (Remote Login)
COMMERCE
KLOGIN
KSHELL - krcmd
APPLEQTCSRVR - Apple qtcsrvr
DHCP-CLIENT - DHCP (Dynamic Host Configuration Protocol) Client
DHCP-SERVER - DHCP (Dynamic Host Configuration Protocol) Server
AFPOVERTCP - AFP over TCP
IDFP
NEW-RWHO - new-who
CYBERCASH - CyberCash
DEVICESHARE - deviceshare
PIRP - pirp
RTSP - Real Time Stream Control Protocol
DSF
REMOTEFS - rfs (Remote File System) server
OPENVMS-SYSIPC - openvms-sysipc
SDNSKMP - SDNSKMP
TEEDTAP - TEEDTAP
RMONITOR - rmonitord
MONITOR
CHSHELL - chcmd
SNEWS - snews
9PFS - plan 9 file service
WHOAMI - whoami
STREETTALK - streettalk
BANYAN-RPC - banyan-rpc
MS-SHUTTLE - Microsoft Shuttle
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
606
607
608
609
610
611
628
633
634
635
636
640
650
666
674
704
709
729
730
731
737
740
741
742
744
747
748
749
750
751
752
753
754
758
759
760
761
762
763
764
765
767
769
770
771
772
773
774
775
776
780
781
782
783
786
799
800
801
808
871
888
901
911
989
990
992
993
995
996
997
998
999
1000
1001
1008
1010
1011
1012
1015
1023
KERBEROS-SEC
KERBEROS_MASTER
QRH
RRH
KBR5_PROP
NLOGIN
CON
NS
RXE
QUOTAD
CYCLESERV
OMSERV
WEBSTER
PHONEBOOK - phone
VID
CADLOCK
RTIP
CYCLESERV2
SUBMIT
RPASSWD
ENTOMB
WPAGES
WPGS
HP-COLLECTOR - HP Performance Data Collector
HP-MANAGED-NODE - HP Performance Data Managed Node
HP-ALARM-MGR - HP Performance Data Alarm Manager
CONCERT - Concert
CONTROLIT
MDBS_DAEMON
DEVICE
PORT
SUPFILESRV -SUP Server
CDDATABASE - CDDataBase
PORT
Dark Shadow
FTPS-DATA - FTP Over TLS/SSL
FTP Control TLS/SSL
TELNETS - telnet protocol over TLS/SSL
IMAPS - Imap4 protocol over TLS/SSL
POP3S - Pop3 (Post Office Protocol) over TLS/SSL
VSINET - vsinet
MAITRD
BUSBOY
PUPROUTER
CADLOCK
Silence
UFSD - UFSD
Doly-Trojan
Doly-Trojan
Doly-Trojan
Doly-Trojan
RESERVED Reserved
2.
1024
OLD_FINGER - old_finger
1025
LISTEN - listen
1026
NTERM - nterm
1027
NT
1028
NT
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1058
1059
1067
1068
1080
1083
1084
1090
1103
1109
1110
1112
1127
1155
1167
1170
1178
1212
1222
1234
1241
1243
1245
1248
1269
1330
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
NT
IAD1 - BBN IAD
IAD2 - BBN IAD
IAD3 - BBN IAD
NT
NT
NT
NT
NT
NT
NT
NT
NT
Bla
NT
NT
Rasmin
NT
NT
NT
NT
NIM - nim
NIMREG - nimreg
INSTL_BOOTS - Installation Bootstrap Proto. Serv.
INSTL_BOOTC - Installation Bootstrap Proto. Cli.
SOCKS - Socks
ANSOFT-LM-1 - Anasoft License Manager
ANSOFT-LM-2 - Anasoft License Manager
Xtreme
XAUDIO - Xaserver
KPOP - kpop
NFSD-STATUS - Cluster Status Info
MSQL - Mini-SQL Server
SUPFILEDBG - SUP Debugging
NFA - Network File Access
PHONE - Conference Calling
Psyber Stream Server, Streaming Audio trojan, Voice
SKKSERV - SKK (Kanji Input)
LUPA - lupa
NERV - SNI R&D network
Ultors Trojan
MSG - Remote Message Server
BackDoor-G, SubSeven, SubSeven Apocalypse
Voodoo Doll
HERMES - Multi Media Conferencing
Mavericks Matrix
PORT
ALTA-ANA-LM - Alta Analytics License Manager
BBN-MMC - Multi Media Conferencing
BBN-MMX - Multi Media Conferencing
SBOOK - Registration Network Protocol
EDITBENCH - Registration Network Protocol
EQUATIONBUILDER - Digital Tool Works (MIT)
LOTUSNOTE - Lotus Note
RELIEF - Relief Consulting
RIGHTBRAIN - RightBrain Software
INTUITIVE EDGE - Intuitive Edge
CUILLAMARTIN - CuillaMartin Company
PEGBOARD - Electronic PegBoard
CONNLCLI - CONNLCLI
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
FTSRV - FTSRV
MIMER - MIMER
LINX - LinX
TIMEFLIES - TimeFlies
NDM-REQUESTER - Network DataMover Requester
NDM-SERVER - Network DataMover Server
ADAPT-SNA - Network Software Associates
NETWARE-CSP - Novell NetWare Comm Service Platform
DCS - DCS
SCREENCAST - ScreenCast
GV-US - GlobalView to Unix Shell
US-GV - Unix Shell to GlobalView
FC-CLI - Fujitsu Config Protocol
FC-SER - Fujitsu Config Protocol
CHROMAGRAFX - Chromagrafx
MOLLY - EPI Software Systems
BYTEX - Bytex
IBM-PPS - IBM Person to Person Software
CICHLID - Cichlid License Manager
ELAN - Elan License Manager
DBREPORTER - Integrity Solutions
TELESIS-LICMAN - Telesis Network License Manager
APPLE-LICMAN - Apple Network License Manager
UDT_OS GWHA - GW Hannaway Network License Manager
OS-LICMAN - Objective Solutions License Manager
ATEX_ELMD - Atex Publishing License Manager
CHECKSUM - CheckSum License Manager
CADSI-LM - Computer Aided Design Software Inc LM
OBJECTIVE-DBC - Objective Solutions DataBase Cache
ICLPV-DM - Document Manager
ICLPV-SC - Storage Controller
ICLPV-SAS - Storage Access Server
ICLPV-PM - Print Manager
ICLPV-NLS - Network Log Server
ICLPV-NLC - Network Log Client
ICLPV-WSM - PC Workstation Manager software
DVL-ACTIVEMAIL - DVL Active Mail
AUDIO-ACTIVMAIL - Audio Active Mail
VIDEO-ACTIVMAIL - Video Active Mail
CADKEY-LICMAN - Cadkey License Manager
CADKEY-TABLET - Cadkey Tablet Daemon
GOLDLEAF-LICMAN - Goldleaf License Manager
PRM-SM-NP - Prospero Resource Manager
PRM-NM-NP - Prospero Resource Manager
IGI-LM - Infinite Graphics License Manager
IBM-RES - IBM Remote Execution Starter
NETLABS-LM - NetLabs License Manager
DBSA-LM - DBSA License Manager
SOPHIA-LM - Sophia License Manager
HERE-LM - Here License Manager
HIQ - HiQ License Manager
AF - AudioFile
INNOSYS - InnoSys
INNOSYS-ACL - Innosys-ACL
IBM-MQSERIES - IBM MQSeries
DBSTAR - DBStar
NOVELL-LU6.2 - Novell LU6.2
TIMBUKTU-SRV1 - Timbuktu Service 1 Port
TIMBUKTU-SRV2 - Timbuktu Service 2 Port
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
DBEREGISTER - dberegister
PACERFORUM - PacerForum
AIRS - AIRS
MITEKSYS-LM - Miteksys License Manager
AFS - AFS License Manager
CONFLUENT - Confluent License Manager
LANSOURCE - LANSource
NMS_TOPO_SERV - nms_topo_serv
LOCALINFOSRVR - LocalInfoSrvr
DOCSTOR - DocStor
DMDOCBROKER - dmdocbroker
INSITU-CONF - insitu-conf
ANYNETGATEWAY - anynetgateway
STONE-DESIGN-1 - stone-design-1
NETMAP_LM - netmap_lm
ICA - ica
CVC - cvc
LIBERTY-LM - liberty-lm
RFX-LM - rfx-lm
WATCOM-SQL - Watcom-SQL
FHC - Federico Heinz Consultora
VLSI-LM - VLSI License Manager
SAISCM - Satellite-data Acquisition System 3
SHIVADISCOVERY - Shiva
IMTC-MCS - Databeam
EVB-ELM - EVB Software Engineering License Manager
FUNKPROXY - Funk Software Inc.
UTCD - Universal Time daemon (utcd)
SYMPLEX - symplex
DIAGMOND - diagmond
ROBCAD-LM - Robcad Ltd. License Manager
MVX-LM - Midland Valley Exploration Ltd. Lic. Man.
3L-L1 - 3l-l1
WINS - Microsoft's Windows Internet Name Service
FUJITSU-DTC - Fujitsu Systems Business of America Inc
FUJITSU-DTCNS - Fujitsu Systems Business of America Inc
IFOR-PROTOCOL - ifor-protocol
VPAD - Virtual Places Audio data
VPAC - Virtual Places Audio control
VPVD - Virtual Places Video data
VPVC - Virtual Places Video control
ATM-ZIP-OFFICE - atm zip office
NCUBE-LM - nCube License Manager
RNA-LM - Ricardo North America License Manager
CICHILD-LM - cichild
INGRESLOCK - ingres
PROSPERO-NP - Prospero Directory Service non-priv
PDAP-NP - Prospero Data Access Prot non-priv
TLISRV - oracle
MCIAUTOREG - micautoreg
COAUTHOR - oracle
RAP-SERVICE - rap-service
RAP-LISTEN - rap-listen
MIROCONNECT - miroconnect
VIRTUAL-PLACES - Virtual Places Software
MICROMUSE-LM - micromuse-lm
AMPR-INFO - ampr-info
AMPR-INTER - ampr-inter
SDSC-LM - isi-lm
3DS-LM - 3ds-lm
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
SIMBASERVICES - simbaservices
ISSD
AAS - aas
INSPECT - inspect
PICODBC - pickodbc
ICABROWSER - icabrowser
SLP - Salutation Manager (Salutation Protocol)
SLM-API - Salutation Manager (SLM-API)
STT - stt
SMART-LM - Smart Corp. License Manager
ISYSG-LM - isysg-lm
TAURUS-WH - taurus-wh
ILL - Inter Library Loan
NETBILL-TRANS - NetBill Transaction Server
NETBILL-KEYREP - NetBill Key Repository
NETBILL-CRED - NetBill Credential Server
NETBILL-AUTH - NetBill Authorization Server
NETBILL-PROD - NetBill Product Server
NIMROD-AGENT - Nimrod Inter-Agent Communication
SKYTELNET - skytelne
XS-OPENBACKUP - xs-openbackup
FAXPORTWINPORT - faxportwinport
SOFTDATAPHONE - softdataphone
ONTIME - ontime
JALEOSND - jaleosnd
UDP-SR-PORT - udp-sr-port
SVS-OMAGENT - svs-omagent
CNCP - CableNet Control Protocol
CNAP - CableNet Admin Protocol
CNIP - CableNet Info Protocol
CERT-INITIATOR - cert-initiator
CERT-RESPONDER - cert-responder
INVISION - InVision
ISIS-AM - isis-am
ISIS-AMBC - isis-ambc
SAISEH - Satellite-data Acquisition System 4
DATAMETRICS - datametrics
SA-MSG-PORT - sa-msg-port
RSAP - rsap
CONCURRENT-LM - concurrent-lm
INSPECT - inspect
NKD
SHIVA_CONFSRVR - shiva_confsrvr
XNMP - xnmp
ALPHATECH-LM - alphatech-lm
STARGATEALERTS - stargatealerts
DEC-MBADMIN - dec-mbadmin
DEC-MBADMIN-H - dec-mbadmin-h
FUJITSU-MMPDC - fujitsu-mmpdc
SIXNETUDR - sixnetudr
SG-LM - Silicon Grail License Manager
SKIP-MC-GIKREQ - skip-mc-gikreq
NETVIEW-AIX-1 - netview-aix-1
NETVIEW-AIX-2 - netview-aix-2
NETVIEW-AIX-3 - netview-aix-3
NETVIEW-AIX-4 - netview-aix-4
NETVIEW-AIX-5 - netview-aix-5
NETVIEW-AIX-6 - netview-aix-6
NETVIEW-AIX-7 - netview-aix-7
NETVIEW-AIX-8 - netview-aix-8
1669
1670
1671
1672
1673
1674
1675
1676
1677
1723
1807
1812
1813
1827
1981
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2030
2032
NETVIEW-AIX-9 - netview-aix-9
NETVIEW-AIX-10 - netview-aix-10
NETVIEW-AIX-11 - netview-aix-11
NETVIEW-AIX-12 - netview-aix-12
PROSHARE-MC-1 - Intel Proshare Multicast
PROSHARE-MC-2 - Intel Proshare Multicast
PDP - Pacific Data Products
NEFCOMM1 - netcomm1
GROUPWISE - groupwise
PPTP - pptp
SpySender
RADIUS - RADIUS Authentication Protocol
RADACCT - RADIUS Accounting Protocol
PCM - PCM Agent
Shockrave
LICENSEDAEMON - cisco license management
TR-RSRB-P1 - cisco RSRB Priority 1 port
TR-RSRB-P2 - cisco RSRB Priority 2 port
MSHNET - MHSnet system
STUN-P1 - cisco STUN Priority 1 port
STUN-P2 - cisco STUN Priority 2 port
IPSENDMSG - IPsendmsg
SNMP-TCP-PORT - cisco SNMP TCP port
STUN-PORT - cisco serial tunnel port
PERF-PORT - cisco perf port
TR-RSRB-PORT - cisco Remote SRB port
GDP-PORT - cisco Gateway Discovery Protocol
X25-SVC-PORT - cisco X.25 service (XOT)
TCP-ID-PORT - cisco identification port
CALLBOOK
DC
GLOBE
CFINGER - cfinger
MAILBOX
BERKNET
INVOKATOR
DECTALK
CONF
NEWS
SEARCH
RAID-CC - raid
TTYINFO RAID-AM
TROFF
CYPRESS
BOOTSERVER
CYPRESS-STAT
TERMINALDB
WHOSOCKAMI
XINUPAGESERVER
SERVEXEC
DOWN
XINUEXPANSION3
XINUEXPANSION4
ELLPACK
SCRABBLE
SHADOWSERVER
SUBMITSERVER
DEVICE2
BLACKBOARD
2033
2034
2035
2038
2040
2041
2042
2043
2044
2045
2046
2047
2048
2064
2065
2067
2080
2103
2104
2105
2106
2108
2111
2112
2115
2120
2140
2155
2201
2221
2222
2223
2232
2241
2283
2301
2307
2401
2430
2431
2432
2433
2500
2501
2564
2565
2583
2592
2600
2601
2602
2603
2604
2605
2627
2638
2700
2766
2784
GLOGGER
SCOREMGR
IMSLDOC
OBJECTMANAGER
LAM
INTERBASE
ISIS - isis
ISIS-BCAST - isis-bcast
RIMSL
CDFUNC
SDFUNC
DLS
DLS-MONITOR - dls-monitor
DISTRIB-NETASSHOLES - A group of lamers working on a closed-source client for solving the
RSA cryptographic challenge
DLSRPN - Data Link Switch Read Port Number
DLSWPN - Data Link Switch Write Port Number
Wingate Winsock Redirector Service
ZEPHYR-CLT - Zephyr Serv-HM Conncetion
Zephyr Host Manager
EKLOGIN - Kerberos (v4) Encrypted RLogin
EKSHELL - Kerberos (v4) Encrypted RShell
RKINIT - Kerberos (v4) Remote Initialization
KX - X Over Kerberos
KIP - IP Over Kerberos
Bugs
KAUTH - Remote kauth
Deep Throat, The Invasor
Illusion Mailer
ATS - Advanced Training System Program
UNREG-AB1 - Allen-Bradley unregistered port
UNREG-AB2 - Allen-Bradley unregistered port
INREG-AB3 - Allen-Bradley unregistered port
IVS-VIDEO - IVS Video default
IVSD - IVS Daemon
HVL Rat5
CIM - Compaq Insight Manager
PEHELP - pehelp
CVSPSERVER - CVS Network Server
VENUS
VENUS-SE
CODASRV
CODASRV-SE
RTSSERV - Resource Tracking system server
RTSCLIENT - Resource Tracking system client
HP-3000-TELNET - HP 3000 NS/VT block mode telnet
Striker
WinCrash
NETREK[GAME] - netrek[game]
Digital Rootbeer
ZEBRA - Zebra VTY
RIPD - RIPd VTY
RIPNGD - RIPngd VTY
OSPFD - OSPFd VTY
BGPD - BGPd VTY
WEBSTER Sybase Database
TQDATA - tqdata
LISTEN - System V Listener Port
WWW-DEV - world wide web - development
2800
2989
3000
3001
3005
3006
3024
3049
3064
3086
3128
3129
3130
3141
3150
3155
3264
3295
3306
3333
3421
3454
3455
3456
3457
3459
3700
3791
3801
3871
3900
3905
3908
3920
3921
3922
3923
3925
3975
3984
3985
3986
3996
4000
4001
4008
4045
4092
4132
4133
4321
4333
4343
4444
4500
4501
4557
4559
4567
4590
Phineas Phucker
(UDP) - RAT
UNKNOWN - Unknown Service
NESSUSD - Nessus Security Scanner
DESLOGIN - Encrypted Symmetric Telnet
DESLOGIND WinCrash
NSWS DISTRIB-NET-PROXY - Stupid closed source distrib.net proxy
SJ3 - SJ3 (Kanji Input)
RingZero Masters Paradise SQUID-IPC VMODEM - VMODEM
Deep Throat, The Invasor
HTTP Proxy
CCMAIL - cc:mail/lotus
PORT
MYSQL
DEC-NOTES - DEC Notes
BMAP - Bull Apprise portmapper
MIRA - Apple Remote Access Protocol
PRSVP - RSVP Port
VAT - VAT default data
VAT-CONTROL - VAT default control
Eclipse 2000
Portal of Doom
Eclypse
(UDP) - Eclypse
PORT
UDT_OS - Unidata UDT OS
PORT
PORT
PORT
PORT
PORT
PORT
PORT
PORT
MAPPER-NODEMGR - MAPPER network node manager
MAPPER-MAPETHD - MAPPER TCP/IP server
MAPPER-WS_ETHD - MAPPER workstation server
PORT
UNKNOWN - Unknown Service
PORT
NETCHEQUE - NetCheque accounting
LOCKD - NFS Lock Daemon
WinCrash
NUTS_DEM - NUTS Daemon
NUTS_BOOTP - NUTS Bootp Server
RWHOIS - Remote Who Is
MSQL - Mini SQL Server
UNICALL - UNICALL
NV-VIDEO - NV Video default
SAE-URN - sae-urn
URN-X-CDCHOICE - urn-x-cdchoice
FAX - fax
HYLAFAX - HylaFAX cli-svr Protocol
File Nail
ICQTrojan
4672
4899
5000
5001
5002
5003
5004
5005
5010
5011
5031
5050
5075
5145
5190
5191
5192
5193
5232
5236
5300
5301
5302
5303
5304
5305
5308
5321
5376
5400
5401
5402
5432
5500
5510
5512
5520
5530
5540
5550
5555
5556
5557
5569
5631
5632
5650
5680
5713
5714
5715
5716
5717
5742
5800
5801
5858
5900
5901
5902
5977
5978
5979
5997
5998
5999
6000
6001
6002
6003
6004
6005
6006
6007
6008
6009
6110
6111
6112
6141
6142
6143
6144
6145
6146
6147
6148
6149
6400
6455
6456
6558
6660
6661
6662
6663
6664
6665
6666
6667
6668
6669
6670
6671
6771
6776
6912
6939
6969
6970
7000
7001
7002
7003
7004
7005
7006
7007
7008
7009
7010
7100
7120
7121
7200
7201
7300
7301
7306
7307
7308
7309
7326
7648
7649
7650
7651
7770
7777
7789
8000
8001
8002
8003
8004
8005
8006
8007
8008
8009
8010
8080
8081
8082
8083
8084
8085
8086
8087
8088
8100
8101
8102
8103
8104
8105
8106
8107
8108
8109
8110
8181
8383
8450
8765
8807
8888
8892
9000
9001
9010
9090
9095
9100
9200
9201
9202
9203
9400
9535
9872
9873
9874
9875
9876
9989
9998
9999
10005
10067
10080
10082
10083
10101
10167
10520
10607
11000
11223
11371
12067
12223
12345
12346
12361
12362
12631
13000
13326
16660
16969
17007
17300
18000
20000
20001
20005
20034
20203
21544
21845
21846
21847
22222
22273
22289
22305
22321
23456
23476
SERVICE
ZEUS-ADMIN - Zeus Admin Server
SERVICE
JETDIRECT - HP JetDirect Card
WAP - Wireless Application Protocol
WAP - Wireless Application Protocol
WAP - Wireless Application Protocol
WAP - Wireless Application Protocol
InCommand
MAN
Portal of Doom
Portal of Doom
Portal of Doom
Portal of Doom
SD - Session Director
iNi-Killer
DEMOS SMTP
DISTINCT - distinct
STEL - Secure Telnet
(UDP) - Portal of Doom
AMANDA - Amanda Backup Util
AMANDA-IDX - Amanda Indexing
AMIDXTAPE - Amanda Tape Indexing
BrainSpy
(UDP) - Portal of Doom
Acid Shivers
Coma
Senna Spy
Progenic trojan
PKSD - PGP Pub. Key Server
Gjamer
Hack99 KeyLogger
NB - NetBus
GabanBus, NetBus, X-bill
Whack-a-mole
Whack-a-mole
Whackjob
Senna Spy
CROSSFIRE[GAME] - crossfire[game]
Stacheldraht Master Serverd
Priority
ISODE-DUA
Kuang2 The Virus
BIIMENU - Beckman Instruments Inc.
Millennium
Millennium backdoor
BTX - Xcept4
Netbus 2 Pro
Logged
Girlfriend
WEBPHONE - webphoned
23477
24326
25000
25001
25002
25003
25004
25005
25006
25007
25008
25009
26000
26001
26002
26208
26274
27119
27444
27500
27501
27502
27665
27910
27911
27912
27913
27920
27960
29891
29970
30029
30100
30101
30102
30303
30999
31335
31336
31337
31338
31457
31666
31785
31787
31788
31789
31791
31792
32000
33333
33911
34324
40193
40412
40421
40422
40423
40426
43188
Donald Dick
Netscape Server
ICL-TWOBASE1 - icl-twobase1
ICL-TWOBASE2 - icl-twobase2
ICL-TWOBASE3 - icl-twobase3
ICL-TWOBASE4 - icl-twobase4
ICL-TWOBASE5 - icl-twobase5
ICL-TWOBASE6 - icl-twobase6
ICL-TWOBASE7 - icl-twobase7
ICL-TWOBASE8 - icl-twobase8
ICL-TWOBASE9 - icl-twobase9
ICL-TWOBASE10 - icl-twobase10
QUAKEXX
QUAKEXX
QUAKEXX
WNN6_DS - Wnn6 (Dserver)
(UDP) - Delta Source
QUAKEXX
TRINOO_BCAST - Trinoo Attack Tool
QUAKEXX
QUAKEXX
QUAKEXX
TRINOO_MASTER - Trinoo Attack Tool
QUAKEXX
QUAKEXX
QUAKEXX
QUAKEXX
QUAKEXX
QUAKE3SERVER - Quake 3 Arena Server
(UDP) - The Unexplained
PORT
AOL Trojan
NetSphere
Netsphere
NetSphere
Sockets de Troie
Kuang2
TRINOO_REGISTER - Trinoo Attack Tool
Whack
BO - BackOrifice
NetSpy DK
TETRINET (Tetris GAME)
BO Whack
HackrarTack
HackrarTack
HackrarTack
HackrarTack (udp)
HackrarTack (udp)
HackrarTack
Generic - Shared service port
Prosiak
Spirit 2001a
BigGluck, TN
NetWare
The Spy
Agent 40421, Masters Paradise
Masters Paradise
Masters Paradise
Masters Paradise
REACHOUT
44333
WinRoute
47262
(UDP) - Delta Source
47557
DBBROWSE - Databeam Corporation
3.
50505
Sockets de Troie
50766
Fore, Schwindler
53001
Remote Window Shutdown
54320
BO 2K
54321
SchoolBus
60000
Deep Throat
61466
TeleCommando
65000
Devil
65301
PCANYWHERE
() .2,3
Internet.
6
TCP- connect()
#include <stdio.h>
#include <errno.h>
#include <netdb.h>
#include <fcntl.h>
10
fd_set rfds;
11
12
int sockfd;
13
int numbytes;
14
char buf[MAXDATASIZE];
15
16
17
int flags;
18
19
if (argc!=2)
20
21
22
exit(1);
23
24
25
26
27
herror ("gethostbyname");
28
exit(1);
29
30
// create a socket
31
32
33
perror("socket");
34
exit(1);
35
36
37
38
39
40
their_addr.sin_family=AF_INET;
41
their_addr.sin_port=htons(port);
42
43
bzero(&(their_addr.sin_zero), 8);
44
45
tv.tv_sec=10;
46
tv.tv_usec=0;
47
FD_ZERO(&rfds);
48
FD_SET(sockfd,&rfds);
49
50
printf("Connecting...\n");
51
if(connect(sockfd,(struct sockaddr*)&their_addr,sizeof(their_addr))!=0)
52
55
perror("connect");
56
exit(1);
57
58
59
else
60
61
printf("connected at once\n");
62
63
64
65
66
perror("select");
67
exit(-1);
68
69
70
71
72
if(FD_ISSET(sockfd, &rfds))
73
74
socklen_t err_len;
75
int error;
76
err_len=sizeof(error);
77
78
if(getsockopt(sockfd,SOL_SOCKET,SO_ERROR,&error,&err_len)==-1)
79
80
perror("getsockopt");
81
exit(1);
82
83
if(error != 0)
84
85
86
printf("Connection failed\n");
87
exit(-1);
88
89
90
else
91
92
93
exit(-1);
94
95
96
97
98
99
100
perror ("recv");
101
exit(1);
102
103
104
105
106
107
close (sockfd);
108
return 0;
109 }
:
. connect()
.
select().
fcntl() ( 37-38).
O_NONBLOCK, .
connect() ( 51) EINPROGRESS.
, connect() .
select() ( 64). rfds,
, . select() rfds
, . rfds
72 FD_ISSET.
78 . getsockopt()
. , .
96 , .. .
recv() ( 98) ,
.
:
. select()
timeout.
. TCP
TCP RST. timeout.
. TCP
TCP ACK. timeout.
#ifndef IP_MULTICAST_IF
/* include/netinet/in.h BSD 4.4. */
#define IP_MULTICAST_IF 9
/* / IP multicast */
#define
#define
#define
#define
#define
#define
#define
IP_MULTICAST_TTL 10
IP_MULTICAST_LOOP 11
IP_ADD_MEMBERSHIP 12
IP_DROP_MEMBERSHIP 13
IP_DEFAULT_MULTICAST_TTL 1
IP_DEFAULT_MULTICAST_LOOP 1
IP_MAX_MEMBERSHIPS 20
/*
/*
/*
/*
/ IP multicast TTL */
/ IP multicast */
() IP- */
IP- */
/* / multicast- */
typedef struct ip_mreq {
struct in_addr imr_multiaddr;
/* */
struct in_addr imr_interface;
/* */
}IP_MREQ;
#endif
...
#define DESTINATION_MCAST "234.5.6.7"
#define DESTINATION_PORT 4567
#define BUFSIZE 1024
...
int nRet, nSize, nOptVal;
SOCKET hSock;
char achInBuf[BUFSIZE];
struct sockaddr_in stSourceAddr, stDestAddr;
u_short nSourcePort;
struct ip_mreq stIpMreq;
...
/* (UDP) */
hSock = socket(PF_INET, SOCK_DGRAM, 0);
if (hSock == INVALID_SOCKET)
{ }
...
/* multicast-. */
...
/* */
stSourceAddr.sin_family = AF_INET;
stSourceAddr.sin_port = htons(nSourcePort);
stSourceAddr.sin_addr.s_addr = INADDR_ANY;
/* bind() ,
*/
nRet=bind(hSock,(struct sockaddr FAR *)&stSourceAddr,sizeof(struct sockaddr));
if (nRet == SOCKET_ERROR)
{
//
}
...
/* (loopback) multicast-, , . .
(. 2.9.3).*/
nOptVal = FALSE;
nRet=setsockopt(hSock,IPPROTO_IP,IP_MULTICAST_LOOP,(char FAR *)nOptVal, sizeof(int));
if (nRet == SOCKET_ERROR) {
/* , .
WinSock , . ,
loopback-, , .*/
bLoopFailed = TRUE;
}
...
/* IP TTL 1 64, multicast-
*/
nOptVal = 64;
nRet = setsockopt (hSock, IPPROTO_IP, IP_MULTICAST_TTL,(char FAR *)nOptVal, sizeof(int));
if (nRet == SOCKET_ERROR) {
}
...
/* */
stDestAddr.sin_family = AF_INET;
stDestAddr.sin_addr.s_addr = inet_addr (DESTINATION_MCAST);
stDestAddr.sin_port = htons (DESTINATION_PORT);
...
nRet = sendto (hSock, (char FAR *)achOutBuf,lstrlen(achOutBuf), 0,
(struct sockaddr FAR *) &stDestAddr,
sizeof(struct sockaddr));
if (nRet == SOCKET_ERROR)
{
//
}
...
/*----------------------- ------------------------ FD_READ ( , ,
) */
nRet = WSAAsyncSelect (hSock, hwnd, WM_READ_DATA, FD_READ);
if (nRet == SOCKET_ERROR)
{
//
}
...
/* , */
stIpMreq.imr_multiaddr.s_addr = DESTINATION_MCAST; /* */
stIpMreq.imr_interface.s_addr = INADDR_ANY; /* default */
nRet = setsockopt (hSock, IPPROTO_IP, IP_ADD_MEMBERSHIP,
(char FAR *)&stIpMreq, sizeof (struct ip_mreq));
if (nRet == SOCKET_ERROR) {
}
...
/* multicast- */
case WM_READ_DATA:
if (WSAGETSELECTERROR (lParam))
{
//
}
switch (WSAGETSELECTEVENT (lParam)) {
case FD_READ:
/* */
nSize = sizeof(struct sockaddr);
nRet = recvfrom (hSock, (char FAR *)achInBuf, BUFSIZE, 0, (struct sockaddr *) &stSockAddr,
&nSize);
if (nRet == SOCKET_ERROR)
{
//
} break;
}
8
UDP- (raw)
// Compile:
// cl -o Iphdrinc Iphdrinc.c ws2_32.lib
// Command Line Parameters/Arguments:
// iphdrinc [-fp:int] [-fi:str] [-tp:int] [-ti:str] [-n:int] [-m:str]
// -fp:int From -
// -fi:IP From - IP-
// -tp:int To
-
// -ti:IP To
- IP-
// -n:int
// -m:str
#pragma pack(1)
#define WIN32_LEAN_AND_MEAN //
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>
#define MAX_MESSAGE 4068
#define MAX_PACKET 4096
//
#define DEFAULT_PORT 5150
#define DEFAULT_IP "10.0.0.1"
#define DEFAULT_COUNT 5
#define DEFAULT_MESSAGE "This is a test"
// IP-. .
typedef struct ip_hdr
{
unsigned char ip_verlen;
// IP
unsigned char ip_tos;
// TOS
unsigned short ip_totallength;
//
unsigned short ip_id;
//
unsigned short ip_offset;
//
unsigned char ip_ttl;
// TTL
unsigned char ip_protocol;
//
unsigned short ip_checksum;
//
unsigned int ip_srcaddr;
//
unsigned int ip_destaddr;
//
} IP_HDR, *PIP_HDR, FAR* LPIP_HDR;
// UDP-
typedef struct udp_hdr
{
unsigned short src_portno;
//
unsigned short dst_portno;
//
unsigned short udp_length;
// UDP-
unsigned short udp_checksum;
// UDP- ( )
} UDP_HDR, *PUDP_HDR;
//
unsigned long dwToIP,
// IP
dwFromIP;
// IP (spoof)
unsigned short iToPort,
//
iFromPort;
// (spoof)
DWORD dwCount;
//
char strMessage[MAX_MESSAGE];
//
//
void usage(char *progname)
{
printf("usage: %s [-fp:int] [-fi:str] [-tp:int] [-ti:str]\
[-n:int] [-m:str]\n", progname);
printf(" -fp:int From (sender) port number\n");
printf(" -fi:IP From (sender) IP address\n");
printf(" -fp:int To (recipient) port number\n");
printf(" -fi:IP To (recipient) IP address\n");
printf(" -n:int Number of times to read message\n");
printf(" -m:str Size of buffer to read\n\n");
ExitProcess(1); // WinAPI, .
}
//
void ValidateArgs(int argc, char **argv)
{
int i;
iToPort = DEFAULT_PORT;
iFromPort = DEFAULT_PORT;
dwToIP = inet_addr(DEFAULT_IP);
dwFromIP = inet_addr(DEFAULT_IP);
dwCount = DEFAULT_COUNT;
strcpy(strMessage, DEFAULT_MESSAGE);
for(i = 1; i < argc; i++)
{
if ((argv[i][0] == '-') || (argv[i][0] == '/'))
{
switch (tolower(argv[i][1]))
{
case 'f': // From address
switch (tolower(argv[i][2]))
{
case 'p':if (strlen(argv[i]) > 4) iFromPort = atoi(&argv[i][4]);
break;
case 'i': if (strlen(argv[i]) > 4) dwFromIP = inet_addr(&argv[i][4]);
break;
default: usage(argv[0]);
break;
}
break;
case 't': //
switch (tolower(argv[i][2]))
{
case 'p': if (strlen(argv[i]) > 4) iToPort = atoi(&argv[i][4]);
break;
case 'i': if (strlen(argv[i]) > 4) dwToIP = inet_addr(&argv[i][4]);
break;
default:
usage(argv[0]);
break;
}
break;
case 'n': //
if (strlen(argv[i]) > 3)dwCount = atol(&argv[i][3]);
break;
case 'm': if (strlen(argv[i]) > 3) strcpy(strMessage, &argv[i][3]);
break;
default:
usage(argv[0]);
break;
}
}
}
return;
}
//
//
USHORT checksum(USHORT *buffer, int size)
{
unsigned long cksum=0;
while (size > 1)
{
cksum += *buffer++;
size -= sizeof(USHORT);
}
if (size)
{
cksum += *(UCHAR*)buffer;
}
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >>16);
return (USHORT)(~cksum);
}
// main(). , WinSock 2.0,
// IP_HDRINCL.
// IP UDP .
// .
int main(int argc, char **argv)
{
WSADATA wsd;
SOCKET sd;
BOOL bOpt=TRUE;
// IP_HDRINCL
struct sockaddr_in remote;
//
IP_HDR ipHdr;
// IP-
UDP_HDR udpHdr;
// UDP-
int ret;
DWORD i;
unsigned short iTotalSize,iUdpSize,iUdpChecksumSize, iIPVersion, iIPSize, cksum = 0;
char buf[MAX_PACKET], *ptr = NULL;
IN_ADDR addr;
//
ValidateArgs(argc, argv);
addr.S_un.S_addr = dwFromIP;
printf("From IP: <%s>\n Port: %d\n", inet_ntoa(addr),iFromPort);
addr.S_un.S_addr = dwToIP;
printf("To IP: <%s>\n Port: %d\n", inet_ntoa(addr), iToPort);
printf("Message: [%s]\n", strMessage);
printf("Count: %d\n", dwCount);
if (WSAStartup(MAKEWORD(2,2), &wsd) != 0) // WinSock
{
printf("WSAStartup() failed: %d\n", GetLastError());
return -1;
}
//
sd = WSASocket(AF_INET, SOCK_RAW, IPPROTO_UDP, NULL, 0,0);
if (sd == INVALID_SOCKET)
{
printf("WSASocket() failed: %d\n", WSAGetLastError());
return -1;
}
// IP_HDRINCL sd
ret = setsockopt(sd, IPPROTO_IP, IP_HDRINCL, (char *)&bOpt, sizeof(bOpt));
if (ret == SOCKET_ERROR)
{
printf("setsockopt(IP_HDRINCL) failed: %d\n", WSAGetLastError());
return -1;
}
// IP-
iTotalSize = sizeof(ipHdr) + sizeof(udpHdr) + strlen(strMessage);
iIPVersion = 4;
iIPSize = sizeof(ipHdr) / sizeof(unsigned long);
ipHdr.ip_verlen = (iIPVersion << 4) | iIPSize;
ipHdr.ip_tos = 0;
// TOS=0
ipHdr.ip_totallength = htons(iTotalSize); // IP-
ipHdr.ip_id = 0;
// , 0
ipHdr.ip_offset = 0;
//
ipHdr.ip_ttl = 128;
// TTL
ipHdr.ip_protocol = 0x11; // -(UDP)
ipHdr.ip_checksum = 0 ;
//
ipHdr.ip_srcaddr = dwFromIP;
//
ipHdr.ip_destaddr = dwToIP;
//
// UDP-
iUdpSize = sizeof(udpHdr) + strlen(strMessage);
udpHdr.src_portno = htons(iFromPort) ;
udpHdr.dst_portno = htons(iToPort) ;
udpHdr.udp_length = htons(iUdpSize) ;
udpHdr.udp_checksum = 0 ;
// UDP-
iUdpChecksumSize = 0;
ptr = buf;
ZeroMemory(buf, MAX_PACKET); // WinAPI, .
memcpy(ptr, &ipHdr.ip_srcaddr, sizeof(ipHdr.ip_srcaddr));
ptr += sizeof(ipHdr.ip_srcaddr);
iUdpChecksumSize += sizeof(ipHdr.ip_srcaddr);
memcpy(ptr, &ipHdr.ip_destaddr, sizeof(ipHdr.ip_destaddr));
ptr += sizeof(ipHdr.ip_destaddr);
iUdpChecksumSize += sizeof(ipHdr.ip_destaddr);
ptr++;
iUdpChecksumSize += 1;
memcpy(ptr, &ipHdr.ip_protocol, sizeof(ipHdr.ip_protocol));
ptr += sizeof(ipHdr.ip_protocol);
iUdpChecksumSize += sizeof(ipHdr.ip_protocol);
memcpy(ptr, &udpHdr.udp_length, sizeof(udpHdr.udp_length));
ptr += sizeof(udpHdr.udp_length);
iUdpChecksumSize += sizeof(udpHdr.udp_length);
memcpy(ptr, &udpHdr, sizeof(udpHdr));
ptr += sizeof(udpHdr);
iUdpChecksumSize += sizeof(udpHdr);
for(i = 0; i < strlen(strMessage); i++, ptr++)
*ptr = strMessage[i];
iUdpChecksumSize += strlen(strMessage);
cksum = checksum((USHORT *)buf, iUdpChecksumSize);
udpHdr.udp_checksum = cksum;
// IP UDP
ZeroMemory(buf, MAX_PACKET);
ptr = buf;
memcpy(ptr, &ipHdr, sizeof(ipHdr)); ptr += sizeof(ipHdr);
memcpy(ptr, &udpHdr, sizeof(udpHdr)); ptr += sizeof(udpHdr);
memcpy(ptr, strMessage, strlen(strMessage));
// sendto()
remote.sin_family = AF_INET;
remote.sin_port = htons(iToPort);
remote.sin_addr.s_addr = dwToIP;
for(i = 0; i < dwCount; i++) //
{
ret = sendto(sd, buf, iTotalSize, 0, (SOCKADDR *)&remote, sizeof(remote));
if (ret == SOCKET_ERROR)
{
printf("sendto() failed: %d\n", WSAGetLastError());
break;
}
else
printf("sent %d bytes\n", ret);
}
closesocket(sd) ;
WSACleanup() ;
return 0;
}
OC UNIX WINDOWS
2006
1. 4 Winsock 2.0
Windows,
Windows Sockets,
WinSock 2.0 2.2 [30][16].
, , ,
, ,
.
(API) WinSock 2.0
WinSock 1.1.
"-",
(TCP) (UDP) .
, .
API WinSock 2.0
TCP/IP IPX/SPX, ,
TCP/IP. WinSock
2.0 , Quality of Service (QoS
), .
, ,
.
WinSock 2.0 API ,
,
, . WinSock 2.0
, ATM, ISDN .
WinSock API WinSock 2.0:
- ,
, DNS, SAP, X.500 . .
/ .
(QoS Quality of Service).
.
-.
,
.
Scatter and Gather ( /).
.
/.
.
(LSP NSP)
API.
- WinSock 2.0 WOSA (Windows Open Service Architecture),
.
.
, WOSA, , -.
.
, "-" Microsoft
, .
,
, .dll, .
if(iProto == protInfo[i].iProtocol)
{
bRet = TRUE;
break;
}
WSACleanup();
return bRet;
}
....
if(isProto(IPPROTO_TCP))
{
/* TCPIP installed */
}
WinSock 2.0
ws2tcpip.h.
WinSock 1.1
WSAAccept()
WSAAsyncSelect()
. 3.6.3.1
WSACleanup()
. 3.5
WSACloseEvent()
. 4.3
WSAConnect()
WSACreateEvent()
. 4.3
WSADuplicateSocket()
WSAPROTOCOL_INFO
.
WSAEnumNetworkEvents()
. 4.3
WSAEnumProtocols()
. 4
10
WSAEventSelect()
. 4.3
11
WSAGetLastError()
12
WSAGetOverlappedResult()
. 4.3
13
WSAGetQOSByName()
QOS
14
WSAHtonl()
u_long
.
15
WSAHtons()
u_short
.
16
WSAIoctl()
17
WSAJoinLeaf()
18
WSANtohl()
u_long
.
. 3.7.3
19
WSANtohs()
u_short
.
20
WSARecv()
21
WSARecvDisconnect()
, .
22
WSARecvFrom()
23
WSAResetEvent()
. 4.3
24
WSASend()
25
WSASendDisconnect()
26
WSASendTo()
27
WSASetEvent()
. 4.3
28
WSASetLastError()
29
WSASocket()
30
WSAStartup()
31
WSAWaitForMultipleEvents()
. 4.3
32
WSAProviderConfigChange()
. 3.7.3
. 4.3
. 3.5
WSACancelBlockingCall(),
WSAIsBlocking(),
WSASetBlockingHook()
WSAUnhookBlockingHook() API
WinSock 1.1, , ""
WSAStartup() 2.0. WSAEINPROGRESS
.
API,
.
winsock2.h.
61.
WSAAccept()
, QOS
. SOCKET , INVALID_SOCKET.
SOCKET
IN
OUT
IN OUT
IN
IN
WSAAPI WSAAccept (
SOCKET
struct sockaddr FAR *
LPINT
LPCONDITIONPROC
DWORD
sd,
addr,
addrlen,
lpfnCondition,
dwCallbackData);
:
addr - (),
; ,
;
addrlen - ,
addr;
lpfnCondition - ,
(, IP-) CF_ACCEPT ,
CF_REJECT CF_DEFER .
WSAAccept() ,
, . ,
. CF_REJECT
WSAAccept() INVALID_SOCKET
WSAECONNREFUSED.
lpfnCondition,
SO_CONDITIONAL_ACCEPT
( - BOOL).
.
DwCallbackData - , .
WinSock.
(condition procedure) :
int CALLBACK ConditionFunc(
IN
LPWSABUF
IN
LPWSABUF
IN OUT
LPQOS
IN OUT
LPQOS
IN
LPWSABUF
OUT
LPWSABUF
OUT
GROUP FAR *
IN
DWORD
);
lpCallerId,
lpCallerData,
lpSQOS,
lpGQOS,
lpCalleeId,
lpCalleeData,
g,
dwCallbackData
.
, DLL
MakeProcInstance().
WinSock 2.0, MSDN - msdn.microsoft.com.
62.
WSAConnect()
connect() .
, (
), .
SOCKET_ERROR .
int WSAAPI WSAConnect (
IN
SOCKET
IN
const struct sockaddr FAR *
IN
int
IN
LPWSABUF
OUT
LPWSABUF
IN
LPQOS
IN
LPQOS
);
sd,
name,
namelen,
lpCallerData,
lpCalleeData,
lpSQOS,
lpGQOS
sd
- .
name - .
namelen .
LpCallerData - ,
( ).
LpCalleeData - ,
( ).
ATM- (RAWWAN)
. TCP/IP Windows .
63.
LpSQOS .
LpGQOS .
WSADuplicateSocket()
lpProtocolInfo WSAPROTOCOL_INFO
.
SOCKET_ERROR .
int WSAAPI WSADuplicateSocket (
IN
SOCKET
IN
DWORD
sd,
dwProcessId,
OUT
);
LPWSAPROTOCOL_INFO
lpProtocolInfo
sd .
dwProcessId ID ,
.
lpProtocolInfo -
WSAPROTOCOL_INFO. -
.
Shared Sockets
WSADuplicateSocket() is introduced to enable socket sharing across processes. A source process calls
WSADuplicateSocket() to obtain a special WSAPROTOCOL_INFO structure for a target process ID. It
uses some interprocess communications (IPC) mechanism to pass the contents of this structure to a target
process. The target process then uses the WSAPROTOCOL_INFO structure in a call to WSPSocket(). The
socket descriptor returned by this function will be an additional socket descriptor to an underlying socket
which thus becomes shared. Note however, that sockets may be shared amongst threads in a given process
without using the WSADuplicateSocket() function, since a socket descriptor is valid in all of a process
threads.
The two (or more) descriptors that reference a shared socket may be used independently as far as I/O is
concerned. However, the WinSock interface does not implement any type of access control, so it is up to the
processes involved to coordinate their operations on a shared socket. A typical use for shared sockets is to
have one process that is responsible for creating sockets and establishing connections, hand off sockets to
other processes which are responsible for information exchange.
Since what is duplicated are the socket descriptors and not the underlying socket, all of the state associated
with a socket is held in common across all the descriptors. For example a setsockopt() operation performed
using one descriptor is subsequently visible using a getsockopt() from any or all descriptors. A process may
call closesocket() on a duplicated socket and the descriptor will become deallocated. The underlying socket,
however, will remain open until closesocket() is called with the last remaining descriptor.
Notification on shared sockets is subject to the usual constraints of WSAAsyncSelect() and
WSAEventSelect(). Issuing either of these calls using any of the shared descriptors cancels any previous
event registration for the socket, regardless of which descriptor was used to make that registration. Thus, for
example, it would not be possible to have process A receive FD_READ events and process B receive
FD_WRITE events. For situations when such tight coordination is required, it is suggested that developers
use threads instead of separate processes.
64.
WSAGetQOSByName()
QOS ,
,
. TRUE FALSE .
BOOL WSAAPI WSAGetQOSByName(
IN
SOCKET
IN OUT
LPWSABUF
OUT
LPQOS
);
sd,
lpQOSName,
lpQOS
sd .
lpQOSName QOS
.
lpQOS - QOS, .
65.
WSAHtonl()
u_long .
sd,
hostlong,
lpnetlong
:
sd - .
hostlong
- 32- .
lpnetlong
- 32- .
WSAHtons(), WSANtohl() WSANtohs() ,
. SOCKET_ERROR .
66.
WSAIoctl()
( ) ,
. SOCKET_ERROR .
int WSAAPI WSAIoctl (
IN
SOCKET
sd,
IN
DWORD
dwIoControlCode,
IN
LPVOID
lpvInBuffer,
IN
DWORD
cbInBuffer,
OUT
LPVOID
lpvOutBuffer,
IN
DWORD
cbOutBuffer,
OUT
LPDWORD
lpcbBytesReturned,
IN
LPWSAOVERLAPPED
lpOverlapped,
IN
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);
sd - .
dwIoControlCode - .
lpvInBuffer
- .
cbInBuffer - .
lpvOutBuffer - .
cbOutBuffer - .
lpcbBytesReturned - .
lpOverlapped - WSAOVERLAPPED (NULL
).
lpCompletionRoutine - (NULL ).
ioctlsocket(),
WinSock 1.1 UNIX
dwIoControlCode 32- .
I1
O-1
V-1
T2
/ 11
16
I - 1, .
O - 1, .
V - 1, .
T = 0 UNIX IOCTL.
T = 1 IOCTL Windows Sockets 2.
T = 2 IOCTL .
T = 3 IOCTL .
,
"".
/ - T = 3 - ; T = 2
; T = 1
Windows Sockets 2 IOCTL; T = 0 , UNIX.
- 16- IOCTL .
WSAIoctl() ,
TCP (Pascal):
function GetSocketBufferDataSize(m_hSocket: Integer):Integer;
var
dwSize : dword;
dwBytesReturned : dword;
begin
// -
dwSize:=0;
WSAIoctl(m_hSocket, FIONREAD, nil, 0, @dwSize, SizeOf(DWORD), dwBytesReturned,
nil, nil);
Result:=dwSize;
end;
WSAIoctl() (MSDN):
tcp_keepalive,
mstcpip.h, SIO_KEEPALIVE_VALS.
tcp_keepalive:
struct tcp_keepalive {
u_long onoff;
// / keep-alive
//. onoff>0
u_long keepalivetime;//
//
u_long keepaliveinterval;// ,
// .
};
.
, sd.
struct tcp_keepalive alive;
DWORD dwRet, dwSize;
alive.onoff = 1;
alive.keepalivetime = 10000;
alive.keepaliveinterval = 1000;
dwRet = WSAIoctl(sock, SIO_KEEPALIVE_VALS, &alive, sizeof(alive), NULL, 0,
reinterpret_cast<DWORD*>(&dwSize), NULL, NULL);
if (dwRet == SOCKET_ERROR)
{
std::cout << "WSAIoctl fail with code " << WSAGetLastError() << "\n";
}
67.
WSAJoinLeaf()
,
. SOCKET
INVALID_SOCKET .
SOCKET WSAAPI WSAJoinLeaf (
IN
SOCKET
sd,
IN
const struct sockaddr FAR *
name,
IN
int
namelen,
IN
LPWSABUF
lpCallerData,
OUT
LPWSABUF
lpCalleeData,
IN
LPQOS
lpSQOS,
IN
IN
);
LPQOS
DWORD
lpGQOS,
dwFlags
68.
sd
- .
name - .
namelen - .
lpCallerData, lpCalleeData, lpSQOS, lpGQOS
WSAConnect() .
dwFlags , ,
.
WSARecv()
, .
, , ,
, alertable.
SOCKET_ERROR. WSA_IO_PENDING
.
, .
int WSAAPI WSARecv (
IN
SOCKET
sd,
IN OUT
LPWSABUF
lpBuffers,
IN
DWORD
dwBufferCount,
OUT
LPDWORD
lpNumberOfBytesRecvd,
IN OUT
LPDWORD
lpFlags,
IN
LPWSAOVERLAPPED
lpOverlapped,
IN
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);
sd .
lpBuffers WSABUF. WSABUF
.
dwBufferCount WSABUF lpBuffers.
lpNumberOfBytesRecvd ,
.
lpFlags .
lpOverlapped WSAOVERLAPPED (
).
lpCompletionRoutine - (
).
WSABUF :
typedef struct _WSABUF
{
u_long
len;
char FAR * buf;
} WSABUF, FAR * LPWSABUF;
//
//
WSARecvDisconnect()
,
. , SOCKET_ERROR.
sd,
lpInboundDisconnectData
70.
sd .
lpInboundDisconnectData .
WSARecvFrom()
.
SOCKET_ERROR .
int WSAAPI WSARecvFrom (
IN
SOCKET
sd,
IN OUT
LPWSABUF
lpBuffers,
IN
DWORD
dwBufferCount,
OUT
LPDWORD
lpNumberOfBytesRecvd,
IN OUT
LPDWORD
lpFlags,
OUT
struct sockaddr FAR *
lpFrom,
IN OUT LPINT
lpFromlen,
IN
LPWSAOVERLAPPED
lpOverlapped,
IN
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);
71.
sd - .
lpBuffers WSABUF.
dwBufferCount WSABUF lpBuffers.
lpNumberOfBytesRecvd - , ,
.
lpFlags .
lpFrom ,
.
lpFromlen (, lpFrom).
lpOverlapped WSAOVERLAPPED (
).
lpCompletionRoutinelpOverlapped (
).
WSASend()
.
SOCKET_ERROR .
int WSAAPI WSASend (
IN
SOCKET
sd,
IN
LPWSABUF
lpBuffers,
IN
DWORD
dwBufferCount,
OUT
LPDWORD
lpNumberOfBytesSent,
IN
DWORD
dwFlags,
IN
LPWSAOVERLAPPED
lpOverlapped,
IN
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);
sd .
lpBuffers WSABUF. WSABUF
.
dwBufferCount WSABUF lpBuffers.
lpNumberOfBytesSent ,
.
lpFlags .
72.
lpOverlapped WSAOVERLAPPED (
).
lpCompletionRoutine - (
).
WSASendDisconnect()
( shutdown() c
how=1) . ,
SOCKET_ERROR.
int WSAAPI WSASendDisconnect (
IN
SOCKET
OUT
LPWSABUF
);
sd,
lpOutboundDisconnectData
73.
sd .
lpOutboundDisconnectData .
WSASendTo()
, I/O c
. SOCKET_ERROR .
int WSAAPI WSASendTo (
IN
SOCKET
sd,
IN OUT
LPWSABUF
lpBuffers,
IN
DWORD
dwBufferCount,
OUT
LPDWORD
lpNumberOfBytesSent,
IN OUT
LPDWORD
lpFlags,
OUT
struct sockaddr FAR *
lpTo,
IN OUT
LPINT
lpTolen,
IN
LPWSAOVERLAPPED
lpOverlapped,
IN
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);
74.
sd - .
lpBuffers WSABUF.
dwBufferCount WSABUF lpBuffers.
lpNumberOfBytesSent - , ,
.
lpFlags .
lpTo .
lpToLen lpTo.
lpOverlapped WSAOVERLAPPED (
).
lpCompletionRoutinelpOverlapped (
).
WSAProviderConfigChange()
.
SOCKET_ERROR .
int WSAAPI WSAProviderConfigChange(
IN OUT
LPHANDLE
IN
LPWSAOVERLAPPED
IN
LPWSAOVERLAPPED_COMPLETION_ROUTINE
);
lpNotificationHandle,
lpOverlapped,
lpCompletionRoutine
:
lpNotificationHandle .
lpOverlapped - WSAOVERLAPPED.
lpCompletionRoutine - ,
.
,
, , Win32,
.
lpNotificationHandle NULL
,
lpNotificationHandle,
. ( )
I/O .
Win32 CloseHandle().
. 4.1 SPI
WOSA
,
.
WinSock SPI ws2spi.h SPI-
ws2_32.lib.
SPI 4 , 4.1.
4.1 SPI-
API
WSC
WSP
API
WPU
NSP
API
Win9x SPI-
76.
SPI
- LSP (Layered Service Provider). LSP- WinSock-
, , , .
LSP ,
, , ,
.., , TCP.
LSP WinSock ,
(chain). LSP Microsoft-.
, , LSP, WinSock,
LSP, .
HTTP-. ,
send(), LSP,
. LSP
, "" ,
, TCP. 4.2
LSP .
. 4.2 LSP
LSP ,
LSP, sporder.exe Microsoft LSP Explorer Lavasoft.
SPI-
WSPAccept()
WSAAddressToString()
WSPAddressToString()
WSAAsyncSelect()
WSPAsyncSelect()
bind()
WSPBind()
WSACancelBlockingCall()
WSPCancelBlockingCall()
WSACleanup()
WSPCleanup()
closesocket()
WSPCloseSocket()
WSPConnect()
WSADuplicateSocket()
WSPDuplicateSocket()
10
WSAEnumNetworkEvents()
WSPEnumNetworkEvents()
11
WSAEventSelect()
WSPEventSelect()
12
WSAGetOverlappedResult()
WSPGetOverlappedResult()
13
getpeername()
WSPGetPeerName()
14
getsockname()
WSPGetSockName()
15
getsockopt()
WSPGetSockOpt()
16
WSAGetQOSByName()
WSPGetQOSByName()
17
WSAIoctl()
WSPIoctl()
18
WSAJoinLeaf()
WSPJoinLeaf()
19
listen()
WSPListen()
20
WSPRecv()
21
WSARecvDisconnect()
WSPRecvDisconnect()
22
WSARecvFrom()(recvfrom()
WSPRecvFrom())
23
select()
WSPSelect()
24
WSPSend()
25
WSASendDisconnect()
WSPSendDisconnect()
26
WSPSendTo()
27
setsockopt()
WSPSetSockOpt()
WSPRecvFrom()
/ API
SPI-
28
shutdown()
WSPShutdown()
29
WSPSocket()
30
WSAStringToAddress()
WSPStringToAddress()
-
, .wsp .nsp.
, WinSock-, ws2_32.dll
SPI LSP.
WinSock SPI-. :
htonl(), htons(), ntohl(), and ntohs(), WSA-, ws2_32.dll
, inet_addr() inet_ntoa().
WSAGetXbyY(), WSACancelAsyncRequest() gethostname()
ws2_32.dll.
WinSock-, WSAEnumProtocols(),
WSAIsBlocking(),
WSASetBlockingHook()
WSAUnhookBlockingHook() ws2_32.dll. ,
WinSock 2.0
.
WSAGetLastError() WSASetLastError()
ws2_32.dll.
WSACreateEvent(),
WSACloseEvent(),
WSASetEvent(),
WSAResetEvent()
WSAPROTOCOL_INFOW
SPI,
, .
:
typedef struct _WSAPROTOCOL_INFO
{
DWORD dwServiceFlags1;
DWORD dwServiceFlags2;
DWORD dwServiceFlags3;
DWORD dwServiceFlags4;
DWORD dwProviderFlags;
GUID ProviderId;
DWORD dwCatalogEntryId;
WSAPROTOCOLCHAIN ProtocolChain;
int iVersion;
int iAddressFamily;
int iMaxSockAddr;
int iMinSockAddr;
int iSocketType;
int iProtocol;
int iProtocolMaxOffset;
int iNetworkByteOrder;
int iSecurityScheme;
DWORD dwMessageSize;
DWORD dwProviderReserved;
WCHAR szProtocol[WSAPROTOCOL_LEN+1];
} WSAPROTOCOL_INFOW;
:
dwServiceFlags1
, , .
. :
XP1_CONNECTIONLESS
(connectionless.) ,
.
XP1_GUARANTEED_DELIVERY
.
XP1_GUARANTEED_ORDER
.
XP1_MESSAGE_ORIENTED
.
XP1_PSEUDO_STREAM
, .
XP1_GRACEFUL_CLOSE
"" (graceful close - 1.7.12).
, (abortive) .
XP1_EXPEDITED_DATA
"" .
XP1_CONNECT_DATA
(connect data.)
XP1_DISCONNECT_DATA
(disconnect data.)
XP1_INTERRUPT
.
XP1_SUPPORT_BROADCAST
.
XP1_SUPPORT_MULTIPOINT
.
.
XP1_MULTIPOINT_CONTROL_PLANE
, ( = 1) (
= 0).
XP1_MULTIPOINT_DATA_PLANE
, ( = 1) ( =
0).
XP1_QOS_SUPPORTED
.
XP1_UNI_SEND
.
XP1_UNI_RECV
.
XP1_IFS_HANDLES
, ,
Installable File System (IFS).
XP1_PARTIAL_MESSAGE
MSG_PARTIAL WSASend() and WSASendTo().
dwServiceFlags2
.
dwServiceFlags3
.
dwServiceFlags4
.
dwProviderFlags
, .
:
PFL_MULTIPLE_PROTO_ENTRIES
,
, . - SPX,
(message-oriented) - .
PFL_RECOMMENDED_PROTO_ENTRY
,
.
PFL_HIDDEN
ws2_32.dll,
, WSAEnumProtocols().
WinSock 2 .
PFL_MATCHES_PROTOCOL_ZERO
, "0" socket() WSASocket()
.
ProviderId
GUID, . ,
.
GUID
.
dwCatalogEntryId
, WS2_32.DLL
WSAPROTOCOL_INFO.
ProtocolChain
WSAPROTOCOLCHAIN, .
0, WSAPROTOCOL_INFO LSP,
Windows Sockets 2 SPI. 1,
, dwCatalogEntryId
WSAPROTOCOL_INFO. . 1,
LSP . ID
ProtocolChain.ChainEntries, LSP (
ProtocolChain.ChainEntries) .
iVersion
.
iAddressFamily
, " " socket()
WSASocket().
iMaxSockAddr
.
iMinSockAddr
.
iSocketType
(SOCK_STREAM, SOCK_DGRAM ..).
iProtocol
(IPPROTO_TCP ..).
iProtocolMaxOffset
, iProtocol,
protocol socket() WSASocket().
. , iProtocolMaxOffset 0.
iNetworkByteOrder
(BIGENDIAN LITTLEENDIAN) - 0
1 .
iSecurityScheme
( ).
SECURITY_PROTOCOL_NONE
.
dwMessageSize
, .
:
0 stream-oriented .
0x1 (send) MTU
.
getsockopt() ( 2.9.2)
SO_MAX_MSG_SIZE.
0xFFFFFFFF - message-oriented,
.
dwProviderReserved
-.
szProtocol
"" , "SPX2".
WSAPROTOCOL_LEN 255.
LSP
, LSP.
LSP ,
Windows-DLL. ,
LSP, : WSPStartup(),
/,
4.3. ,
LSP , , , popup' .., , MS Windows.
LSP WSPStartup().
:
int WSPAPI WSPStartup(
WORD wVersionRequested,
// , ,[in]
LPWSPDATA lpWSPData,
// WSADATA,[out]
LPWSAPROTOCOL_INFOW lpProtocolInfo,
//
// WSAPROTOCOL_INFOW,[in]
WSPUPCALLTABLE UpCallTable,
//
// ws2_32.dll,[in]
LPWSPPROC_TABLE lpProcTable
// SPI-,[out]
);
WSAStartup().
[in] [out]
WSAPROTOCOL_INFOW
. LSP
. "-" WSPStartup()
. UpCallTable,
ws2_32.dll, WinSock-,
lpProcTable LSP, ,
.
UpCallTable " - upcall"
WPU.
WSPStartup() :
1. , .
2. lpWSPData lpProcTable.
3. (
).
,
WSPStartup() WSPCleanup().
0,
.
WSPDATA. LSP ,
lpWSPData , WSPStartup().
WSPPROC_TABLE ,
LSP, .
LSP ,
, .
lpProtocolInfo, (
[27]).
LSP WinSock,
4.3:
4.3 WinSock, LSP
ID
1021
LSP2
TCP/IP
1022
LSP2
UDP/IP
1020
LSP2
1010
LSP1
TCP/IP
1009 1001
1011
LSP1
UDP/IP
1009 1002
1009
LSP1
1001
1002
" (dummy)" LSP ,
WSAPROTOCOL_INFOW, LSP, ,
ID.
DLL
WSCGetProviderPath(). :
int WSCGetProviderPath(
LPGUID lpProviderId,
LPWSTR lpszProviderDllPath,
LPINT lpProviderDllPathLen,
LPINT lpErrno
);
0
.
, LSP TCP/IP Windows
msafd.dll , WSPSocket()
LSP . , msafd.dll,
DLL, ( WSPStartup() WsControl()), WSPSocket()-
" ",
.
- , , LSP
WSAPROTOCOL_INFOW .
,
, , WPUCreateSocketHandle()
, ,
.
LSP, LSP
. LSP,
, XP1_IFS_HANDLES
WSAPROTOCOL_INFO-,
ReadFile() and WriteFile() . ,
IFS ( Installable File System ).
:
SOCKET WPUCreateSocketHandle(
DWORD dwCatalogEntryId,
DWORD_PTR dwContext,
LPINT lpErrno
);
// ID WinSock
// ,
//
,
_SOCK_INFO .
WSPSocket() [27].
LSP
LSP,
WinSock. WinSock 2.0.
,
.
,
,
sd=socket(AF_INET, SOCK_STREAM,0);
( )
ws2_32.dll. WinSock 2.0
, . 0
,
IPPROTO_TCP. LSP,
, TCP,
, LSP?
WinSock, LSP
.
LSP
WSAPROTOCOL_INFOW, LSP
( ), .
WSAPROTOCOLCHAIN:
typedef struct _WSAPROTOCOLCHAIN {
int ChainLen;
DWORD ChainEntries[MAX_PROTOCOL_CHAIN];
} WSAPROTOCOLCHAIN, FAR * LPWSAPROTOCOLCHAIN;
ChainLen ( ) :
ChainLen 0 () ()
ChainLen 1 ()
ChainLen 2
0 2 .
, ChainEntries WinSock-
. dwCatalogEntryId
WSAPROTOCOL_INFOW.
, LSP MsTCP-,
ChainLen 2. ChainEntries ,
ID , ID MsTCP-. ,
, , WSAPROTOCOL_INFOW,
LSP, dwCatalogEntryId
. LSP
WSCInstallProvider(). " ",
ChainLen 0. LSP.
WSAPROTOCOL_INFOW "",
DLL. , WSAEnumProtocols()
, " " hainLen=0. WSCEnumProtocols(),
LSP, "".
MAX_PROTOCOL_CHAIN 7.
LSP WSCInstallProvider():
int WSPAPI WSCInstallProvider(
IN LPGUID lpProviderId,
IN const WCHAR FAR *lpszProviderDllPath,
IN const LPWSAPROTOCOL_INFOW lpProtocolInfoList,
IN DWORD dwNumberOfEntries,
OUT LPINT lpErrno
);
, . -,
UNICODE-. LSP GUID (Globally
Unique IDentifier), "" UUIDGEN.EXE
UuidCreate(). lpszProviderDllPath
UNICODE-.
WinSock.
lpProtocolInfoList WSAPROTOCOL_INFOW
. .
dwNumberOfEntries .
WSAPROTOCOL_INFOW ,
"" , 2- :
szProtocol , .
XP1_IFS_HANDLES dwServiceFlags1, -
. ,
ReadFile() WriteFile().
WinSock ,
,
WSCWriteProviderOrder() , .
, .
ws2_32.dll
DLL ,
dwProviderFlags
WSAPROTOCOL_INFOW
PFL_MATCHES_PROTOCOL_ZERO, ,
, .. LSP ( MSAFD TCP - ).
LSP .
LSP , "",
, WSCDeinstallProvider(),
GUID LSP "", ,
.
.
SPI
, WinSock SPI,
.
API.
WinSock DLL ,
.
WinSock WSAIoctl(), - .
. WSAIoctl(),
SIO_GET_EXTENSION_FUNCTION_POINTER.
WSAIoctl() ,
.
.
, , WSPShutdown() ( how
SD_SEND SD_BOTH), WSPSendDisconnect(). WSPCloseSocket()
.
-
FD_CLOSE.
, ,
WSPSendDisconnect() WSPRecvDisconnect().
WSPCloseSocket().
WinSock SPI WSPShutdown(), WSPSendDisconnect()
, WSPCloseSocket()
.
SO_LINGER SO_DONTLINGER
:
,
.
() (graceful shutdown);
.
,
.
. .
, .
WSPCloseSocket()
-
/, (4.2) . ,
, ,
.
NSP,
, , .
[27] MSDN.
6. (completion port).
. - /
select() - , ,
, ioctlsocket().
, , UNIX-,
. , , Windows
.
Windows-
, .
-
WSAEVENT WSACreateEvent():
WSAEVENT WSACreateEvent(void);
(Event-handle),
WSAEventSelect():
int WSAEventSelect(
SOCKET
WSAEVENT
long
);
sd,
hEventObject,
lNetworkEvents
hEventObject . ,
.
WSAResetEvent() . WSAEVENT HANDLE
API.
, , lNetworkEvents,
, WSAAsyncSelect()
FD_READ, FD_ACCEPT (3.6.3.1), :
//
NewEvent = WSACreateEvent();
// NewEvent FD_ACCEPT
// FD_CLOSE
WSAEventSelect( ListenSocket, NewEvent, FD_ACCEPT | FD_CLOSE);
WSAEventSelect() 0,
, - SOCKET_ERROR.
-, ,
. "" -",
" " "". ,
Windows, .
WSACreateEvent() - ""
. , ""
. "" , ()
/
WSAResetEvent():
BOOL WSAResetEvent(WSAEVENT hEvent);
-,
WSACloseEvent() , :
BOOL WSACloseEvent(WSAEVENT hEvent);
WSAAsyncSelect(), WSAEventSelect()
.
ioctlsocket()/WSAIoctl().
WSAWaitForMultipleEvents(). WaitForSingleObject() API
.
, ( )
" "
"". WSAWaitForMultipleEvents() :
DWORD WSAWaitForMultipleEvents(
DWORD
cEvents,
const WSAEVENT FAR
* lphEvents,
BOOL
fWaitAll,
DWORD
dwTimeout,
BOOL
fAlertable
);
cEvents
, lphEvents .
( WSAEVENT)
:
, cEvents=0
"" .
,
(thread) WSA_MAXIMUM_WAIT_EVENTS, 64.
64 , .
fWaitAll , , "". "TRUE",
"" . ,
"" , ,
" WSA_WAIT_EVENT_0"
. FALSE
. dwTimeout
. 0,
. ,
WSA_WAIT_TIMEOUT. dwsTimeout
WSA_INFINITE, (
select() 2.5.7). fAlertable ""
WSAEventSelect() ,
/ , FALSE.
4.1 :
4.1
WSAEVENT
EventArray[WSA_MAXIMUM_WAIT_EVENTS];
int
Total=0, res, i;
// EventArray -
...
while (1)
{
res=WSAWaitForMultipleEvents(Total,EventArray,FALSE,WSA_INFINITE,FALSE);
if ((res != WSA_WAIT_FAILED) && (res != WSA_WAIT_TIMEOUT))
{
//
i = res - WSA_WAIT_EVENT_0;
// EventArray[i]
...
// ("")
WSAResetEvent(EventArray[i]);
}
}
. , ( )
, ,
" " ,
WSAWaitForMultipleEvents() ,
dwTimeOut 0.
:
W
S
A
_
W
Af
IW
Ta
_i
Et
VA
El
Nl
T
_
0
t
o
(
W
SAT
_R
WU
AE
I,
T
_
E
V
E
N
T
_
0
c
E
v
e
n
t
s
-
1
)
f
W
a
i
t
A
l
l
F
A
L
S
E
,
W
S
A
_
W
A
I
T
_
E
V
E
N
T
_
0
l
p
h
E
v
e
n
t
s
l
p
h
E
v
e
n
t
s
.
W
S
A
_
W
A
I
T
_
I
O
_
C
O
M
P
L
E
T
I
O
N
W
S
A
W
a
i
t
F
o
r
M
u
l
t
i
p
l
e
E
v
e
n
t
s
(
)
f
A
l
e
r
t
a
b
l
e
T
R
U
E
.
W
S
A
_
W
A
I
T
_
T
I
M
E
O,
U
T
f
W
a
i
t
A
l
l
.
, WSA_WAIT_FAILED.
WSAWaitForMultipleEvents()
, sd
WSAEnumNetworkEvents():
int WSAEnumNetworkEvents(
SOCKET sd,
//[in]
WSAEVENT hEventObject,
//[in]
LPWSANETWORKEVENTS lpNetworkEvents //[out]
);
hEventObject ,
, lpNetworkEvents
:
typedef struct _WSANETWORKEVENTS
{
long lNetworkEvents;
//
int iErrorCode[FD_MAX_EVENTS];
//
} WSANETWORKEVENTS, FAR * LPWSANETWORKEVENTS;
FD_XXX ,
or . lNetworkEvents
, , . ,
(lNetworkEvents and FD_XXX) , , FD_XXX
.
,
:
WSAEnumNetworkEvents(SocketsArray[index1], EventArray[index2], &info)
if (info.lNetworkEvents & FD_READ)
//info
//
{
//
}
_BIT
, FD_READ_BIT:
if (NetworkEvents.iErrorCode[FD_READ_BIT] != 0)
{
printf("FD_READ failed with error %d\n",
NetworkEvents.iErrorCode[FD_READ_BIT]);
break;
}
/ WSAEventSelect()
,
Windows, .
, .
/ (
) Overlapped I/O.
,
c WSASocket():
SOCKET WSASocket(
int af,
int type,
int protocol,
LPWSAPROTOCOL_INFO lpProtocolInfo,
GROUP g,
DWORD dwFlags);
,
.
WSAPROTOCOL_INFO. lpProtocolInfo NULL, , , ws2_32.dll af, type protocol.
, 0, ,
WSAPROTOCOL_INFO.
lpProtocolInfo ,
, SOCKET_ERROR,
WSAGetLastError() - WSA_IO_PENDING.
WSASend():
int WSASend(
SOCKET
sd,
LPWSABUF
lpBuffers,
DWORD
dwBufferCount,
LPDWORD
lpNumberOfBytesSent,
DWORD
dwFlags,
LPWSAOVERLAPPED
lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);
WSABUF,
dwBufferCount. (scatter/gather)
2.5.5. lpNumberOfBytesSent - DWORD,
.
dwFlags send().
,
lpOverlapped
(
WSAOVERLAPPED)
lpCompletionRoutine ( )
.
12
"" WSAOVERLAPPED,
/.
, WSAOVERLAPPED,
.
WSAOVERLAPPED OVERLAPPED Win32 API.
typedef struct WSAOVERLAPPED
{
DWORD
Internal;
DWORD
InternalHigh;
DWORD
Offset;
DWORD
OffsetHigh;
WSAEVENT hEvent;
} WSAOVERLAPPED, FAR * LPWSAOVERLAPPED;
Internal, InternalHigh, Offset OffsetHigh
. hEvent
WSAEVENT
- lpCompletionRoutine NULL. lpCompletionRoutine
NULL, .
/
event-,
" ",
WSAOVERLAPPED_COMPLETION_ROUTINE
6- .
,
.
,
, -
WSAGetOverlappedResult().
c - WinSock
, WSAOVERLAPPED "",
/ .
WSAWaitForMultipleEvents(). ,
,
WSAGetOverlappedResult():
BOOL WSAGetOverlappedResult(
SOCKET
sd,
LPWSAOVERLAPPED
lpOverlapped,
LPDWORD
lpcbTransfer,
BOOL
fWait,
LPDWORD
lpdwFlags
);
lpOverlapped WSAOVERLAPPED,
. lpcbTransfer ,
. fWait
, , .
fWait=TRUE . fWait=FALSE
FALSE
WSA_IO_INCOMPLETE. ""
, . lpdwFlags
, ,
WSARecv() WSARecvFrom().
WSAGetOverlappedResult() TRUE.
FALSE, :
I/O- .
I/O- , .
I/O- -
WSAGetOverlappedResult().
/ -
, WSPSocket() WSA_FLAG_OVERLAPPED.
/
- " - ompletion routines". callback-,
. ,
, ,
.
, ,
WSAOVERLAPPED ,
, WSASend() .
:
void CALLBACK CompletionRoutine(
DWORD dwError,
DWORD cbTransferred,
LPWSAOVERLAPPED lpOverlapped,
DWORD dwFlags
);
dwError - lpOverlapped.
cbTransferred .
lpOverlapped WSAOVERLAPPED,
I/O-.
dwFlags , .
,
, hEvent.
, ,
alertable state.
WSAWaitForMultipleEvents() "" , ,
Windows SleepEx() ,
WSAWaitForMultipleEvents(), . SleepEx() :
DWORD SleepEx(
DWORD dwMilliseconds,
BOOL bAlertable
);
SleepEx() . bAlertable=FALSE
callback-, dwMilliseconds.
TRUE, , SleepEx()
I/O - WAIT_IO_COMPLETION.
dwMilliseconds=INFINITE,
Win9x, ,
WinNT, Win2K WinXP. -
. 0,
, (
setsockopt() SO_SNDBUF/SO_RCVBUF) -
-
/
9.
/, , " "
completion port. ,
() ,
/ .
, (
,
www.microsoft.com),
I/O- ,
. Windows NT, Windows 2000,
Windows XP Windows Server 2003 . ,
, MSDN, 16-
.
, " ".
CreateIoCompletionPort(),
() (. 4.5.1.1)
I/O ,
.
- I/O,
, I/O-
. CreateIoCompletionPort(),
:
HANDLE CreateIoCompletionPort(
HANDLE FileHandle,
HANDLE ExistingCompletionPort,
DWORD CompletionKey,
DWORD NumberOfConcurrentThreads
);
, ,
:
1.
2.
,
- NumberOfConcurrentThreads; .
NumberOfConcurrentThreads , ,
. ,
,
. 0
, . I/O:
CompletionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL, 0, 0);
, ,
, .
, ,
. -
, ,
. ,
, ?
, ,
, .
CreateIoCompletionPort()
; .
, CreateIoCompletionPort()
.
NumberOfConcurrentThreads CreateIoCompletionPort()
n .
n , n
. (,
, ,
CreateIoCompletionPort().)
, ,
CreateIoCompletionPort()?
, .
( proxy- -
WaitForSingleObject()) "" Sleep() -
. ..
-
NumberOfConcurrentThreads, - -
.
NumberOfConcurrentThread .
, /
, .
CreateIoCompletionPort()
FileHandle, ExistingCompletionPort CompletionKey
.
FileHandle , .
ExistingCompletionPort ,
. CompletionKey "per-handle data",
.
, , .
"per-handle data" " ". ,
, "" . , ,
, .
,
, /.
, , LIFO. ,
, ,
, .
-, /
. ECHO-,
. :
1. . 0 -
.
2. , .
3. I/O- ,
2. ,
, , -
, ,
. CreateThread(),
, .
4. , 5150.
5. accept().
6. , " per-handle data"
.
7. , accept(), ,
CreateIoCompletionPort().
"per-handle data"
CreateIoCompletionPort() .
8. I/O . ,
WSARecv() WSASend() ,
/ .
(.. ). ( ),
.
5-8, .
., :
4.2 IOCompletionPort
InternetAddr.sin_port = htons(5150);
bind(Listen, (PSOCKADDR) &InternetAddr,sizeof(InternetAddr));
//
listen(Listen_socket, 5);
while(TRUE)
{
PER_HANDLE_DATA *PerHandleData=NULL;
SOCKADDR_IN saRemote;
SOCKET Accept_socket;
int RemoteLen;
// 5:
//
RemoteLen = sizeof(saRemote);
Accept_socket = WSAAccept(Listen_socket, (SOCKADDR *)&saRemote,&RemoteLen);
// 6:
// " per-handle data",
PerHandleData = (LPPER_HANDLE_DATA) GlobalAlloc(GPTR,
sizeof(PER_HANDLE_DATA));
printf("Socket number %d connected\n", Accept_socket);
PerHandleData->Socket = Accept_socket;
memcpy(&PerHandleData->ClientAddr, &saRemote, RemoteLen);
// 7:
//
CreateIoCompletionPort((HANDLE)Accept_socket,CompletionPort,(DWORD)
PerHandleData,0);
// 8:
// / .
// WSASend() WSARecv()
// I/O.
// WSARecv() / WSASend()
// , SOCKET_ERROR
// WSA_IO_PENDING, (
// ).
}
DWORD WINAPI ServerWorkerThread(LPVOID lpParam)
{
.....
return 0;
}
/,
, ,
.
. GetQueuedCompletionStatus(),
.
, I/O.
BOOL GetQueuedCompletionStatus(
HANDLE CompletionPort,
// the I/O completion port of interest
LPDWORD lpNumberOfBytesTransferred,// to receive number of bytes
// transferred during I/O
LPDWORD lpCompletionKey,
// to receive file's completion key
LPOVERLAPPED *lpOverlapped, // to receive pointer to OVERLAPPED structure
DWORD dwMilliseconds
// optional timeout value
);
:
CompletionPort
lpNumberOfBytesTransferred - -
WSASend/WSARecv
lpCompletionKey - ,
lpOverlapped OVERLAPPED-
dwMilliseconds - (INFINITE - )
,
FALSE *lpOverlapped NULL. dwMilliseconds =0
, .
. *lpOverlapped
NULL , 0.
, GetLastError() WAIT_TIMEOUT.
, , , GetQueuedCompletionStatus()
ERROR_SUCCESS, *lpOverlapped -NULL lpNumberOfBytes 0.
lpOverlapped OVERLAPPED, ,
Per-I/O,
( ECHO-, , ,
- / ). Per-I/O ,
, OVERLAPPED,
, OVERLAPPED.
- OVERLAPPED
. , ,
Per-I/O:
typedef struct {
OVERLAPPED Overlapped;
// :
WSABUF DataBuf;
CHAR Buffer[DATA_BUFSIZE];
DWORD BytesSend;
DWORD BytesRecv;
DWORD OperationType;
DWORD TotalBytes;
.....
} PER_IO_OPERATION_DATA;
OVERLAPPED
, / , - /,
- , ,
.
, WinSock- OVERLAPPED . :
PER_IO_OPERATION_DATA PerIoData;
...
WSARecv(socket, &wbuf, 1, &Bytes, &Flags, &(PerIoData.Overlapped),NULL);
GetQueuedCompletionStatus()
. per-I/O ,
CONTAINING_RECORD. :
PER_IO_DATA *PerIoData=NULL;
OVERLAPPED
*lpOverlapped=NULL;
ret = GetQueuedCompletionStatus(CompPortHandle,&Transferred,
(PULONG_PTR)&CompletionKey,&lpOverlapped,INFINITE);
PerIoData = CONTAINING_RECORD(lpOverlapped, PER_IO_DATA, Overlapped);
OVERLAPPED-
PER_IO_DATA , ,
.
, ,
PerIoData - , ..
- I/O
. , ,
,
.
ECHO
ServerWorkerThread():
4.3 ServerWorkerThread():
.
, GetQueuedCompletionStatus() FALSE.
Windows, GetLastError().
WinSock- , WSAGetOverlappedResult()
WSAOVERLAPPED,
WSAGetLastError() WinSock-.
- ..
. ""
OperationType PER_IO_OPERATION_DATA
, :
switch (PerIoData->OperationType)
{
case SRV_NEW_CONNECTION:
// :
...
case SRV_DATA_SEND:
//
...
case SRV_DATA_RECV:
//
...
case SRV_DISCONNECT:
//
.......
}
-
OVERLAPPED, - . ,
closesocket()
. ,
. PostQueuedCompletionStatus(),
, :
BOOL PostQueuedCompletionStatus(
HANDLE CompletionPort,
DWORD dwNumberOfBytesTransferred,
DWORD dwCompletionKey,
LPOVERLAPPED lpOverlapped
);
//
//
//
//
GetQueuedCompletionStatus()
GetQueuedCompletionStatus()
GetQueuedCompletionStatus()
CompletionPort - , ,
GetQueuedCompletionStatus() -
-
- , , Etc...
GetQueuedCompletionStatus()
, ,
. , 0
dwCompletionKey-,
.
CloseHandle()
.
30. I/O
/ WinSock
, () ,
,
,
. ,
:
1. "" "" ,
, .
2. ""
, .
,
select().
3. select(). select()
, .
select() .
4. (WSAAsyncSelect()),
,
,
.
5. - WSAEventSelect(),
select(), . ,
, select() -, WSAEventSelect()
WinSock.
6. I/O WinSock 2,
I/O- Win32
API
.
7. I/O ompletion Port
.
,
I/O,
.
, ,
,
.
, Windows 9x I/O ,
, API, ReadFile()
Windows 9x . UNIX , I/O ,
. , UNIX-like
"" aio_*(), WinSock-
.
, UNIX-like
" Posix Posix threads", API
UNIX Windows .
select()
- ,
.
, .
WSAAsyncSelect()
, ,
.
WSAEventSelect()
WSAAsyncSelect(), ""
. , 100
. , " " 64 (
) , 1024 , 16 !
1-100 -
.
I/O
.
( ),
.
. ,
(GUI), .
"" ,
.
FTP-, -,
, email-
.
.
API
WinSock 2
Extension API, ,
. AcceptEx(), ConnectEx(),
DisconnectEx(), TransmitFile(), TransmitPackets() WSARecvMsg().
GetAcceptExSockaddrs() AcceptEx().
MSWSOCK.H, - mswsock.dll. 3
mswsock.dll AcceptEx(),
GetAcceptExSockaddrs() TransmitFile(),
, mswsock.lib.
DLL WSAIoctl()
SIO_GET_EXTENSION_ FUNCTION_POINTER,
GUID[27]. WSAStringToAddress()
IPv4 Inet_Addr(), WSAAddressToString(), .
WSADuplicateSocket():
int WSADuplicateSocket(
SOCKET sd,
DWORD dwProcessId,
LPWSAPROTOCOL_INFO lpProtocolInfo);
sd , , dwProcessID , .
ProtocolInfo , .
- ,
WSASocket() .
WSADuplicateSocket() SOCKET_ERROR
.
77.1.1.1.
AcceptEx()
AcceptEx() ,
- - Web
. ,
.
. TRUE FALSE .
Windows Me/98/95.
BOOL PASCAL FAR AcceptEx (
IN SOCKET sListenSd,
IN SOCKET sAcceptSd,
//
// ,
//
IN PVOID lpOutputBuffer,
//
//
//
IN DWORD dwReceiveDataLen, // , 0,
//
//
IN DWORD dwLocalAddrLen,
// +16
IN DWORD dwRemoteAddrLen, // +16 .
// 0.
OUT LPDWORD lpdwBytesRecevd,//
IN LPOVERLAPPED lpOverlapped// WSAOVERLAPPED,
);
sAcceptSd ,
,
.
AcceptEx() .
. accept() ,
"" ,
, AcceptEx() sAcceptSd
, sListenSd ,
setsockopt() SO_UPDATE_ACCEPT_CONTEXT, :
err = setsockopt( sAcceptSocket,SOL_SOCKET,SO_UPDATE_ACCEPT_CONTEXT,
(char *)&sListenSocket,sizeof(sListenSocket) );
4.4 AcceptEx()
( MSDN):
4.4 AcceptEx()
include <stdio.h>
#include "winsock2.h"
#include "mswsock.h"
void main() {
//
WSADATA wsaData;
HANDLE hCompPort;
//
LPFN_ACCEPTEX lpfnAcceptEx = NULL;
// AcceptEx()
GUID GuidAcceptEx = WSAID_ACCEPTEX;
// GUID AcceptEx()
WSAOVERLAPPED olOverlap;
//
SOCKET ListenSd,AcceptSd;
sockaddr_in server;
char lpOutputBuf[1024];
int outBufLen = 1024;
DWORD dwBytes;
// WinSock
int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
if( iResult != NO_ERROR )
printf("Error at WSAStartup\n");
//
hCompPort = CreateIoCompletionPort( INVALID_HANDLE_VALUE, NULL, (u_long)0, 0 );
//
SListensd = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
if (SListensd == INVALID_SOCKET) {
printf("Error at socket(): SListensd\n");
WSACleanup();
return;
}
//
CreateIoCompletionPort((HANDLE)SListensd, hCompPort, (u_long)0, 0);
// IPv4 20000
hostent* OurHost;
char* ip;
u_short port = 20000;
OurHost = gethostbyname("");
ip = inet_ntoa (*(struct in_addr *)*OurHost->h_addr_list);
server.sin_family = AF_INET;
server.sin_addr.s_addr = inet_addr(ip); server.sin_port = htons(port);
if ( bind( SListensd,(SOCKADDR*) &server, sizeof(server) ) == SOCKET_ERROR )
{
printf("bind failed\n");
closesocket(SListensd);
return;
}
//
if (listen( SListensd, 150 ) == SOCKET_ERROR)
{
printf("error listening\n");
}
printf("Listening on address: %s:%d\n", ip, port);
// AcceptEx() , WSAIoctl(), .
// I/O .
WSAIoctl(SListensd,SIO_GET_EXTENSION_FUNCTION_POINTER,&GuidAcceptEx, sizeof(GuidAcceptEx),
&lpfnAcceptEx,sizeof(lpfnAcceptEx),&dwBytes,NULL,NULL);
//
AcceptSd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (AcceptSd == INVALID_SOCKET)
{
printf("Error creating accept socket.\n");
WSACleanup();
return;
}
// .
memset(&olOverlap, 0, sizeof(olOverlap));
// AcceptEx()
lpfnAcceptEx(SListensd,AcceptSd,lpOutputBuf,outBufLen-((sizeof(sockaddr_in)+ 16)*2),
sizeof(sockaddr_in)+16,sizeof(sockaddr_in)+16,&dwBytes,&olOverlap);
// AcceptSd
CreateIoCompletionPort((HANDLE)AcceptSd, hCompPort, (u_long)0, 0);
// - send(),
recv(),
// TransmitFile() ..
...
}
16
sockaddr , ,
TDI (Transport Driver Interface). TCP/IP ..
32 .
AcceptEx(),
,
MSDN. , GetAcceptExSockaddrs(),
,
AcceptEx() lpOutputBuffer.
, TDI. , SOCKADDR.
:
VOID PASCAL FAR GetAcceptExSockaddrs (
IN PVOID
lpOutputBuffer,
IN DWORD
dwReceiveDataLength,
IN DWORD
dwLocalAddressLength,
IN DWORD
dwRemoteAddressLength,
OUT struct sockaddr **LocalSockaddr,
OUT LPINT
LocalSockaddrLength,
OUT struct sockaddr **RemoteSockaddr,
OUT LPINT
RemoteSockaddrLength
);
AcceptEx()
. . , AcceptEx()
:
SOCKADDR *lpLocalSockaddr=NULL, *lpRemoteSockaddr=NULL;
int LocalSockaddrLen=0, RemoteSockaddrLen=0;
// GetAcceptExSockaddrs()
LPFN_GETACCEPTEXSOCKADDRS lpfnGetAcceptExSockaddrs=NULL;
//
lpfnGetAcceptExSockaddrs(buf,buflen - ((sizeof(SOCKADDR_IN) + 16) * 2),
sizeof(SOCKADDR_IN) + 16,sizeof(SOCKADDR_IN) + 16,&lpLocalSockaddr,
&LocalSockaddrLen,&lpRemoteSockaddr,&RemoteSockaddrLen);
WSAIoctl()
lpfnGetAcceptExSockaddrs, 4.2.
GetAcceptExSockaddrs() .
77.1.1.2.
ConnectEx(), DisconnectEx()
ConnectEx()
(connect data).
TRUE, FALSE .
(
- )
connect' . lpOverlapped
NULL. , ,
: ReadFile(), WriteFile(), send()
WSASend(), recv() WSARecv(), TransmitFile() closesocket().
BOOL (PASCAL FAR *LPFN_CONNECTEX) (
IN SOCKET sd,
IN const struct sockaddr FAR
IN int
IN PVOID
IN DWORD
OUT LPDWORD
IN LPOVERLAPPED
);
sd
*name,
namelen,
lpSendBuffer,
dwSendDataLength,
lpdwBytesSent,
lpOverlapped
bind()
, . lpOverlapped
WSAOVERLAPPED . ,
, TCP/IP . ConnectEx() DisconnectEx()
Windows XP Windows Server 2003 ,
Windows NT 4.0 Windows 2000.
DisconnectEx()
,
AcceptEx() ConnectEx(). ,
TransmitFile() TransmitPackets()
, DisconnectEx() ,
.
typedef BOOL(PASCAL FAR * LPFN_DISCONNECTEX) (
IN
IN
IN
IN
);
SOCKET sd,
LPOVERLAPPED
DWORD
DWORD
lpOverlapped,
dwFlags,
dwReserved
. dwFlags 0 TF_REUSE_SOCKET.
, TF_REUSE_SOCKET
AcceptEx().
0.
77.1.1.3.
TransmitFile(), TransmitPackets()
TransmitFile()
,
""
.
,
. TRUE FALSE .
WSASend()/ReadFile(),
- TransmitFile()
.
BOOL PASCAL FAR TransmitFile (
IN SOCKET
hSocket,
IN HANDLE
hFile,
IN DWORD
nNumberOfBytesToWrite,
IN DWORD
nNumberOfBytesPerSend,
IN LPOVERLAPPED
lpOverlapped,
IN LPTRANSMIT_FILE_BUFFERS lpTransmitBuffers,
IN DWORD
dwFlags
);
, SOCK_STREAM,
SOCK_SEQPACKET SOCK_RDM, . hFile
, NULL,
lpTransmitBuffers.
nNumberOfBytesToWrite ,
. nNumberOfBytesPerSend
, send(); , by
default, Windows NT Workstation 4k, Windows Server - 64k.
lpOverlapped , ,
.
OVERLAPPED .
lpTransmitBuffers TRANSMIT_FILE_BUFFERS,
, ( )
. 4.4 ,
dwFlags.
4.4 TransmitFile()
TF_DISCONNECT
,
.
TF_REUSE_SOCKET
AcceptEx()
.
TF_DISCONNECT.
TF_USE_DEFAULT_WORKER .
TF_USE_SYSTEM_THREAD
TF_USE_KERNEL_APC
""
(APC) .
TransmitFile() ,
.
TF_WRITE_BEHIND
, TransmitFile() ,
.
TF_DISCONNECT TF_REUSE_SOCKET.
TF_USE_KERNEL_APC . ,
, TransmitFile(), ,
APC. , Winsock
APCs , ,
, APCs , ,
alertable , .
TransmitFile() Windows.
Windows XP/2003 "" WinSock -
TransmitPackets().
TransmitPackets() TransmitFile() , ,
, ,
TCP, UDP ( UDP connect()).
:
BOOL (PASCAL FAR * LPFN_TRANSMITPACKETS) (
SOCKET
hSocket,
LPTRANSMIT_PACKETS_ELEMENT lpPacketArray,
DWORD
nElementCount,
DWORD
nSendSize,
LPOVERLAPPED
lpOverlapped,
DWORD
dwFlags
);
lpPacketArray
TRANSMIT_PACKETS_ELEMENT:
typedef struct _TRANSMIT_PACKETS_ELEMENT {
ULONG dwElFlags;
ULONG cLength; // . 0, .
union {struct
{
LARGE_INTEGER nFileOffset;
//
HANDLE
hFile;
//
};
PVOID
pBuffer;
//
};
} TRANSMIT_PACKETS_ELEMENT;
dwElFlags ,
lpPacketArray, TP_ELEMENT_MEMORY, TP_ELEMENT_FILE TP_ELEMENT_EOP
send().
. nElementCount
TRANSMIT_PACKETS_ELEMENT,
nSendSize
77.1.1.4.
WSARecvMsg()
WSARecv()
WSARecvFrom(), ,
. 0, - SOCKET_ERROR.
int WSARecvMsg(
SOCKET s,
LPWSAMSG lpMsg,
LPDWORD lpdwNumberOfBytesRecvd,
LPWSAOVERLAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);
, WSAMSG,
Posix.1g msghdr.
78.
RSVP
. IPv4, TOS
Type Of Service ( 1.2.1) .
, Frame Relay
ATM, ,
,
,
, IPv6 .
IPv6 ,
Ethernet,
.
WinSock 2 QOS, API,
IPv4.
QOS (Quality Of Service )
:
"" ""
"" ,
, UDP
QOS WinSock 2 Windows-
QOS- TCP/IPv4 UDP/IPv4 ,
Windows 98, Windows Me, Windows 2000 Windows XP. QOS
IPv6 , QOS
"IP ATM".
QOS Windows-
, ,
IPv4 .
, QOS :
QOS ( RSVP
IEEE)
, ,
RSVP (Resource ReSerVation Protocol RFC-2205, 1997), QOS .
RSVP
.
,
() . RSVP ,
. ,
RSVP .
OSI RSVP ,
IP, ,
ICMP.
RSVP .
IP-, ,
,
, 2/, 100 .
PathMessage IP- , ,
FlowSpec.
-:
250-300 .
, VoIP, ,
, ,
VoIP.
-
, . , IP-
,
IEEE 802.1p 802.1Q
, QOS,
,
. WinSock 2
.
" - generic" -
GQOS, .
WinSock- WSAEnumProtocols(),
WSAPROTOCOL_INFO. dwServiceFlags1
XP1_QOS_SUPPORTED, -.
(T Traffic
Control). TOS IPv4. GPC,
" " , PC,
.
- RSVP. GQOS
"" , .
GQOS API TC API.
79.
Helper API
WinSock 2 ,
,
, TCP/IP .
,
Windows-, :
IPCONFIG.EXE - ( WINIPCFG.EXE Windows 95, Windows 98 Windows Me).
TCP/IP.
NETSTAT.EXE - TCP,
UDP IPv4.
ROUTE.EXE - IPv4.
ARP.EXE - ARP-.
IPV6.EXE - IPv6-.
IPHLPAPI.H
IPTYPES.H
IPHLPAPI.DLL , (. 8)
IPHLPAPI.LIB.
IP Helper :
:
GetNetworkParams()
GetAdaptersInfo()
GetAdapterIndex()
GetPerAdapterInfo()
GetUniDirectionalAdapterInfo()
GetNumberOfInterfaces()
GetInterfaceInfo()
GetFriendlyIfIndex()
GetIfEntry()
GetIfTable()
SetIfEntry()
IP-:
GetIpAddrTable()
AddIPAddress()
DeleteIPAddress()
IpReleaseAddress()
IpRenewAddress()
ARP:
GetIpNetTable()
CreateIpNetEntry()
DeleteIpNetEntry()
FlushIpNetTable()
CreateProxyArpEntry()
DeleteProxyArpEntry()
SendARP()
IP ICMP :
GetIpStatistics()
GetIcmpStatistics()
SetIpStatistics()
SetIpTTL()
CreateIpForwardEntry()
DeleteIpForwardEntry()
SetIpForwardEntry()
GetIpForwardTable()
GetBestRoute()
GetBestInterface()
GetRTTAndHopCount()
NotifyAddrChange()
NotifyRouteChange()
TCP UDP:
GetTcpStatistics()
GetUdpStatistics()
GetTcpTable()
GetUdpTable()
SetTcpEntry()
, iphlpapi.dll
, , , .
GetNetworkParams():
DWORD GetNetworkParams(
PFIXED_INFO pFixedInfo, // FIXED_INFO
PULONG pOutBufLen
//
);
ERROR_SUCCESS.
, ERROR_BUFFER_ OVERFLOW
, .
, , ERROR_NOT_SUPPORTED,
GetNetworkParams() .
FormatMessage()
.
FIXED_INFO :
typedef struct
{
char
HostName[MAX_HOSTNAME_LEN + 4] ;
char
DomainName[MAX_DOMAIN_NAME_LEN + 4];
PIP_ADDR_STRING CurrentDnsServer;
IP_ADDR_STRING DnsServerList;
UINT
NodeType;
char
ScopeId[MAX_SCOPE_ID_LEN + 4];
UINT
EnableRouting;
UINT
EnableProxy;
UINT
EnableDns;
} FIXED_INFO, *PFIXED_INFO;
HostName
DomainName
CurrentDnsServer
DnsServerList
, DNS.
, .
.
IP_ADDR_STRING,
DNS-, .
NodeType
ScopeId
EnableRouting
EnableProxy
EnableDns
. BROADCAST_NODETYPE,
PEER_TO_PEER_NODETYPE, MIXED_NODETYPE
HYBRID_NODETYPE. 5.1.1.
DHCP.
, .
, ARP-.
, DNS .
, MSDN
4.5
// iphlpapi.lib
#include <stdio.h>
#include <windows.h>
#include <iphlpapi.h>
main() {
FIXED_INFO * SomeNetInfo;
ULONG
ulOutBufLen;
DWORD
dwRetVal;
IP_ADDR_STRING * pIPAddr;
SomeNetInfo = (FIXED_INFO *) GlobalAlloc( GPTR, sizeof( FIXED_INFO ) );
ulOutBufLen = sizeof( FIXED_INFO );
if( ERROR_BUFFER_OVERFLOW == GetNetworkParams( SomeNetInfo, &ulOutBufLen ) )
{
GlobalFree( SomeNetInfo );
SomeNetInfo = (FIXED_INFO *) GlobalAlloc( GPTR, ulOutBufLen );
}
if ( dwRetVal = GetNetworkParams( SomeNetInfo, &ulOutBufLen ) )
{
printf( "GetNetworkParams failed. Return Value: %08x\n", dwRetVal );
}
else {
printf( "Host Name: %s\n", SomeNetInfo -> HostName );
printf( "Domain Name: %s\n", SomeNetInfo -> DomainName );
printf( "DNS Servers:\n" );
printf( "\t%s\n", SomeNetInfo -> DnsServerList.IpAddress.String );
pIPAddr = SomeNetInfo -> DnsServerList.Next;
while ( pIPAddr )
{
printf( "\t%s\n", pIPAddr ->IpAddress.String );
pIPAddr = pIPAddr ->Next;
}
}
exit( 0 );
}
GetInterfaceInfo() , .
NO_ERROR.
ERROR_INSUFFICIENT_BUFFER, ,
dwOutBufLen . , , ,
"" ,
.
DWORD GetInterfaceInfo(
PIP_INTERFACE_INFO pIfTable,// IP_INTERFACE_INFO,
//
PULONG dwOutBufLen
//
);
IPHelper GetIpStatistics(),
, .. :
MIB_IPSTATS IPStats;
// MIB_IPSTATS, IP//
if (GetIpStatistics(&IPStats) == NO_ERROR)
{
//
}
, ,
IP-, .
GetIcmpStatistics(), GetTcpStatistics() GetUdpStatistics()
,
.
GetTcpTable() SetTcpEntry()
TCP
, , ,
,
SetTcpEntry().
GetTcpTable() TCP:
DWORD GetTcpTable(PMIB_TCPTABLE pTcpTable,PDWORD pdwSize, BOOL bOrder);
:
pTcpTable
pdwSize
bOrder
//[out] , TCP-
// MIB_TCPTABLE
//[in, out] , . ,
// ,
//[in] . TRUE,
// :
//Local IP address
//Local port
//Remote IP address
//Remote port
NO_ERROR.
pTcpTable
ERROR_INSUFFICIENT_BUFFER .
pdwSize.
ERROR_INVALID_PARAMETER
ERROR_NOT_SUPPORTED
4.6 (MSDN)
//
PMIB_TCPTABLE pTcpTable;
pTcpTable = (MIB_TCPTABLE*) malloc(sizeof(MIB_TCPTABLE));
DWORD dwSize = 0;
// GetTcpTable()
if (GetTcpTable(pTcpTable, &dwSize, TRUE) == ERROR_INSUFFICIENT_BUFFER) {
GlobalFree(pTcpTable);
pTcpTable = (MIB_TCPTABLE*) malloc ((UINT) dwSize);
}
// GetTcpTable()
if ((dwRetVal = GetTcpTable(pTcpTable, &dwSize, TRUE)) == NO_ERROR) {
for (int i = 0; i < (int) pTcpTable->dwNumEntries; i++) {
printf("State: %ld\n", pTcpTable->table[i].dwState);
}
}
else {
printf("\tCall to GetTcpTable failed.\n");
LPVOID lpMsgBuf;
if (FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
dwRetVal,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), //
(LPTSTR) &lpMsgBuf,
0,
NULL ))
{
printf("\tError: %s", lpMsgBuf);
}
LocalFree( lpMsgBuf );
}
MIB_TCPTABLE :
typedef struct _MIB_TCPTABLE {
DWORD
dwNumEntries; //
MIB_TCPROW
table[ANY_SIZE];// MIB_TCPROW
//
} MIB_TCPTABLE,*PMIB_TCPTABLE;
- MIB_TCPROW - :
typedef struct _MIB_TCPROW {
DWORD dwState;
// , TCP-
DWORD dwLocalAddr;
// . 0 ,
// ,
//
DWORD dwLocalPort;
//
DWORD dwRemoteAddr; //
DWORD dwRemotePort; //
} MIB_TCPROW, *PMIB_TCPROW;
dwState :
MIB_TCP_STATE_CLOSED
MIB_TCP_STATE_LISTEN
MIB_TCP_STATE_SYN_SENT
MIB_TCP_STATE_SYN_RCVD
MIB_TCP_STATE_ESTAB
MIB_TCP_STATE_FIN_WAIT1
MIB_TCP_STATE_FIN_WAIT2
MIB_TCP_STATE_CLOSE_WAIT
MIB_TCP_STATE_CLOSING
MIB_TCP_STATE_LAST_ACK
MIB_TCP_STATE_TIME_WAIT
MIB_TCP_STATE_DELETE_TCB
SetTcpEntry() TCP-.
DWORD SetTcpEntry(
PMIB_TCPROW pTcpRow
);
//[in]
MIB_TCPROW
TCP-.
NO_ERROR. FormatMessage()
. iprtrmib.h.
, TCP-,
MIB_TCP_STATE_DELETE_TCB .. , .
-
Microsoft[30] [27].
80.
- AF_IRDA.
:
typedef struct _SOCKADDR_IRDA
{
u_short
irdaAddressFamily;
u_char
irdaDeviceID[4];
char
irdaServiceName[25];
} SOCKADDR_IRDA, *PSOCKADDR_IRDA, FAR *LPSOCKADDR_IRDA;
irdaAddressFamily AF_IRDA.
irdaDeviceID ,
, . IrSock
, , ,
. , irdaServiceName[25]
, () bind(),
c connect() (). Windows E
:
SOCKADDR_IRDA ddress = {AF_IRDA, 0, 0,0,0,"Service_Name"};
IrDA- "" , OBEX (Object
Exchange) , IrCOMM , IrLAN -
Ethernet ..
, IrDA
. Logical
Service Access Point Selectors (LSAP-SEL) IAS.
Logical Service Access Point Selectors 001 06F (1-111Windows CE), Windows 127. 000 ,
IAS (Information Access Services),
- IAS "" DNS.
,
Tiny Transport Protocol (TTP),
(data transmission start/stop).
. IrDA ,
.
Information Access Service (IAS) "yellow pages -
",
, . , PC1 IAS-
PC2 Speakers LSAP-SEL
003, , , , ,
003.
. IrDA-:
sd = socket (AF_IRDA, SOCK_STREAM, 0);
getsockopt():
int getsockopt(SOCKET
optlen);
sd,
int
level,
int
optname,
const
char
FAR
*optval,
int
SOL_IRLMP, optname :
IRLMP_ENUMDEVICES IRDA-;
IRLMP_IAS_QUERY IAS-;
IRLMP_SEND_PDU_LEN -
IrLPT.
IRLMP_ENUMDEVICES
WINDOWS_DEVICELIST :
typedef struct _WINDOWS_DEVICELIST
{
ULONG
numDevice;
WINDOWS_IRDA_DEVICE_INFO
Device[1];
} WINDOWS_DEVICELIST, *PWINDOWS_DEVICELIST, FAR *LPWINDOWS_DEVICELIST;
IRDA_DEVICE_INFO :
typedef struct _WINDOWS_IRDA_DEVICE_INFO
{
u_char irdaDeviceID[4];
char
irdaDeviceName[22];
u_char irdaDeviceHints1;
// Windows CE
u_char irdaDeviceHints2;
// Windows CE
u_char irdaCharSet;
} WINDOWS_IRDA_DEVICE_INFO, *PWINDOWS_IRDA_DEVICE_INFO,
FAR *LPWINDOWS_IRDA_DEVICE_INFO;
:
Windows E .
*optval.
getsockopt() IRLMP_ENUMDEVICES
,
,
getsockopt() . setsockopt(),
IR- ,
IRLMP_DISCOVERY_MODE.
, ,
- TCP- S.
IAS IRLMP_IAS_QUERY DNS-.
IAS_QUERY Windows CE
WINDOWS_IAS_QUERY Windows 98, Me, 2000 XP.
,
c Windows CE ,
WinSock 1.1.
af_irda.h,
http://www.cswl.com/whiteppr/white/arhead.html.
4.7
#include <windows.h>
#include <af_irda.h>
#include <stdio.h>
#pragma comment ( lib, "WS2_32.Lib" )
void main()
{
SOCKET sd;
SOCKADDR_IRDA address = {AF_IRDA, 0, 0,0,0,"MyServer"};
DEVICELIST devList;
char helloClient[25];
int mode = 1;
sd = socket (AF_IRDA, SOCK_STREAM, 0);
//
setsockopt (sd, SOL_IRLMP, IRLMP_DISCOVERY_MODE, (char *)&devList,(int)&mode);
// a
recv(sd, (char *)&devList, sizeof(devList), 0);
//
mode = FALSE;
setsockopt (sd, SOL_IRLMP, IRLMP_DISCOVERY_MODE, (char *) &devList, (int)&mode);
//
for(int i=0;i<=3;i++)address.irdaDeviceID[i] = (char)devList.Device[i].irdaDeviceID;
// MyServer
connect(sd, (struct sockaddr*)&address, sizeof(SOCKADDR_IRDA));
//
send(sd, "Hello Server!", strlen("Hello World!")+1, 0);
// .
recv(sd, helloClient, sizeof(helloClient), 0);
printf("%s\n", helloClient);
closesocket(sd);
}
Windows 2000
WinSock
2.0
http://www.alanjmcf.me.uk/comms/infrared/irdaWinsockCli.cpp.html.
1. , Winsock 2.0
42. -,
WinSock 2.0?
43. WinSock 2.0?
44. / Winsock 2.0?
45. / API WinSock 2.0?
46. " LSP" ?
47. (callback) I/O ?
48. WSAEventSelect()?
49. WinSock ws2_32.dll?
50. WSAProtocolInfo.
51. IEEE 802.1p.802.1Q?
52. RSVP.
53. IP-Helper API?
54. .
55. IAS?
56. getsockopt() setsockopt() IrDA?
1. 5
,
. Microsoft Windows NetBIOS,
Windows, TLI,
- UNIX- ,
BPF, ,
. (
) ,
, .
32. NetBIOS
NetBIOS Network Basic Input Output System
,
, ,
, . 1983 IBM.
, ,
, Windows 95, Windows 98, Windows NT Windows 2000.
NetBIOS
, , 1985 IBM
NetBIOS Extended User Interface (NetBEUI),
NetBIOS . NetBIOS , Chat
Notes Windows NT, Microsoft Mail NetBIOS
. NetBIOS , , SMB,
Windows. , nbsession, nbname nbdatagram,
, , -
,
, .
NetBIOS
,
, .
81.
NetBIOS
2.1 NetBIOS
TCP/IP "" NetBEUI. .
, ,
( ). ,
NetBEUI, TCP/IP, .
NetBIOS , NetBEUI
, , .
- TCP/IP IPX/SPX,
.
NetBIOS Windows- IPX/SPX, IPX/SPX
.
NetBIOS,
NetBIOS.
NetBIOS . , ,
, .
NetBIOS "", .. ,
. 16- ,
15- . 15 ,
. 16- (),
.
, NetBIOS- SATURN, Messenger
Service ( 03h) 16- / "53 41 54 55 52 4E 20 20 20 20 20 20
20 20 20 03". "*" () . 5.1-5.2
NetBIOS.
5.1 NetBIOS
00
20
1B
03
Messenger Service
03
Messenger Service
1D
Master Browser
06
1F
21
BE
BF
Browser . ( )
: Domain Master Browser ( ), Master
Browser ( ), Backup Browser ( ), Nonbrowser ( ).
5.2 NetBIOS
00
Domain Name ( )
1C
Domain Controller ( )
1E
25
, , nbtstat
n:
TCP/IP- 1
NetBEUI- 1
TCP/IP- 2
NetBEUI- 2
" "
. Windows- 0 "default route
", , LANA,
. Windows- NetBIOS
NCBENUM, LANA.
, LANA .
Windows NT, Windows 2000 Windows XP
NetBIOS , NetBEUI,
WinSock 2.
82.
NetBIOS
, "" NetBIOS
NetBEUI. "NetBIOS over TCP NetBIOS TCP",
" NetBT". ""
TCP/IP NetBIOS
NBT netbios.dll.
NetBT " " :
TCP
139 - nbsession NetBIOS
42 - WINS - Windows Internet Name System Windows
UDP
137 - nbname
138 - nbdatagram UDP-
42 - - WINS
:
WINS NetBIOS- IP-. WINS
NetBIOS (NetBIOS Name Server-NBNS) Microsoft
NetBIOS TCP/IP -.
WINS, , IP , . , WINS ,
- .
82.1.1.1.
NetBIOS-
NetBIOS
:
UCHAR Netbios(PNCB pNCB);
, , ..
nb30.h. ( 3.0 ).
netapi32.lib.
NetBIOS- NCB (network control block),
pNCB. NetBIOS-
NetBIOS- ( 11).
typedef struct _NCB
{
UCHAR
ncb_command;
UCHAR
ncb_retcode;
UCHAR
ncb_lsn;
UCHAR
ncb_num;
PUCHAR
ncb_buffer;
WORD
ncb_length;
UCHAR
ncb_callname[NCBNAMSZ];
UCHAR
ncb_name[NCBNAMSZ];
UCHAR
ncb_rto;
UCHAR
ncb_sto;
void
(*ncb_post) (struct _NCB *);
UCHAR
ncb_lana_num;
UCHAR
ncb_cmd_cplt;
UCHAR
ncb_reserve[10];
HANDLE
ncb_event;
} * PNCB, NCB;
NetBIOS, . ,
.
ncb_command - NetBIOS, .
.
ncb_retcode - .
ncb_lsn - .
NCBCALL NCBLISTEN.
ncb_num , .
ncb_buffer .
, NCBENUM,
LANA_ENUM.
ncb_length .
. NetBIOS NRC_BUFLEN.
ncb_callname[NCBNAMSZ]; .
ncb_name[NCBNAMSZ]; , .
ncb_rto - timeout . 0 .
500- .
ncb_sto - timeout . 0 .
500- .
ncb_post .
void CALLBACK PostRoutine(PNCB pncb);
pncb NCB .
ncb_lana_num LANA, .
ncb_cmd_cplt . NetBIOS
NRC_PENDING, .
ncb_reserve , 0.
ncb_event - - Windows,
.
. .
0, ncb_command ASYNCH ncb_post 0.
NRC_ILLCMD.
NCBNAMSZ=16 NB30.h , .
NetBIOS.
5.1 LANA
#include "iostream.h"
#include "stdio.h"
#include "windows.h"
#include "NB30.h"
int main()
{
LANA_ENUM lan_num;
NCB
ncb;
UCHAR uRetCode;
memset( &ncb, 0, sizeof(ncb) );
// NCB
ncb.ncb_command = NCBENUM;
// LANA
ncb.ncb_buffer = (unsigned char *) &lan_num; // lan_num
ncb.ncb_length = sizeof(lan_num);
uRetCode = Netbios((NCB*) &ncb );
// Netbios()
if (uRetCode != 0)
{
cout << "error NCBENUM " << endl;
exit(1);
}
for (int i=0;i<lan_num.length; i++) // LANA
{
printf( "The LANA Number is: %03u",lan_num.lana[i]);
cout << endl;
}
return 0;
}
( Windows 98)
TCP/IP LANA- 001 002.
NetBEUI
LANA 001 002 TCP/IP 006, 007 NetBEUI.
5.2
#include "iostream.h"
#include "stdio.h"
#include "windows.h"
#include "NB30.h"
#define LANANUM
001
//
//
#define LOCALNAME
"LOCAL NET"
#define MAX_SESSION 20
#define MAX_NAMES
30
void main()
{
NCB ncb;
UCHAR uRetCode;
memset (&ncb, 0, sizeof (ncb));
// ncb
ncb.ncb_command = NCBRESET;
// Reset
ncb.ncb_lsn = 0;
ncb.ncb_lana_num = LANANUM;
ncb.ncb_callname[0] = MAX_SESSION;
ncb.ncb_callname[2] = MAX_NAMES;
uRetCode = Netbios((NCB*) &ncb );
if ( uRetCode != 0 )
{
cout << "error NCBRESET " << endl;
exit(1);
}
//
int i_strlen;
NCB ncb1;
memset(&ncb1, 0, sizeof (ncb1));// ncb1
i_strlen = strlen(LOCALNAME);
if (i_strlen > NCBNAMSZ)
i_strlen = NCBNAMSZ;
memset (ncb1.ncb_name, ' ', NCBNAMSZ);
memcpy (ncb1.ncb_name, LOCALNAME, i_strlen);
// NetBios-
ncb1.ncb_command = NCBADDNAME;
ncb1.ncb_lana_num = LANANUM;
uRetCode = Netbios((NCB*) &ncb1 );
if ( uRetCode != 0 )
{
cout << "error NCBADDNAME " << endl;
exit(1);
}
// NetBios-
NCB ncb2; //
ADAPTER_STATUS *pStatus;
memset (&ncb2, 0, sizeof (ncb2));// ncb2
HANDLE hHeap;
int cbBuffer;
hHeap = GetProcessHeap();
//
// ADAPTER_STATUS
cbBuffer = sizeof (ADAPTER_STATUS) + 255 * sizeof (NAME_BUFFER);
pStatus = (ADAPTER_STATUS *) HeapAlloc (hHeap, 0, cbBuffer);
memset (ncb2.ncb_callname, ' ', NCBNAMSZ);
memcpy (ncb2.ncb_callname, LOCALNAME, i_strlen);
ncb2.ncb_command = NCBASTAT;
// NCBASTAT
ncb2.ncb_lana_num = LANANUM;
ncb2.ncb_buffer = (PUCHAR) pStatus;
ncb2.ncb_length = cbBuffer;
uRetCode = Netbios((NCB*) &ncb2 );
if ( uRetCode != 0 )
{
cout << "error NCBASTAT " << endl;
exit(1);
}
//
NAME_BUFFER *pNames;
pNames = (NAME_BUFFER *) (pStatus + 1);
for (int i = 0; i < pStatus->name_count; i++) printf ("\t%.*s\n", NCBNAMSZ, pNames[i].name);
HeapFree (hHeap, 0, pStatus);
cout << pStatus->name_count << endl;
cout << "Cansel" << endl;
}
OLEG MSHOME,
- LOCAL NET. .
82.1.1.2.
WinSock
NetBIOS-
NetBIOS
"NetBIOS TCP - NBT",
WinSock-.
NetBIOS.
NetBIOS- WinSock
WSNETBS.H:
#define NETBIOS_NAME_LENGTH 16
typedef struct sockaddr_nb
{
short
snb_family;
//AF_NETBIOS
u_short snb_type;
char
snb_name[NETBIOS_NAME_LENGTH];
} SOCKADDR_NB, *PSOCKADDR_NB, FAR *LPSOCKADDR_NB;
// snb_type - .
#define NETBIOS_UNIQUE_NAME
#define NETBIOS_GROUP_NAME
(0x0000)
(0x0001)
snb_name NetBIOS-.
WSNETBS.H SET_NETBIOS_SOCKADDR(),
:
#define SET_NETBIOS_SOCKADDR(_snb, _type, _name, _port)
\
{
\
int _i;
\
(_snb)->snb_family = AF_NETBIOS;
\
(_snb)->snb_type = (_type);
\
for (_i = 0; _i < NETBIOS_NAME_LENGTH - 1; _i++)
\
{
\
(_snb)->snb_name[_i] = ' ';
\
}
\
for (_i = 0; *((_name) + _i) != '\0'
\
&& _i < NETBIOS_NAME_LENGTH - 1; _i++)
\
{
\
(_snb)->snb_name[_i] = *((_name)+_i);
\
}
\
(_snb)->snb_name[NETBIOS_NAME_LENGTH - 1] = (_port); \
}
SOCKADDR_NB
AF_NETBIOS. _type - NETBIOS_UNIQUE_NAME
NETBIOS_GROUP_NAME. NetBIOS
. .
LANA.
, LANA , -
NetBIOS .
NETBIOS- .
socket() WSASocket():
sd = WSASocket(AF_NETBIOS, SOCK_DGRAM, -LANA, NULL, 0, WSA_FLAG_OVERLAPPED);
SOCK_DGRAM
SOCK_SEQPACKET. "" LANA
(.. ), , "".
NULL, WSAPROTOCOL_INFO
, . , dwFlags
WSA_FLAG_ OVERLAPPED, .
NetBIOS-
LANA , LANA
WinSock . , NCB()
NCBENUM, .
5- WSAEnumProtocols().
, :
5.3 WSAPROTOCOL_INFO
SOCKET sd[MAX];
int i,j;
dwNum = WSAEnumProtocols(NULL, lpProtocolBuf, &dwBufLen);
if (dwNum == SOCKET_ERROR){
// Error}
for (i = 0; i < dwNum; i++)
{
// AF_NETBIOS
if (lpProtocolBuf[i].iAddressFamily == AF_NETBIOS)
{
// - SOCK_DGRAM
if (lpProtocolBuf[i].iSocketType == SOCK_DGRAM)
{
sd[j++] = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
&lpProtocolBuf[i], 0, WSA_FLAG_OVERLAPPED);
}
}
}
,
AF_NETBIOS
WSAPROTOCOL_INFO.
LANA iProtocol ( LANA=0;
iProtocol LANA 0x80000000,
WinSock.) j .
33.
. 2.1 ,
.
,
,
.
. ,
RARP UNIX- ,
.
,
UNIX- Windows-:
1. BPF BSD Packet Filter. 1992 , 1993 .
Steven McCanne Van Jacobson "The BSD Packet Filter: A
New Architecture forUser-level Packet Capture. Proceedings of the 1993 Winter USENIX
Technical Conference (San Diego, CA, Jan. 1993), USENIX". BPF
. 5.1
.
.5.1
BPF :
1. BPF ( ) ,
. BPF
ioctl(). ( 4 )
BPF. (store buffer )
, (hold buffer )
"", ,
, .
2. ,
.
BPF, (hook),
, " capture length". , tcpdump
68 , 14 Ethernetheader +20 IP-header + 20 TCP-header + 14 .
,
BPF- ,
. ,
, ,
(.. ),
,
Usenet.
UNIX- -
libcap libpcap (packet capture
library.) BPF.
. ( ), BPF
.
(Ethernet, FDDI ..),
- . Windows-
tcpdump, WinDump Windows- UNIX- WinPcap, (
http://www.cherepovetscity.ru/insecure/reading/papers/libpcap.htm.)
libpcap 25- ,
BPF.
.
, 5.1
WinDump WinPCAP. ,
PCAP (Packet Capture ),
NDIS (Network Driver Interface Specification
)
- IP, IPX .. NDIS ,
.
BPF BPF, .
PCAP ( WinPCAP) NDIS, BPF:
,
.
,
, , .
, BPF.
, ,
,
.
.
, (packet capture driver),
libpcap,
.
Windows WinPCAP,
PCAP Windows. PCAP Win32
, UNIX.
, libpcap,
pcap-xxx.c (
pcap-xxx.h), xxx (, pcaplinux.c), pcap-win32.c pcap-win32.h.
. Libpcap Win32
, packet.dll. ,
"UNIX- ", ,
UNIX select(), ,
, Windows select() .
Windows- libpcap
,
(, libpcap ).
packet.dll Win32
.
libpcap
, Windows,
#ifdef #ifndef, libpcap Windows,
UNIX, :
#ifdef WIN32
/* Windows */
#endif
, ;
, .
, .
getsock_recv(). .
int getsock_recv (int);
,
.
struct ifparam,
, analizator.h.
5.4. analizator.h
#include <linux/types.h>
#define PROMISC_MODE_ON 1
//
#define PROMISC_MODE_OFF 0 //
struct ifparam {
__u32 ip;
// IP
__u32 mask;
//
int mtu;
// MTU
int index;
//
} ifp;
.
5.5. ( getifconf.c)
#include <linux/socket.h>
#include <linux/ioctl.h>
#include <linux/if.h>
#include <linux/in.h>
#include "analizator.h"
int getifconf(__u8 *intf, struct ifparam *ifp, int mode)
{
int fd;
struct sockaddr_in s;
// ifreq <linux/if.h>
// .
struct ifreq ifr;
memset((void *)&ifr, 0, sizeof(struct ifreq));
if((fd = socket(AF_INET,SOCK_DGRAM,0)) < 0)return (-1);
sprintf(ifr.ifr_name,"%s",intf);
/* . 0,
* , setmode.
*/
if(!mode) goto setmode;
/* IP */
if(ioctl(fd, SIOCGIFADDR, &ifr) < 0)
{
perror("ioctl SIOCGIFADDR");
return -1;
}
memset((void *)&s, 0, sizeof(struct sockaddr_in));
memcpy((void *)&s, (void *)&ifr.ifr_addr, sizeof(struct sockaddr));
memcpy((void *)&ifp->ip, (void *)&s.sin_addr.s_addr, sizeof(__u32));
/* */
if(ioctl(fd, SIOCGIFNETMASK, &ifr) < 0)
{
perror("ioctl SIOCGIFNETMASK");
return -1;
}
memset((void *)&s, 0, sizeof(struct sockaddr_in));
memcpy((void *)&s, (void *)&ifr.ifr_netmask, sizeof(struct sockaddr));
memcpy((void *)&ifp->mask, (void *)&s.sin_addr.s_addr, sizeof(u_long));
/*
* MTU
*/
if(ioctl(fd, SIOCGIFMTU, &ifr) < 0)
{
perror("ioctl SIOCGIFMTU");
return -1;
}
ifp->mtu = ifr.ifr_mtu;
/*
*
*/
if(ioctl(fd, SIOCGIFINDEX, &ifr) < 0)
{
perror("ioctl SIOCGIFINDEX");
return -1;
}
ifp->index = ifr.ifr_ifindex;
/* */
setmode:
/* */
if(ioctl(fd, SIOCGIFFLAGS, &ifr) < 0)
{
perror("ioctl SIOCGIFFLAGS");
close(fd);
//
return -1;
}
/* ,
* */
if(mode) ifr.ifr_flags |= IFF_PROMISC;
else ifr.ifr_flags &= ~(IFF_PROMISC);
/* */
if(ioctl(fd, SIOCSIFFLAGS, &ifr) < 0)
{
perror("ioctl SIOCSIFFLAGS");
close(fd);
//
return (-1);
}
return 0;
}
return sd;
}
main().
eth0 setsockopt(), : rc =
setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, "eth0\x00", strlen("eth0\x00")+1); ,
.
5.7 ( analizator.c)
#include <stdio.h>
#include <signal.h>
#include <sys/socket.h>
#include <linux/if_ether.h>
#include <linux/in.h>
#include <linux/ip.h>
#include <linux/tcp.h>
#include "analizator.h"
/*
* buff . ETH_FRAME_LEN
* Ethernet (1514) <linux/if_ether.h>
*/
__u8 buff[ETH_FRAME_LEN];
/*
* mode_off SIGINT. -
* SIGINT "Promiscuous mode" .
*/
void mode_off()
{
if(getifconf("eth0", &ifp, PROMISC_MODE_OFF) < 0)
{
perror("getifconf");
exit(-1);
}
return;
}
/* */
int main()
{
__u32 num = 0;
int eth0_if, rec = 0, ihl = 0;
struct iphdr ip;
// IP
struct tcphdr tcp;
// TCP
struct ethhdr eth;
// Ethernet-
static struct sigaction act;
/* eth0 */
if(getifconf("eth0", &ifp, PROMISC_MODE_ON) < 0) {
perror("getifconf");
return -1;
}
/* */
printf("IP - %s\n",inet_ntoa(ifp.ip));
printf(" - %s\n",inet_ntoa(ifp.mask));
printf("MTU - %d\n", ifp.mtu);
printf(" - %d\n", ifp.index);
/* */
if((eth0_if = getsock_recv(ifp.index)) < 0) {
perror("getsock_recv");
return -1;
}
/* SIGINT - mode_off */
act.sa_handler = mode_off;
sigfillset(&(act.sa_mask));
sigaction(SIGINT, &act, NULL);
/* */
for(;;)
{
memset(buff, 0, ETH_FRAME_LEN);
rec = recvfrom(eth0_if, (char *)buff, ifp.mtu + 18, 0, NULL, NULL);
if(rec < 0 || rec > ETH_FRAME_LEN) {
perror("recvfrom");
return -1;
}
memcpy((void *)ð, buff, ETH_HLEN);
memcpy((void *)&ip, buff + ETH_HLEN, sizeof(struct iphdr));
if((ip.version) != 4) continue;
memcpy((void *)&tcp, buff + ETH_HLEN + ip.ihl * 4, sizeof(struct tcphdr));
/* MAC- */
printf("\n%u\n", num++);
printf("%.2x:%.2x:%.2x:%.2x:%.2x:%.2x\t->\t",
eth.h_source[0],eth.h_source[1],eth.h_source[2],
eth.h_source[3],eth.h_source[4],eth.h_source[5]);
printf("%.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n",
eth.h_dest[0],eth.h_dest[1],eth.h_dest[2],
eth.h_dest[3],eth.h_dest[4],eth.h_dest[5]);
printf(" - %d, ", (ip.ihl * 4));
printf(" - %d\n", ntohs(ip.tot_len));
/* - TCP, IP */
if(ip.protocol == IPPROTO_TCP) {
printf("%s (%d)\t->\t",inet_ntoa(ip.saddr), ntohs(tcp.source));
printf("%s (%d)\n",inet_ntoa(ip.daddr), ntohs(tcp.dest));
printf("TCP \n");
}
}
return 0;
}
.
/var/log/messages:
eth0: Promiscuous mode enabled.
device eth0 entered promiscuous mode
Ctrl+C.
SIGINT, mode_off()
. /var/log/messages :
device eth0 left promiscuous mode
1. NetBIOS.
2. NetBIOS-?
3. NetBIOS .
?
4. NetBIOS TCP/IP? ,
?
5.
.
6. BPF , ?
7.
?
8. Linux- ?
9. , , ?
10. tcpdump Windows? ?
,
, , ,
,
, ,
,
.
UNIX Windows,
, MS TDI (Transport Driver Interface), MS NAL (Network
Abstraction Layer Interface), WinInet . ,
, ,
.
1. . Ethernet "LAN", 03, 1998 , "
" (www.osp.ru). http://www.osp.ru/lan/1998/03/23.htm
2. ., . Windows/. . .:
, 1996.
3. . /. c . .: " "
"Channel Trading Ltd", 1999. ISBN 5-7502-0102-3
4. ., connect(). http://www.kalinin.ru/programming/network/01_12_00.shtml
5. . . "LAN", 06, 1997 //
" " http://www.osp.ru/lan/1997/06/131.htm
6. . . - "LAN", 05, 1997 // "
" http://www.osp.ru/lan/1997/05/87.htm
7. . . 11/99 .
2, http://www.citforum.ru/internet/tifamily/optimize02.shtml
8. . " ". .
http://athena.vvsu.ru/net/book/ip.html
9. ., . Internet " "
02/99, http://opensystems.ru/os/1999/02/06.htm
10. .., .., .. Internet 3- . .: , 2000.
11.
http://www.fssr.ru/icccs/1251/fomenkov_99_2.htm
25. Beej's Guide to Network Programming Using Internet Sockets Version 1.5.3 (01-Nov-1997).
http://www.ecst.csuchico.edu/~beej/guide/net
26. De Goyeneche J-M. Multicast over TCP/IP HOWTO http://docs.iho.ru/HOWTO/en/MulticastHOWTO.html#toc6
27. Jones A., Ohlund J., Ohlund Jim Network Programming for Microsoft Windows, Second Edition
Microsoft Press, February 13, 2002 ISBN: 0735615799
28. Jones A., Ohlund J. Network Programming for Microsoft Windows (Microsoft Press, 1999)
29. McCanne S. and Jacobson V. The BSD Packet Filter: A New Architecture for User-level Packet Capture.
Proceedings of the 1993 Winter USENIX Technical Conference (San Diego, CA, Jan. 1993), USENIX.
30. MSDN 6.0/Platform SDK/Networking and Distributed Services/ Windows Sockets version 2 / Windows
Sockets version 2 API / Reference
31. Net Programing. http://www.kgtu.runnet.ru/WD/TUTOR/tcpip/netprg2.html
32. Quinn B., Shute D. Windows Sockets Network Programming. Addison Wesley Professional Copyright,
1996. ISBN 0-201-63372-8
33. RFC-1180 Network Working Group Request for Comments: 1180 T. Socolofsky C. Kale, Spider
Systems Limited. January 1991. A TCP/IP Tutorial
34. RFC-793. TCP. . , 1994 . http://info.internet.isi.edu/innotes/rfc/files/rfc793.txt
35. RFC-791 Internet . Darpa Internet. , 1981.
36. Roberts D. Developing for the Internet with WinSock, www.itknowledge.com. Publication Date:
09/01/95.
37. Stevens W. R. TCP/IP Illustrated, Volume 1: The Protocols, Addison-Wesley, 1994, ISBN 0-201-633469
38. The Single UNIX Specification, Version 2, 1997 The Open Group
39. Windows Sockets. An Open Interface for Network Programming under Microsoft Windows Version
1.1
40. . : 2003, BHV
41. : Delphi. : Windows
http://www.compdoc.ru/prog/pascal/use_sockets2/
1
IPv4
, TCP UDP.
2
IPV6
IPv6 3-11 .
, "Format Prefix".
IPv6,
, .
NSAP
IPX
0000 0000
0000 000
0000 00
0000010
0000011
0000 1
0001
001
010
011
100
1/256
1/256
1/128
1/128
1/128
1/32
1/16
1/8
1/8
1/8
1/8
101
110
1110
1111 0
1111 10
1111 110
1111 11100
1111 1110 10
1111 1110 11
1111 1111
1/8
1/8
1/16
1/32
1/64
1/128
1/512
1/1024
1/1024
1/256
3
PING
,
Ping. :
(,
).
ICMP (nIcmpId nIcmpSeq)
ECHO- ECHO-.
, ECHO- , .
. Berkeley,
ICMP , IP
, ICMP .
, IP_TTL, TTL
ICMP ECHO, ICMP-
, .
- Windows.
/* ICMP types */
#define ICMP_ECHOREPLY 0
/* ICMP : */
#define ICMP_ECHOREQ 8
/* ICMP : */
/* ICMP RFC 792 */
typedef struct icmp_hdr
{
u_char icmp_type;
/* */
u_char icmp_code;
/* */
u_short icmp_cksum;
/* */
u_short icmp_id;
/* */
u_short icmp_seq;
/* */
char icmp_data[1];
/* */
} ICMP_HDR, *PICMPHDR, FAR *LPICMPHDR;
#define ICMP_HDR_LEN sizeof(ICMP_HDR)
/* IP 4 RFC 791 */
#define IPVERSION 4
typedef struct ip_hdr {
u_char ip_hl;
/* */
u_char ip_v;
/* */
u_char ip_tos;
/* */
short ip_len;
/* */
u_short ip_id;
/* */
short ip_off;
/* */
u_char ip_ttl;
/* TTL */
u_char ip_p;
/* */
u_short ip_cksum;
/* . */
struct in_addr ip_src;
/* */
struct in_addr ip_dst;
/* */
} IP_HDR, *PIP_HDR, *LPIP_HDR;
#define IP_HDR_LEN sizeof(IP_HDR)
#define PNGBUFSIZE 8192+ICMP_HDR_LEN+IP_HDR_LEN
/* */
extern void WSAErrMsg(LPSTR);
/* private */
static
static
static
static
static
/*
sizeof(SOCKADDR_IN));
/* */
if (nRet == SOCKET_ERROR) {
WSAErrMsg("sendto()");
}
return (nRet);
} /* icmp_sendto() */
/* Function: icmp_recvfrom()
: icmp -,
ICMP . */
u_long icmp_recvfrom(SOCKET s, LPINT lpnIcmpId, LPINT lpnIcmpSeq, LPSOCKADDR_IN lpstFromAddr)
{
u_long lSendTime;
int nAddrLen = sizeof(struct sockaddr_in);
int nRet, i;
/*-------------------- ICMP - ------------------*/
stFromAddr.sin_family = AF_INET;
stFromAddr.sin_addr.s_addr = INADDR_ANY;
stFromAddr.sin_port = 0;
nRet = recvfrom (s,
/* */
(LPSTR)achIOBuf,
/* */
PNGBUFSIZE+ICMP_HDR_LEN+sizeof(long)+IP_HDR_LEN,
/* */
0,
/* */
(LPSOCKADDR)lpstFromAddr,
/* */
&nAddrLen);
/* */
if (nRet == SOCKET_ERROR) {
WSAErrMsg("recvfrom()");
}
/*------------------------- -------------------------- . : ,
Berkeley Sockets. , IP-,
. ,
, IP- ( 0x45 ). */
/* */
if (achIOBuf[0] == 0x45) { /* IP- ? */
i = IP_HDR_LEN + ICMP_HDR_LEN;
lpIcmpHdr = (LPICMPHDR) &(achIOBuf[IP_HDR_LEN]);
} else {
i = ICMP_HDR_LEN;
lpIcmpHdr = (LPICMPHDR) achIOBuf;
}
/* ICMP ID */
*lpnIcmpId = lpIcmpHdr->icmp_id;
*lpnIcmpSeq = lpIcmpHdr->icmp_seq;
/* ICMP- */
_fmemcpy (&lSendTime, (&achIOBuf[i]), sizeof(u_long));
return (lSendTime);
} /* end icmp_recvfrom() */
/* Function: cksum()
(one's complement sum of 16-bit words). IP, ICMP, UDP, IGMP. */
u_short cksum (u_short FAR*lpBuf, int nLen) {
register long lSum = 0L; /* */
/* : , ()
0 */
while (nLen > 0) {
lSum += (lpBuf++);
/* */
nLen -= 2;
/* 2 */
}
/* 32-bit 16-bit */
lSum = (lSum & 0xffff) + (lSum>>16);
4
Log- 3- Internet-
Packet #1, Direction: Out, Time:20:55:56,780
MAC- DNS
Ethernet II
Destination MAC: FF:FF:FF:FF:FF:FF
,,
Source MAC: 44:45:53:54:00:00
MAC
Ethertype: 0x0806 (2054)
2054 (ARP)
ARP
Hardware: 0x0001 (1) Ethernet
Protocol: 0x0800 (2048) IP
IP
Hardware address length: 0x06 (6)
6
Protocol address length: 0x04 (4)
4
Operation: 0x0001 (1) ARP Request
ARP-
Sender MAC address: 44:45:53:54:00:00
MAC
Sender IP address: 195.216.161.32
IP-
Target MAC address: 00:00:00:00:00:00
MAC-
Target IP address: 195.216.160.130
IP-
Raw Data:
0x0000
FF FF FF FF FF FF 44 45-53 54 00 00 08 06 00 01
DEST......
0x0010
08 00 06 04 00 01 44 45-53 54 00 00 C3 D8 A1 20
......DEST..
0x0020
00 00 00 00 00 00 C3 D8-A0 82
......
DNS
Mac-
MAC
2048 (IP)
IP-
IP- 4
20
TOS 0
58
63744
DF 0
MF 0
0
IP TTL 128
UDP
IP
IP DNS
UDP
1055
DNS-53
UDP-
DNS-
53
3A
82
00
72
52
F9
04
00
75
43
00
1F
00
00
00
00
00
00
00
00
00
35
00
01
44
80
00
03
00
45-53
11-78
26-56
77-77
01-
54
5E
48
77
00
C3
00
05
00
D8
09
61
08
A1
01
70
00
20
00
6F
1
www.aport.ru
45
C3
00
72
00
D8
01
74
SRC..DEST....E.
.:....x^
...5.&VH......
.......www.aport
.ru.....
DNS
Name: www.aport.ru
Type: 0x0005 (5) CNAME
Class: 0x0001 (1) IN
TTL: 1534 25 Minutes 34 sec
CNAME: aport.ru
Record: 0x2 (2)
Name: aport.ru
Type: 0x0001 (1) A
Class: 0x0001 (1) IN
TTL: 1534 25 Minutes 34 sec
IP address: 194.67.26.89
Authority section
Record: 0x1 (1)
Name: aport.ru
Type: 0x0002 (2) NS
Class: 0x0001 (1) IN
TTL: 333 5 Minutes 33 sec
NSDNAME: ns1.gldn.net
Record: 0x2 (2)
Name: aport.ru
Type: 0x0002 (2) NS
Class: 0x0001 (1) IN
TTL: 333 5 Minutes 33 sec
NSDNAME: ns2.gldn.net
IP- www.aport.ru
. RFC 1034
Raw Data:
0x0000
44
0x0010
00
0x0020
A1
0x0030
00
45
C6
20
02
53
38
00
00
54
A2
35
03
00
00
04
00
00
00
1F
03
20
3E
00
03
53-52
11-7A
B2-7C
77-77
43
31
3F
77
00
C3
00
05
00
D8
09
61
08
A0
81
70
00
82
80
6F
45
C3
00
72
00
D8
01
74
DEST.. SRC....E.
.8...>.z1
.5...|?....
.......www.aport
5
( IANA)
1. ()
1
2
3
5
7
9
11
13
15
17
18
19
20
21
22
23
24
25
27
29
31
33
35
37
38
39
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
242
243
244
245
246
247
248
256
257
258
259
260
261
262
263
264
280
281
282
308
309
310
311
312
313
314
315
316
317
321
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
387
388
HDAP
BGMP
HTTP-MGMT
PERSONAL-LINK
CABLEPORT-AX - Cable Port A/X
NOVASTORBAKCUP - Novastor Backup
ENTRUSTTIME
BHMDS
ASIP-WEBADMIN - Appleshare IP Webadmin
VSLMP
MAGENTA-LOGIC
OPALIS-ROBOT
DPSI
DECAUTH
ZANNET
PIP
PDAP - Prospero Data Access Protocol
PAWSERV - Perf Analysis Workbench
ZSERV - Zebra server
FATSERV - Fatmen Server
CSI-SGWP - Cabletron Management Protocol
MFTP
MATIP-TYPE-A - MATIP Type A
MATIP-TYPE-B - MATIP Type B or bhoetty
DTAG-STE-SB - DTAG, or bhoedap4
NDSAUTH
BH611
DATEX-ASN
CLOANTO-NET-1 - Cloanto Net 1
BHEVENT
SHRINKWRAP
TENEBRIS_NTS - Tenebris Network Trace Service
SCOI2ODIALOG
SEMANTIX
SRSSEND - SRS Send
RSVP_TUNNEL
AURORA-CMGR
DTK - Deception Tool Kit
ODMR
MORTGAGEWARE
QBIKGDP
RPC2PORTMAP
CODAAUTH2
CLEARCASE - Clearcase
ULISTSERV - Unix Listserv
LEGENT-1 - Legent Corporation
LEGENT-2 - Legent Corporation
HASSLE - Hassle
NIP - Amiga Envoy Network Inquiry Proto
TNETOS - NEC Corporation
DSETOS - NEC Corporation
IS99C - TIA/EIA/IS-99 modem client
IS99S - TIA/EIA/IS-99 modem server
HP-COLLECTOR - HP Performance Data Collector
HP-MANAGED-NODE - HP Performance Data Managed Node
HP-ALARM-MGR - HP Performance Data Alarm Manager
ARNS - A Remote Network Server System
IBM-APP - IBM Application 386 ASA - ASA Message Router Object Def.
AURP - Appletalk Update-Based Routing Pro.
UNIDATA-LDM - Unidata LDM Version 4
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
SNARE
FCP - FirstClass Protocol
PASSGO EXEC - Remote Process Execution
LOGIN - Remote Login via Telnet;
SHELL - Automatic Remote Process Execution
PRINTER - Printer Spooler
VIDEOTEX
TALK
NTALK
UTIME - Unix Time
EFS - Extended File Server
RIPNG
ULP
IBM-DB2
NCP
TIMED - Time Server
TEMPO - newdate
STX - Stock IXChange
CUSTIX - Customer IXChange
IRC-SERV
COURIER - rpc
CONFERENCE - chat
NETNEWS - readnews
NETWALL - Emergency Broadcasts
MM-ADMIN - MegaMedia Admin
IIOP
OPALIS-RDV
NMSP - Networked Media Streaming Protocol
GDOMAP
APERTUS-LDP - Apertus Technologies Load Determination
UUCP - UUCPD (Unix to Unix Copy)
UUCP-RLOGIN - uucp (Unix to Unix Copy) - rlogin (Remote Login)
COMMERCE
KLOGIN
KSHELL - krcmd
APPLEQTCSRVR - Apple qtcsrvr
DHCP-CLIENT - DHCP (Dynamic Host Configuration Protocol) Client
DHCP-SERVER - DHCP (Dynamic Host Configuration Protocol) Server
AFPOVERTCP - AFP over TCP
IDFP
NEW-RWHO - new-who
CYBERCASH - CyberCash
DEVICESHARE - deviceshare
PIRP - pirp
RTSP - Real Time Stream Control Protocol
DSF
REMOTEFS - rfs (Remote File System) server
OPENVMS-SYSIPC - openvms-sysipc
SDNSKMP - SDNSKMP
TEEDTAP - TEEDTAP
RMONITOR - rmonitord
MONITOR
CHSHELL - chcmd
SNEWS - snews
9PFS - plan 9 file service
WHOAMI - whoami
STREETTALK - streettalk
BANYAN-RPC - banyan-rpc
MS-SHUTTLE - Microsoft Shuttle
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
606
607
608
609
610
611
628
633
634
635
636
640
650
666
674
704
709
729
730
731
737
740
741
742
744
747
748
749
750
751
752
753
754
758
759
760
761
762
763
764
765
767
769
770
771
772
773
774
775
776
780
781
782
783
786
799
800
801
808
871
888
901
911
989
990
992
993
995
996
997
998
999
1000
1001
1008
1010
1011
1012
1015
1023
KERBEROS-SEC
KERBEROS_MASTER
QRH
RRH
KBR5_PROP
NLOGIN
CON
NS
RXE
QUOTAD
CYCLESERV
OMSERV
WEBSTER
PHONEBOOK - phone
VID
CADLOCK
RTIP
CYCLESERV2
SUBMIT
RPASSWD
ENTOMB
WPAGES
WPGS
HP-COLLECTOR - HP Performance Data Collector
HP-MANAGED-NODE - HP Performance Data Managed Node
HP-ALARM-MGR - HP Performance Data Alarm Manager
CONCERT - Concert
CONTROLIT
MDBS_DAEMON
DEVICE
PORT
SUPFILESRV -SUP Server
CDDATABASE - CDDataBase
PORT
Dark Shadow
FTPS-DATA - FTP Over TLS/SSL
FTP Control TLS/SSL
TELNETS - telnet protocol over TLS/SSL
IMAPS - Imap4 protocol over TLS/SSL
POP3S - Pop3 (Post Office Protocol) over TLS/SSL
VSINET - vsinet
MAITRD
BUSBOY
PUPROUTER
CADLOCK
Silence
UFSD - UFSD
Doly-Trojan
Doly-Trojan
Doly-Trojan
Doly-Trojan
RESERVED Reserved
2.
1024
OLD_FINGER - old_finger
1025
LISTEN - listen
1026
NTERM - nterm
1027
NT
1028
NT
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1058
1059
1067
1068
1080
1083
1084
1090
1103
1109
1110
1112
1127
1155
1167
1170
1178
1212
1222
1234
1241
1243
1245
1248
1269
1330
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
NT
IAD1 - BBN IAD
IAD2 - BBN IAD
IAD3 - BBN IAD
NT
NT
NT
NT
NT
NT
NT
NT
NT
Bla
NT
NT
Rasmin
NT
NT
NT
NT
NIM - nim
NIMREG - nimreg
INSTL_BOOTS - Installation Bootstrap Proto. Serv.
INSTL_BOOTC - Installation Bootstrap Proto. Cli.
SOCKS - Socks
ANSOFT-LM-1 - Anasoft License Manager
ANSOFT-LM-2 - Anasoft License Manager
Xtreme
XAUDIO - Xaserver
KPOP - kpop
NFSD-STATUS - Cluster Status Info
MSQL - Mini-SQL Server
SUPFILEDBG - SUP Debugging
NFA - Network File Access
PHONE - Conference Calling
Psyber Stream Server, Streaming Audio trojan, Voice
SKKSERV - SKK (Kanji Input)
LUPA - lupa
NERV - SNI R&D network
Ultors Trojan
MSG - Remote Message Server
BackDoor-G, SubSeven, SubSeven Apocalypse
Voodoo Doll
HERMES - Multi Media Conferencing
Mavericks Matrix
PORT
ALTA-ANA-LM - Alta Analytics License Manager
BBN-MMC - Multi Media Conferencing
BBN-MMX - Multi Media Conferencing
SBOOK - Registration Network Protocol
EDITBENCH - Registration Network Protocol
EQUATIONBUILDER - Digital Tool Works (MIT)
LOTUSNOTE - Lotus Note
RELIEF - Relief Consulting
RIGHTBRAIN - RightBrain Software
INTUITIVE EDGE - Intuitive Edge
CUILLAMARTIN - CuillaMartin Company
PEGBOARD - Electronic PegBoard
CONNLCLI - CONNLCLI
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
FTSRV - FTSRV
MIMER - MIMER
LINX - LinX
TIMEFLIES - TimeFlies
NDM-REQUESTER - Network DataMover Requester
NDM-SERVER - Network DataMover Server
ADAPT-SNA - Network Software Associates
NETWARE-CSP - Novell NetWare Comm Service Platform
DCS - DCS
SCREENCAST - ScreenCast
GV-US - GlobalView to Unix Shell
US-GV - Unix Shell to GlobalView
FC-CLI - Fujitsu Config Protocol
FC-SER - Fujitsu Config Protocol
CHROMAGRAFX - Chromagrafx
MOLLY - EPI Software Systems
BYTEX - Bytex
IBM-PPS - IBM Person to Person Software
CICHLID - Cichlid License Manager
ELAN - Elan License Manager
DBREPORTER - Integrity Solutions
TELESIS-LICMAN - Telesis Network License Manager
APPLE-LICMAN - Apple Network License Manager
UDT_OS GWHA - GW Hannaway Network License Manager
OS-LICMAN - Objective Solutions License Manager
ATEX_ELMD - Atex Publishing License Manager
CHECKSUM - CheckSum License Manager
CADSI-LM - Computer Aided Design Software Inc LM
OBJECTIVE-DBC - Objective Solutions DataBase Cache
ICLPV-DM - Document Manager
ICLPV-SC - Storage Controller
ICLPV-SAS - Storage Access Server
ICLPV-PM - Print Manager
ICLPV-NLS - Network Log Server
ICLPV-NLC - Network Log Client
ICLPV-WSM - PC Workstation Manager software
DVL-ACTIVEMAIL - DVL Active Mail
AUDIO-ACTIVMAIL - Audio Active Mail
VIDEO-ACTIVMAIL - Video Active Mail
CADKEY-LICMAN - Cadkey License Manager
CADKEY-TABLET - Cadkey Tablet Daemon
GOLDLEAF-LICMAN - Goldleaf License Manager
PRM-SM-NP - Prospero Resource Manager
PRM-NM-NP - Prospero Resource Manager
IGI-LM - Infinite Graphics License Manager
IBM-RES - IBM Remote Execution Starter
NETLABS-LM - NetLabs License Manager
DBSA-LM - DBSA License Manager
SOPHIA-LM - Sophia License Manager
HERE-LM - Here License Manager
HIQ - HiQ License Manager
AF - AudioFile
INNOSYS - InnoSys
INNOSYS-ACL - Innosys-ACL
IBM-MQSERIES - IBM MQSeries
DBSTAR - DBStar
NOVELL-LU6.2 - Novell LU6.2
TIMBUKTU-SRV1 - Timbuktu Service 1 Port
TIMBUKTU-SRV2 - Timbuktu Service 2 Port
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
DBEREGISTER - dberegister
PACERFORUM - PacerForum
AIRS - AIRS
MITEKSYS-LM - Miteksys License Manager
AFS - AFS License Manager
CONFLUENT - Confluent License Manager
LANSOURCE - LANSource
NMS_TOPO_SERV - nms_topo_serv
LOCALINFOSRVR - LocalInfoSrvr
DOCSTOR - DocStor
DMDOCBROKER - dmdocbroker
INSITU-CONF - insitu-conf
ANYNETGATEWAY - anynetgateway
STONE-DESIGN-1 - stone-design-1
NETMAP_LM - netmap_lm
ICA - ica
CVC - cvc
LIBERTY-LM - liberty-lm
RFX-LM - rfx-lm
WATCOM-SQL - Watcom-SQL
FHC - Federico Heinz Consultora
VLSI-LM - VLSI License Manager
SAISCM - Satellite-data Acquisition System 3
SHIVADISCOVERY - Shiva
IMTC-MCS - Databeam
EVB-ELM - EVB Software Engineering License Manager
FUNKPROXY - Funk Software Inc.
UTCD - Universal Time daemon (utcd)
SYMPLEX - symplex
DIAGMOND - diagmond
ROBCAD-LM - Robcad Ltd. License Manager
MVX-LM - Midland Valley Exploration Ltd. Lic. Man.
3L-L1 - 3l-l1
WINS - Microsoft's Windows Internet Name Service
FUJITSU-DTC - Fujitsu Systems Business of America Inc
FUJITSU-DTCNS - Fujitsu Systems Business of America Inc
IFOR-PROTOCOL - ifor-protocol
VPAD - Virtual Places Audio data
VPAC - Virtual Places Audio control
VPVD - Virtual Places Video data
VPVC - Virtual Places Video control
ATM-ZIP-OFFICE - atm zip office
NCUBE-LM - nCube License Manager
RNA-LM - Ricardo North America License Manager
CICHILD-LM - cichild
INGRESLOCK - ingres
PROSPERO-NP - Prospero Directory Service non-priv
PDAP-NP - Prospero Data Access Prot non-priv
TLISRV - oracle
MCIAUTOREG - micautoreg
COAUTHOR - oracle
RAP-SERVICE - rap-service
RAP-LISTEN - rap-listen
MIROCONNECT - miroconnect
VIRTUAL-PLACES - Virtual Places Software
MICROMUSE-LM - micromuse-lm
AMPR-INFO - ampr-info
AMPR-INTER - ampr-inter
SDSC-LM - isi-lm
3DS-LM - 3ds-lm
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
SIMBASERVICES - simbaservices
ISSD
AAS - aas
INSPECT - inspect
PICODBC - pickodbc
ICABROWSER - icabrowser
SLP - Salutation Manager (Salutation Protocol)
SLM-API - Salutation Manager (SLM-API)
STT - stt
SMART-LM - Smart Corp. License Manager
ISYSG-LM - isysg-lm
TAURUS-WH - taurus-wh
ILL - Inter Library Loan
NETBILL-TRANS - NetBill Transaction Server
NETBILL-KEYREP - NetBill Key Repository
NETBILL-CRED - NetBill Credential Server
NETBILL-AUTH - NetBill Authorization Server
NETBILL-PROD - NetBill Product Server
NIMROD-AGENT - Nimrod Inter-Agent Communication
SKYTELNET - skytelne
XS-OPENBACKUP - xs-openbackup
FAXPORTWINPORT - faxportwinport
SOFTDATAPHONE - softdataphone
ONTIME - ontime
JALEOSND - jaleosnd
UDP-SR-PORT - udp-sr-port
SVS-OMAGENT - svs-omagent
CNCP - CableNet Control Protocol
CNAP - CableNet Admin Protocol
CNIP - CableNet Info Protocol
CERT-INITIATOR - cert-initiator
CERT-RESPONDER - cert-responder
INVISION - InVision
ISIS-AM - isis-am
ISIS-AMBC - isis-ambc
SAISEH - Satellite-data Acquisition System 4
DATAMETRICS - datametrics
SA-MSG-PORT - sa-msg-port
RSAP - rsap
CONCURRENT-LM - concurrent-lm
INSPECT - inspect
NKD
SHIVA_CONFSRVR - shiva_confsrvr
XNMP - xnmp
ALPHATECH-LM - alphatech-lm
STARGATEALERTS - stargatealerts
DEC-MBADMIN - dec-mbadmin
DEC-MBADMIN-H - dec-mbadmin-h
FUJITSU-MMPDC - fujitsu-mmpdc
SIXNETUDR - sixnetudr
SG-LM - Silicon Grail License Manager
SKIP-MC-GIKREQ - skip-mc-gikreq
NETVIEW-AIX-1 - netview-aix-1
NETVIEW-AIX-2 - netview-aix-2
NETVIEW-AIX-3 - netview-aix-3
NETVIEW-AIX-4 - netview-aix-4
NETVIEW-AIX-5 - netview-aix-5
NETVIEW-AIX-6 - netview-aix-6
NETVIEW-AIX-7 - netview-aix-7
NETVIEW-AIX-8 - netview-aix-8
1669
1670
1671
1672
1673
1674
1675
1676
1677
1723
1807
1812
1813
1827
1981
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2030
2032
NETVIEW-AIX-9 - netview-aix-9
NETVIEW-AIX-10 - netview-aix-10
NETVIEW-AIX-11 - netview-aix-11
NETVIEW-AIX-12 - netview-aix-12
PROSHARE-MC-1 - Intel Proshare Multicast
PROSHARE-MC-2 - Intel Proshare Multicast
PDP - Pacific Data Products
NEFCOMM1 - netcomm1
GROUPWISE - groupwise
PPTP - pptp
SpySender
RADIUS - RADIUS Authentication Protocol
RADACCT - RADIUS Accounting Protocol
PCM - PCM Agent
Shockrave
LICENSEDAEMON - cisco license management
TR-RSRB-P1 - cisco RSRB Priority 1 port
TR-RSRB-P2 - cisco RSRB Priority 2 port
MSHNET - MHSnet system
STUN-P1 - cisco STUN Priority 1 port
STUN-P2 - cisco STUN Priority 2 port
IPSENDMSG - IPsendmsg
SNMP-TCP-PORT - cisco SNMP TCP port
STUN-PORT - cisco serial tunnel port
PERF-PORT - cisco perf port
TR-RSRB-PORT - cisco Remote SRB port
GDP-PORT - cisco Gateway Discovery Protocol
X25-SVC-PORT - cisco X.25 service (XOT)
TCP-ID-PORT - cisco identification port
CALLBOOK
DC
GLOBE
CFINGER - cfinger
MAILBOX
BERKNET
INVOKATOR
DECTALK
CONF
NEWS
SEARCH
RAID-CC - raid
TTYINFO RAID-AM
TROFF
CYPRESS
BOOTSERVER
CYPRESS-STAT
TERMINALDB
WHOSOCKAMI
XINUPAGESERVER
SERVEXEC
DOWN
XINUEXPANSION3
XINUEXPANSION4
ELLPACK
SCRABBLE
SHADOWSERVER
SUBMITSERVER
DEVICE2
BLACKBOARD
2033
2034
2035
2038
2040
2041
2042
2043
2044
2045
2046
2047
2048
2064
2065
2067
2080
2103
2104
2105
2106
2108
2111
2112
2115
2120
2140
2155
2201
2221
2222
2223
2232
2241
2283
2301
2307
2401
2430
2431
2432
2433
2500
2501
2564
2565
2583
2592
2600
2601
2602
2603
2604
2605
2627
2638
2700
2766
2784
GLOGGER
SCOREMGR
IMSLDOC
OBJECTMANAGER
LAM
INTERBASE
ISIS - isis
ISIS-BCAST - isis-bcast
RIMSL
CDFUNC
SDFUNC
DLS
DLS-MONITOR - dls-monitor
DISTRIB-NETASSHOLES - A group of lamers working on a closed-source client for solving the
RSA cryptographic challenge
DLSRPN - Data Link Switch Read Port Number
DLSWPN - Data Link Switch Write Port Number
Wingate Winsock Redirector Service
ZEPHYR-CLT - Zephyr Serv-HM Conncetion
Zephyr Host Manager
EKLOGIN - Kerberos (v4) Encrypted RLogin
EKSHELL - Kerberos (v4) Encrypted RShell
RKINIT - Kerberos (v4) Remote Initialization
KX - X Over Kerberos
KIP - IP Over Kerberos
Bugs
KAUTH - Remote kauth
Deep Throat, The Invasor
Illusion Mailer
ATS - Advanced Training System Program
UNREG-AB1 - Allen-Bradley unregistered port
UNREG-AB2 - Allen-Bradley unregistered port
INREG-AB3 - Allen-Bradley unregistered port
IVS-VIDEO - IVS Video default
IVSD - IVS Daemon
HVL Rat5
CIM - Compaq Insight Manager
PEHELP - pehelp
CVSPSERVER - CVS Network Server
VENUS
VENUS-SE
CODASRV
CODASRV-SE
RTSSERV - Resource Tracking system server
RTSCLIENT - Resource Tracking system client
HP-3000-TELNET - HP 3000 NS/VT block mode telnet
Striker
WinCrash
NETREK[GAME] - netrek[game]
Digital Rootbeer
ZEBRA - Zebra VTY
RIPD - RIPd VTY
RIPNGD - RIPngd VTY
OSPFD - OSPFd VTY
BGPD - BGPd VTY
WEBSTER Sybase Database
TQDATA - tqdata
LISTEN - System V Listener Port
WWW-DEV - world wide web - development
2800
2989
3000
3001
3005
3006
3024
3049
3064
3086
3128
3129
3130
3141
3150
3155
3264
3295
3306
3333
3421
3454
3455
3456
3457
3459
3700
3791
3801
3871
3900
3905
3908
3920
3921
3922
3923
3925
3975
3984
3985
3986
3996
4000
4001
4008
4045
4092
4132
4133
4321
4333
4343
4444
4500
4501
4557
4559
4567
4590
Phineas Phucker
(UDP) - RAT
UNKNOWN - Unknown Service
NESSUSD - Nessus Security Scanner
DESLOGIN - Encrypted Symmetric Telnet
DESLOGIND WinCrash
NSWS DISTRIB-NET-PROXY - Stupid closed source distrib.net proxy
SJ3 - SJ3 (Kanji Input)
RingZero Masters Paradise SQUID-IPC VMODEM - VMODEM
Deep Throat, The Invasor
HTTP Proxy
CCMAIL - cc:mail/lotus
PORT
MYSQL
DEC-NOTES - DEC Notes
BMAP - Bull Apprise portmapper
MIRA - Apple Remote Access Protocol
PRSVP - RSVP Port
VAT - VAT default data
VAT-CONTROL - VAT default control
Eclipse 2000
Portal of Doom
Eclypse
(UDP) - Eclypse
PORT
UDT_OS - Unidata UDT OS
PORT
PORT
PORT
PORT
PORT
PORT
PORT
PORT
MAPPER-NODEMGR - MAPPER network node manager
MAPPER-MAPETHD - MAPPER TCP/IP server
MAPPER-WS_ETHD - MAPPER workstation server
PORT
UNKNOWN - Unknown Service
PORT
NETCHEQUE - NetCheque accounting
LOCKD - NFS Lock Daemon
WinCrash
NUTS_DEM - NUTS Daemon
NUTS_BOOTP - NUTS Bootp Server
RWHOIS - Remote Who Is
MSQL - Mini SQL Server
UNICALL - UNICALL
NV-VIDEO - NV Video default
SAE-URN - sae-urn
URN-X-CDCHOICE - urn-x-cdchoice
FAX - fax
HYLAFAX - HylaFAX cli-svr Protocol
File Nail
ICQTrojan
4672
4899
5000
5001
5002
5003
5004
5005
5010
5011
5031
5050
5075
5145
5190
5191
5192
5193
5232
5236
5300
5301
5302
5303
5304
5305
5308
5321
5376
5400
5401
5402
5432
5500
5510
5512
5520
5530
5540
5550
5555
5556
5557
5569
5631
5632
5650
5680
5713
5714
5715
5716
5717
5742
5800
5801
5858
5900
5901
5902
5977
5978
5979
5997
5998
5999
6000
6001
6002
6003
6004
6005
6006
6007
6008
6009
6110
6111
6112
6141
6142
6143
6144
6145
6146
6147
6148
6149
6400
6455
6456
6558
6660
6661
6662
6663
6664
6665
6666
6667
6668
6669
6670
6671
6771
6776
6912
6939
6969
6970
7000
7001
7002
7003
7004
7005
7006
7007
7008
7009
7010
7100
7120
7121
7200
7201
7300
7301
7306
7307
7308
7309
7326
7648
7649
7650
7651
7770
7777
7789
8000
8001
8002
8003
8004
8005
8006
8007
8008
8009
8010
8080
8081
8082
8083
8084
8085
8086
8087
8088
8100
8101
8102
8103
8104
8105
8106
8107
8108
8109
8110
8181
8383
8450
8765
8807
8888
8892
9000
9001
9010
9090
9095
9100
9200
9201
9202
9203
9400
9535
9872
9873
9874
9875
9876
9989
9998
9999
10005
10067
10080
10082
10083
10101
10167
10520
10607
11000
11223
11371
12067
12223
12345
12346
12361
12362
12631
13000
13326
16660
16969
17007
17300
18000
20000
20001
20005
20034
20203
21544
21845
21846
21847
22222
22273
22289
22305
22321
23456
23476
SERVICE
ZEUS-ADMIN - Zeus Admin Server
SERVICE
JETDIRECT - HP JetDirect Card
WAP - Wireless Application Protocol
WAP - Wireless Application Protocol
WAP - Wireless Application Protocol
WAP - Wireless Application Protocol
InCommand
MAN
Portal of Doom
Portal of Doom
Portal of Doom
Portal of Doom
SD - Session Director
iNi-Killer
DEMOS SMTP
DISTINCT - distinct
STEL - Secure Telnet
(UDP) - Portal of Doom
AMANDA - Amanda Backup Util
AMANDA-IDX - Amanda Indexing
AMIDXTAPE - Amanda Tape Indexing
BrainSpy
(UDP) - Portal of Doom
Acid Shivers
Coma
Senna Spy
Progenic trojan
PKSD - PGP Pub. Key Server
Gjamer
Hack99 KeyLogger
NB - NetBus
GabanBus, NetBus, X-bill
Whack-a-mole
Whack-a-mole
Whackjob
Senna Spy
CROSSFIRE[GAME] - crossfire[game]
Stacheldraht Master Serverd
Priority
ISODE-DUA
Kuang2 The Virus
BIIMENU - Beckman Instruments Inc.
Millennium
Millennium backdoor
BTX - Xcept4
Netbus 2 Pro
Logged
Girlfriend
WEBPHONE - webphoned
23477
24326
25000
25001
25002
25003
25004
25005
25006
25007
25008
25009
26000
26001
26002
26208
26274
27119
27444
27500
27501
27502
27665
27910
27911
27912
27913
27920
27960
29891
29970
30029
30100
30101
30102
30303
30999
31335
31336
31337
31338
31457
31666
31785
31787
31788
31789
31791
31792
32000
33333
33911
34324
40193
40412
40421
40422
40423
40426
43188
Donald Dick
Netscape Server
ICL-TWOBASE1 - icl-twobase1
ICL-TWOBASE2 - icl-twobase2
ICL-TWOBASE3 - icl-twobase3
ICL-TWOBASE4 - icl-twobase4
ICL-TWOBASE5 - icl-twobase5
ICL-TWOBASE6 - icl-twobase6
ICL-TWOBASE7 - icl-twobase7
ICL-TWOBASE8 - icl-twobase8
ICL-TWOBASE9 - icl-twobase9
ICL-TWOBASE10 - icl-twobase10
QUAKEXX
QUAKEXX
QUAKEXX
WNN6_DS - Wnn6 (Dserver)
(UDP) - Delta Source
QUAKEXX
TRINOO_BCAST - Trinoo Attack Tool
QUAKEXX
QUAKEXX
QUAKEXX
TRINOO_MASTER - Trinoo Attack Tool
QUAKEXX
QUAKEXX
QUAKEXX
QUAKEXX
QUAKEXX
QUAKE3SERVER - Quake 3 Arena Server
(UDP) - The Unexplained
PORT
AOL Trojan
NetSphere
Netsphere
NetSphere
Sockets de Troie
Kuang2
TRINOO_REGISTER - Trinoo Attack Tool
Whack
BO - BackOrifice
NetSpy DK
TETRINET (Tetris GAME)
BO Whack
HackrarTack
HackrarTack
HackrarTack
HackrarTack (udp)
HackrarTack (udp)
HackrarTack
Generic - Shared service port
Prosiak
Spirit 2001a
BigGluck, TN
NetWare
The Spy
Agent 40421, Masters Paradise
Masters Paradise
Masters Paradise
Masters Paradise
REACHOUT
44333
WinRoute
47262
(UDP) - Delta Source
47557
DBBROWSE - Databeam Corporation
3.
50505
Sockets de Troie
50766
Fore, Schwindler
53001
Remote Window Shutdown
54320
BO 2K
54321
SchoolBus
60000
Deep Throat
61466
TeleCommando
65000
Devil
65301
PCANYWHERE
() .2,3
Internet.
6
TCP- connect()
#include <stdio.h>
#include <errno.h>
#include <netdb.h>
#include <fcntl.h>
10
fd_set rfds;
11
12
int sockfd;
13
int numbytes;
14
char buf[MAXDATASIZE];
15
16
17
int flags;
18
19
if (argc!=2)
20
21
22
exit(1);
23
24
25
26
27
herror ("gethostbyname");
28
exit(1);
29
30
// create a socket
31
32
33
perror("socket");
34
exit(1);
35
36
37
38
39
40
their_addr.sin_family=AF_INET;
41
their_addr.sin_port=htons(port);
42
43
bzero(&(their_addr.sin_zero), 8);
44
45
tv.tv_sec=10;
46
tv.tv_usec=0;
47
FD_ZERO(&rfds);
48
FD_SET(sockfd,&rfds);
49
50
printf("Connecting...\n");
51
if(connect(sockfd,(struct sockaddr*)&their_addr,sizeof(their_addr))!=0)
52
55
perror("connect");
56
exit(1);
57
58
59
else
60
61
printf("connected at once\n");
62
63
64
65
66
perror("select");
67
exit(-1);
68
69
70
71
72
if(FD_ISSET(sockfd, &rfds))
73
74
socklen_t err_len;
75
int error;
76
err_len=sizeof(error);
77
78
if(getsockopt(sockfd,SOL_SOCKET,SO_ERROR,&error,&err_len)==-1)
79
80
perror("getsockopt");
81
exit(1);
82
83
if(error != 0)
84
85
86
printf("Connection failed\n");
87
exit(-1);
88
89
90
else
91
92
93
exit(-1);
94
95
96
97
98
99
100
perror ("recv");
101
exit(1);
102
103
104
105
106
107
close (sockfd);
108
return 0;
109 }
:
. connect()
.
select().
fcntl() ( 37-38).
O_NONBLOCK, .
connect() ( 51) EINPROGRESS.
, connect() .
select() ( 64). rfds,
, . select() rfds
, . rfds
72 FD_ISSET.
78 . getsockopt()
. , .
96 , .. .
recv() ( 98) ,
.
:
. select()
timeout.
. TCP
TCP RST. timeout.
. TCP
TCP ACK. timeout.
#ifndef IP_MULTICAST_IF
/* include/netinet/in.h BSD 4.4. */
#define IP_MULTICAST_IF 9
/* / IP multicast */
#define IP_MULTICAST_TTL 10
/* / IP multicast TTL */
#define IP_MULTICAST_LOOP 11
/* / IP multicast */
#define IP_ADD_MEMBERSHIP 12
/* () IP- */
#define IP_DROP_MEMBERSHIP 13
/* IP- */
#define IP_DEFAULT_MULTICAST_TTL 1
#define IP_DEFAULT_MULTICAST_LOOP 1
#define IP_MAX_MEMBERSHIPS 20
/* / multicast- */
8
UDP- (raw)
// Compile:
// cl -o Iphdrinc Iphdrinc.c ws2_32.lib
// Command Line Parameters/Arguments:
// iphdrinc [-fp:int] [-fi:str] [-tp:int] [-ti:str] [-n:int] [-m:str]
// -fp:int From -
// -fi:IP From - IP-
// -tp:int To
-
// -ti:IP To
- IP-
// -n:int
// -m:str
#pragma pack(1)
#define WIN32_LEAN_AND_MEAN //
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>
#define MAX_MESSAGE 4068
#define MAX_PACKET 4096
//
#define DEFAULT_PORT 5150
#define DEFAULT_IP "10.0.0.1"
#define DEFAULT_COUNT 5
#define DEFAULT_MESSAGE "This is a test"
// IP-. .
typedef struct ip_hdr
{
unsigned char ip_verlen;
// IP
unsigned char ip_tos;
// TOS
unsigned short ip_totallength;
//
unsigned short ip_id;
//
unsigned short ip_offset;
//
unsigned char ip_ttl;
// TTL
unsigned char ip_protocol;
//
unsigned short ip_checksum;
//
unsigned int ip_srcaddr;
//
unsigned int ip_destaddr;
//
} IP_HDR, *PIP_HDR, FAR* LPIP_HDR;
// UDP-
typedef struct udp_hdr
{
unsigned short src_portno;
//
unsigned short dst_portno;
//
unsigned short udp_length;
// UDP-
unsigned short udp_checksum;
// UDP- ( )
} UDP_HDR, *PUDP_HDR;
//
unsigned long dwToIP,
// IP
dwFromIP;
// IP (spoof)
unsigned short iToPort,
//
iFromPort;
// (spoof)
DWORD dwCount;
//
char strMessage[MAX_MESSAGE];
//
//
void usage(char *progname)
{
printf("usage: %s [-fp:int] [-fi:str] [-tp:int] [-ti:str]\
[-n:int] [-m:str]\n", progname);
printf(" -fp:int From (sender) port number\n");
printf(" -fi:IP From (sender) IP address\n");
printf(" -fp:int To (recipient) port number\n");
printf(" -fi:IP To (recipient) IP address\n");
printf(" -n:int Number of times to read message\n");
printf(" -m:str Size of buffer to read\n\n");
ExitProcess(1); // WinAPI, .
}
//
void ValidateArgs(int argc, char **argv)
{
int i;
iToPort = DEFAULT_PORT;
iFromPort = DEFAULT_PORT;
dwToIP = inet_addr(DEFAULT_IP);
dwFromIP = inet_addr(DEFAULT_IP);
dwCount = DEFAULT_COUNT;
strcpy(strMessage, DEFAULT_MESSAGE);
for(i = 1; i < argc; i++)
{
if ((argv[i][0] == '-') || (argv[i][0] == '/'))
{
switch (tolower(argv[i][1]))
{
case 'f': // From address
switch (tolower(argv[i][2]))
{
case 'p':if (strlen(argv[i]) > 4) iFromPort = atoi(&argv[i][4]);
break;
9
TCP- /
#include <stdio.h>
#include <winsock2.h>
#define PORT 3490
//
#define MAXDATASIZE 1000
//
#define TIME_TO_WAIT 100
//
char* msg = "Hello, server! Nice to meet you";//
int main(int argc, char* argv[])
{
struct hostent*
he;
struct sockaddr_in addr;
DWORD
read = 0, write = 0, flags = 0;
SOCKET
sock;
char
buffer[MAXDATASIZE + 1];
WSADATA
wsaData;
WSABUF
wsaBufRead;
WSABUF
wsaBufWrite;
WSAOVERLAPPED
wsaOverlappedRead;
WSAOVERLAPPED
wsaOverlappedWrite;
//
if ( argc != 2 )
{
fprintf( stderr, "Usage: client <hostname>\n" );
exit( 1 );
}
// WinSock
WSAStartup( MAKEWORD( 2, 0 ), &wsaData );
// DNS
if ( ( he = gethostbyname( argv[1] ) ) == NULL )
{
fprintf( stderr, "Failed to resolve host name\n" );
exit( 1 );
}
//
if ( ( sock = WSASocket( AF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED ) )
== INVALID_SOCKET )
{
fprintf( stderr, "Failed creating socket\n" );
exit( 1 );
}
memset( &addr, 0, sizeof( addr ) );
//
addr.sin_family
= AF_INET;
addr.sin_port = htons( PORT );
addr.sin_addr = *((struct in_addr*) he->h_addr_list[0]);
//
if ( WSAConnect ( sock, (sockaddr*) &addr, sizeof( sockaddr ), NULL, NULL, NULL,
NULL ) == SOCKET_ERROR )
{
fprintf( stderr, "Failed connecting to remote host, %d\n", WSAGetLastError( ) );
closesocket( sock );
exit( 1 );
}
// 1.
wsaBufRead.buf = buffer;
wsaBufRead.len = MAXDATASIZE;
wsaOverlappedRead.hEvent = NULL;
//
if (
( WSARecv( sock, &wsaBufRead, 1, &read, &flags, &wsaOverlappedRead, NULL ) ==
SOCKET_ERROR ) &&
( WSAGetLastError( ) != WSA_IO_PENDING ))
{
fprintf( stderr, "Failed reading on socket\n" );
closesocket( sock );
exit( 1 );
}
// 2.
wsaBufWrite.buf = msg;
wsaBufWrite.len = strlen( msg );
wsaOverlappedWrite.hEvent = NULL;
//
if (
( WSASend( sock, &wsaBufWrite, 1, &write, 0, &wsaOverlappedWrite, NULL ) ==
SOCKET_ERROR ) &&
( WSAGetLastError( ) != WSA_IO_PENDING ))
{
fprintf( stderr, "Failed sending on socket\n" );
closesocket( sock );
exit( 1 );
}
// ( )
for ( ;; )
{
bool readCompleted = true;
bool writeCompleted = true;
// WSARecv()
if ( WSAGetOverlappedResult( sock, &wsaOverlappedRead, &read, FALSE, &flags
) == FALSE )
{
if ( WSAGetLastError( ) != WSA_IO_INCOMPLETE )
{
fprintf( stderr, "Failed reading data\n" );
break;
}
readCompleted = false;
}
// WSASend()
if ( WSAGetOverlappedResult( sock, &wsaOverlappedWrite, &write, FALSE,
&flags ) == FALSE )
{
if ( WSAGetLastError( ) != WSA_IO_INCOMPLETE )
{
fprintf( stderr, "Failed writing data\n" );
break;
}
writeCompleted = false;
}
printf( "Received: %d\t Sent: %d\n", read, write );
if ( ( readCompleted == true ) && ( writeCompleted == true ) )
{
buffer[read] = '\0';
printf( "Message from server: %s\n", buffer );
break;
}
Sleep( TIME_TO_WAIT );
}
//
closesocket( sock );
return 0;
}
10
o IOCP
-
#include <stdio.h>
#include <conio.h>
#include <malloc.h>
#include <winsock2.h>
#pragma comment (lib,"ws2_32.lib")
#define PORT 28912
//
DWORD WINAPI ClientPool(SOCKET client); //
//--------------------------------------------------------------------------void main(void){
int j;
//
WORD wVersionRequested; //
WSADATA wsaData;
// -
int err;
//
char address[16]={0};
// ()
char buffer[128];
//
SOCKET sd;
//
HANDLE hThread;
//
DWORD ThreadId;
//
// ws2_32.dll
wVersionRequested=MAKEWORD(2,2);
err=WSAStartup(wVersionRequested,&wsaData);
if(err==SOCKET_ERROR){
strcpy(buffer," - WSAStartup ");
CharToOem(buffer,buffer);
printf("%s %d\n",buffer, WSAGetLastError());
WSACleanup(); //
getch();
return;
}
strcpy(buffer," ");
CharToOem(buffer,buffer);
printf("%s\n",buffer);
scanf("%s",address);
// C
sd = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(sd==INVALID_SOCKET){
strcpy(buffer," - socket ");
CharToOem(buffer,buffer);
printf("%s %d\n",buffer, WSAGetLastError());
WSACleanup(); //
getch();
return;
}
SOCKADDR_IN sin;//
ZeroMemory(&sin, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_port = htons(PORT);
sin.sin_addr.s_addr =inet_addr(address);
if(connect(sd, (PSOCKADDR)&sin, sizeof(SOCKADDR))==-1)
{
strcpy(buffer," ");
CharToOem(buffer,buffer);
printf("%s %d\n",buffer, GetLastError());
WSACleanup(); //
getch();
return;
}
strcpy(buffer," ");
CharToOem(buffer,buffer);
printf("%s\n",buffer);
// ClientPool()
hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ClientPool,(void*)sd, 0,
&ThreadId);
while(true)
{
scanf("%s",buffer);
if(strcmp(buffer,"EXIT")==0)
{
TerminateThread(hThread,0);
if (sd!=INVALID_SOCKET)closesocket(sd);
//
break;
}
send(sd,buffer,strlen(buffer),0);
}
WSACleanup();
//
return;
}
//--------------------------------------------------------------------------//
//--------------------------------------------------------------------------DWORD WINAPI ClientPool(SOCKET client)
{
int bytes;
char buffer[128];
while(true)
{
bytes=recv(client,buffer,sizeof(buffer),0);
buffer[strlen(buffer)]='\0';
if(strlen(buffer)!=0)printf("%s\n",buffer);
}
return 0;
}
- IOCP
#include <stdio.h>
#include <conio.h>
#include <malloc.h>
#include <Winsock2.h>
#include <list>
// STL
#pragma comment (lib,"ws2_32.lib")
// ws2_32.lib
using namespace std;
// std
#define BUFF_SIZE
1024
//
#define PORT 28912
//
DWORD WINAPI ServerPool(HANDLE hp);
void SendToAll(char *buffer,unsigned long bytes);
//
//
SOCKET server_sock;
//
int ClientCount;
//
list <SOCKET> ClientList;
//
//--------------------------------------------------------------------------struct ovpConnection: public OVERLAPPED
{
int client_number;
//
SOCKET c;
//
char * buffer;
//
enum
{
op_type_send,
//
op_type_recv
//
}op_type;
//
};
//--------------------------------------------------------------------------void main(int argc, char *argv[])
{
int err;
//
char buffer[128];
//
WORD wVersionRequested; //
WSADATA wsaData;
// -
HANDLE hCp;
//
LPOVERLAPPED overlapped; // I/O
HANDLE hThread;
//
DWORD ThreadId;
//
DWORD flags;
// - WSARecv
// ws2_32.dll
wVersionRequested=MAKEWORD(2,2);
err=WSAStartup(wVersionRequested,&wsaData);
if(err==SOCKET_ERROR)
{
strcpy(buffer," - WSAStartup");
CharToOem(buffer,buffer);
printf("%s %d\n",buffer, WSAGetLastError());
WSACleanup(); //
getch();
return;
}
//
hCp=CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL,0,0);
if(hCp==NULL)
{
strcpy(buffer," - CreateIoCompletionPort");
CharToOem(buffer,buffer);
printf("%s %d\n",buffer, GetLastError());
WSACleanup(); //
getch();
return;
}
//
server_sock=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,NULL, WSA_FLAG_OVERLAPPED);
if(server_sock==INVALID_SOCKET)
{
strcpy(buffer," - WSASocket");
CharToOem(buffer,buffer);
printf("%s %d\n",buffer, WSAGetLastError());
WSACleanup(); //
getch();
return;
}
else
{
//
if(CreateIoCompletionPort((HANDLE)server_sock,hCp,0,0)==NULL)
{
strcpy(buffer," - CreateIoCompletionPort");
CharToOem(buffer,buffer);
printf("%s %d\n",buffer, GetLastError());
WSACleanup(); //
getch();
return;
}
}
//
SOCKADDR_IN sinServer;
sinServer.sin_family = AF_INET;
sinServer.sin_port = htons(PORT);
sinServer.sin_addr.s_addr = INADDR_ANY;
err = bind( server_sock,(LPSOCKADDR)&sinServer,sizeof(sinServer) );
if(err==-1)
{
strcpy(buffer," - bind");
CharToOem(buffer,buffer);
printf("%s %d\n",buffer, GetLastError());
WSACleanup(); //
getch();
return;
}
//
err = listen(server_sock, SOMAXCONN);
if(err==-1)
{
strcpy(buffer," - listen ");
CharToOem(buffer,buffer);
printf("%s %d\n",buffer, GetLastError());
WSACleanup(); //
getch();
return;
}
//C
hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ServerPool,hCp,0, &ThreadId);
ClientCount=0;
strcpy(buffer," \n");
CharToOem(buffer,buffer);
printf("%s",buffer);
//
while(true)
{
// -
SOCKADDR_IN sinClient;
int lenClient=sizeof(sinClient);
SOCKET client = accept(server_sock,(struct sockaddr*)&sinClient, &lenClient);
CreateIoCompletionPort((HANDLE)client,hCp,0,0);
//
ClientList.insert(ClientList.end(),client);
// overlapped-
ovpConnection * op = new ovpConnection;
// overlapped-
op->sock_handle = client;
op->op_type = ovpConnection::op_type_recv;
strcpy(buffer," %d %s\n");
CharToOem(buffer,buffer);
printf(buffer,op->client_number,op->buffer);
}
unsigned long b;
WSABUF buf;
buf.buf = op->buffer;
buf.len = BUFF_SIZE;
// buffer_len
err=WSARecv(op->sock_handle, &buf, 1, &b, &flags, op, 0);
if(!err)
{
strcpy(buffer," - WSARecv");
CharToOem(buffer,buffer);
printf("%s %d\n",buffer, WSAGetLastError());
}
}
}
else
{
if(!overlapped)
{
//
// , ,
for(list<SOCKET>::iterator i=ClientList.begin();i!=ClientList.end();i++)
{
closesocket(*i);
}
ClientList.clear();
closesocket(server_sock);
CloseHandle(hport);
strcpy(buffer," %d, \n");
CharToOem(buffer,buffer);
printf(buffer,GetLastError());
getch();
exit(0);
}
else
{
//
closesocket(((ovpConnection*)overlapped)->sock_handle);
ClientList.remove(((ovpConnection*)overlapped)->sock_handle);
strcpy(buffer," %d , %d\n");
CharToOem(buffer,buffer);
printf(buffer,((ovpConnection*)overlapped)->client_number,
ClientList.size());
}
}
}
return 0;
}
//--------------------------------------------------------------------------//
//--------------------------------------------------------------------------void SendToAll(char *buffer,unsigned long bytes)
{
//
for(list<SOCKET>::iterator i=ClientList.begin();i!=ClientList.end();i++)
{
ovpConnection * op = new ovpConnection;
op->sock_handle = *i;
op->op_type = ovpConnection::op_type_send;
op->buffer = new char[bytes-1];
memcpy(op->buffer, (buffer+1), bytes-1);
op->buffer[bytes-1]='\0';
unsigned long b;
WSABUF buf;
buf.buf = op->buffer;
buf.len = BUFF_SIZE;
WSASend(op->sock_handle,&buf,1,&b, 0, op, 0);
}
return;
11
NCB-
NCBACTION
NCBADDGRNAME
NCBADDNAME
NCBASTAT
Windows NT/2000/XP:
. NCBACTION TdiAction.
, ncb_buffer ,
ACTION_HEADER,
() .
NCBACTION NCBCANCEL.
NCBACTION - NetBIOS 3.0
.
,
.
.
TDI , .
()
. , ncb_buffer
NCBCALL
NCBCANCEL
NCBCHAINSEND
NCBCHAINSENDNA
NCBDELNAME
NCBDGRECV
NCBDGRECVBC
NCBDGSEND
NCBDGSENDBC
NCBENUM
NCBFINDNAME
NCBHANGUP
NCBLANSTALERT
NCBLISTEN
NCBRECV
NCBRECVANY
NCBRESET
NCBSEND
NCBSENDNA
NCBSSTAT
NCBTRACE
NCBUNLINK
,
ACTION_HEADER,
NAME_BUFFER.
.
.
.
.
.
.
.
.
(LAN).
Windows NT/2000/XP: LANA.
, ncb_buffer ,
LANA_ENUM. NCBENUM
NetBIOS 3.0.
.
, ncb_buffer ,
FIND_NAME_HEADER,
FIND_NAME_BUFFER.
.
Windows NT/2000/XP: e
, .
(
).
.
,
.
LAN-.
NCB-,
ncb_lana_num.
,
:
ncb_lsn 0x00, ,
ncb_lana_num, .
ncb_lsn 0x00, ,
ncb_lana_num, ,
ncb_callname[0]
,
ncb_callname[2]
ncb_callname[3] ,
NAME_NUMBER_1.
.
.
. ,
ncb_buffer ,
SESSION_HEADER,
.
NCB.
( ).
.
NetBIOS.
Windiws.
NRC_GOODRET
NRC_BUFLEN
NRC_ILLCMD
NRC_CMDTMO
NRC_INCOMP
NRC_BADDR
NRC_SNUMOUT
NRC_NORES
NRC_SCLOSED
NRC_CMDCAN
NRC_DUPNAME
NRC_NAMTFUL
NRC_ACTSES
NRC_LOCTFUL
NRC_REMTFUL
NRC_ILLNN
NRC_NOCALL
NRC_NOWILD
NRC_INUSE
NRC_NAMERR
NRC_SABORT
NRC_NAMCONF
NRC_IFBUSY
NRC_TOOMANY
NRC_BRIDGE
NRC_CANOCCR
NRC_CANCEL
NRC_DUPENV
NRC_ENVNOTDEF
NRC_OSRESNOTAV
NRC_MAXAPPS
NRC_NOSAPS
NRC_NORESOURCES
NRC_INVADDRESS
NRC_INVDDID
NRC_LOCKFAIL
NRC_OPENERR
NRC_SYSTEM
NRC_PENDING
.
.
.
.
.
.
.
.
.
.
.
.
.
;
.
.
.
.
.
.
ncb_name .
.
.
.
.
.
;
.
ncb_lana_num
.
.
NCBCANCEL
.
.
.
reset.
.
.
.
NetBIOS .
.
NCB .
IBM NetBIOS 3.0
NCB.
Netbios.
NCB DDID .
.
. NetBIOS
3.0.
.
.