03 - WinSock Programming - Wechen PDF
03 - WinSock Programming - Wechen PDF
Outline
Introduction to Socket/WinSock Programming
IPv4 WinSock Programming
IPv6 WinSock Programming
IPv6 Translation Middleware- Socket-layer Translator
Conclusions
Introduction
What is Windows Sockets?
- An Open Interface for Network Programming under Microsoft
Windows
What are its Benefits?
- an open standard
- source code portability
- support dynamic linking
What is its Future?
- WinSock 2
Windows Sockets
Winsock APIs
WSAAsyncGetHostByAddr() WSAAsyncGetHostByName()
WSAAsyncGetProtoByName() WSAAsyncGetProtoByNumber()
WSAAsyncGetServByName() WSAAsyncGetServByPort()
WSAAsyncSelect() WSACancelAsyncRequest()
WSACancelBlockingCall() WSACleanup()
WSAGetLastError() WSAIsBlocking()
WSASetBlockingHook() WSASetLastError()
WSAStartup() WSAUnhookBlockingHook()
WinSock 2 API
WinSock 2 WinSock 2
Transport SPI Name Space SPI
Compatibility of Winsock
WinSock 2 WinSock 1.1
Application Application
WinSock 2 API
WinSock 2 SPI
TCP/IP TCP/IP-based
Transport Namespace
Service Provider Service Provider
e.g. DNS
Client/Server Model
Client-Server Model
Client and Server Association
- protocol ( same for both Clint and server sockets )
- client IP address
- client port number
- server IP address
- server port number
Client/Server Programming(1)
TCP Client TCP Server
data
send recv
data
recv send
close/ close/
closesocket closesocket
Client/Server Programming(2)
UDP Client UDP Server
socket socket
bind
data
sendto recvfrom
data
recvfrom sendto
close/ close/
closesocket closesocket
Open a Socket
bind( )
int PASCAL FAR bind ( SOCKET s, /*an unbound socket */
struct sockaddr FAR *addr, /*local port and IP addr */
int namelen); /*addr structure length*/
S: socket handle
addr : pointer to a socket address structure
(always a sockaddr_in data structure for
TCP/IP)
namelen: length of socket structure pointed to by addr
(always 4 for TCP/IP)
s: socket handle
addr: pointer to socket address structure (always a
sockaddr_in structure for TCP/IP)
namelen: length of structure pointed to by addr (always 4
for TCP/IP)
s: socket handle
addr: pointer to socket address structure ( always a
sockaddr_in structure for TCP/IP)
addrlen: length of socket structure that addr points to
( always 4 for TCP/IP)
s: socket handle
buf: pointer to a buffer that contains application data to
send
len: length of data (in bytes) to send
flags: flags to affect the send ( MSG_OOB, MSG_DONTROUTE)
hostent 資料結構
struct hostent {
char FAR * h_name;
char FAR * FAR * h_aliases;
short h_addrtype;
short h_length;
char FAR * FAR * h_addr_list;
}
是一個linked-list
listen(listenfd, LISTENQ);
for ( ; ; ) {
connfd = accept(listenfd, (SA *) NULL, NULL);
ticks = time(NULL);
snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));
write(connfd, buff, strlen(buff));
Close(connfd);
}
}
提供轉換IPv4程式到IPv6之方法
介紹IPv4與IPv6之長度不同
介紹為何需要改變應用程式
介紹不用轉換的Socket API
介紹需要轉換的Socket API
介紹需要轉換的資料結構
IPv4/IPv6位址長度不同
數字位址
IPv4, 32位元位址長度
IPv6, 128位元位址長度
32 bits
IPv4
IPv6
128 bits
為何需要轉換應用程式
V4/v6 Protocol-independent
IPv4 AP IPv6 AP Application
轉換需要改變的部分
與IP位址相關的Socket API與參數需要修改
程式部分有運用到IP位址的部分
位址轉換函式
位址複製函式
位址比較函式
位址相關之記憶體指派與變數宣告
IPv4程式設計者的自訂的函式與變數也需要修改
API與資料結構的轉換
Socket參數名稱轉換
IPv4 IPv6
AF_INET AF_INET6
PF_INET PF_INET6
IN_ADDR_ANY inaddr6_any
API與資料結構的轉換
資料結構轉換
IPv4 IPv6
in_addr in6_addr
sockaddr
sockaddr_in6
sockaddr_in sockaddr_in6
struct sockaddr_in {
uint8_t sin_len; /* length of structure(16) */
sa_family_t sin_family; /* AF_INET */
in_port_t sin_port; /* 16bit TCP or UDP port number */
/*network byte ordered*/
struct in_addr sin_addr; /* 32bit IPv4 address */
/*network byte ordered*/
char sin_zero[8]; /* unused */
}; /* included in <netinet/in.h> */
API與資料結構的轉換
資料結構參數轉換
IPv4 IPv6
sin_len sin6_len
sin_family sin6_family
sin_port sin6_port
sin_addr sin6_addr
s_addr s6_addr
API與資料結構的轉換
函式轉換
IPv4 IPv6
inet_aton()
Name-to_address inet_addr() inet_pton()
Functions
inet_ntoa() inet_ntop()
getipnodebyname()
Address conversion gethostbyname() getipnodebyaddr()
Functions gethostbyaddr() getnameinfo()
getaddrinfo()
AF independent AF independent
struct sockaddr struct sockaddr_storage
IPv4 dependent IPv6 dependent
struct in_addr struct in6_addr
struct sockaddr_in struct sockaddr_in6
Name resolving Name resolving
struct hostent struct addrinfo
IPv4 IPv6
Introduction to Checkv4.exe
Provided by Microsoft
Identifies potential problems in codes and makes
recommendations
Identifies most trivial problems
Successfully checks presence of IPv4 specified code. e.g.
gethostbyname(), struct sockaddr_in, and so on.
Gives some false alert
Identifies parameters in comment
Results from Checkv4.exe
About 200 lines for CCL/ITRI SkinUA
Structure of SIP UA
UI
WaveIO
SDP sipTx
SIP RTP
Transport
2004/12/24 Speaker: Whai-En Chen 56
LAB 117
CallManager
UI
CallManager MediaManager
Function Call
UACore
GUI Problem
IP Address control
Is IPv4 specified
Do not accept domain name
Use Edit control instead
(cont.)
IPv6 address Literal format has scope-id
E.g. fe80::201:2ff:fe85:37ed%3
Used by linked-local address
Identify the same address on different interface
Scope-id must be specified when connecting to sites
using link-local address
An extra parameter in data structure to keep this
(cont.)
SIP URI may contain IPv6 address
E.g. sip:wechen@[2001:238:f82:6::2]:5060
Rewrite parser to ensure correctly dealing with colon
Since IPv6 address are longer than IPv4 address, GUI
components related to address should be modified
Avoid using IPAddressControl that supports IPv4
address only
Results
Changes 500+ out of 100,000+ lines in 150 files
About 300 lines are not identified by checkv4.exe
SIP UA supports
IPv4 or IPv6 communication
IPv6 address in SIP URI
IPv6 address in GUI and form
Modifications in SIP UA
Transport – handle different IP versions
GUI – handle IPv6 address
CallManager – URI parsing/generating
Modification Summary
UACore 5
sipTX 4
sip 5
sdp 1
rtp 6
transport 6
cclRTP 2
MediaManager 4
UI 4
Total: 39 files
UAProfile 2
2
Click right botton
1 Double-click
4 3
Next Page
1. 選擇「User Settings」分頁
1
2. 在「User IP Address」選項中,
選擇Global Unicast IPv6 Address
(如:2001:238:f88:131:2e0:18ff:feea:f782)
3. 如果要跨越IPv4網路,則需要選擇
6to4位址(Prefix是2002::/16)
3
Next Page
1. 選擇「Server Settings」分頁
1
2. 取消「Use Proxy」選項
2 3. 取消「Registration」;若是有IPv6
SIP伺服器,則可以選取選項,並填入
伺服器的IPv6位址
4
Next Page
1. 選擇「Codec Settings」分頁
1
2. 將要用的Codec放入「Active
Codecs」選項中
3. 選取「Use Video」,若不需要
2
影像則可以取消此選項
4. 按下「確定」按鈕,完成設定
4
Next Page
3
1
4
5
7
Next Page
6
2 3
撥號與接聽
發話方 受話方
1. 按下「Dial」按鈕,開始撥號
2. 受話方案下圖中電話筒圖案即可接聽
2004/12/24 Speaker: Whai-En Chen 73
計畫 LAB 117
&
VoIP LAB
4.通訊影像
Using
UsingIPv6
IPv6Addresses
Addresses
IPv6
IPv6 address
IPv6
IPv6 address
Interoperability Testing
Testing with 2 Linux SIP-based phone
Kphone 3.2 with IPv6 (patched by iptel)
Linphone 0.11.3 (claimed as IPv6 enabled)
Environment
Windows XP SP1
Redhat linux 9.0
Partysip IPv6 SIP proxy
Iptel IPv6-enabled SIP server
Item Result
Register on iptel Succeed
Register on partysip Succeed
Call UA through partysip Succeed
proxy server
To IPv6 SIP UA
To
From Kphone Linphone SkinUA
OK SIP ok SIP ok
KPhone
SIP ok OK SIP ok
Linphone
OK SIP ok OK
SkinUA
• Linphone & KPhone can not accept URI containing IPv6 Literal address in URI.
設計主機端轉換之中介軟體
可是要將應用程式升級成IPv6會有以下問題
需要改用新的 API
需要改用新的 Data structure
以SIP-based VoIP User Agent為例
約有200行Socket API、資料結構需要轉換
共約有600行位址相關函式、變數、記憶體指派需要修改
短期內將程式升級IPv6不容易
需要改的函式、變數需要追蹤修訂
程式版本升級時,亦需隨之修訂
提出一個轉換v4/v6的中介軟體,以 BIA為基礎,
設計應用層轉換機制
2004/12/24 Speaker: Whai-En Chen 81
LAB 117
&
VoIP LAB
軟硬體來源與執行平台
BIA轉換器元件
Function Mapper
Name Resolver
Address Mapper
ALG Manager
FTP-ALG
BIA轉換器的開發平台如下
開發平台
作業系統: Windows XP SP1
中央處理器: Intel Celeron 2GHz
記憶體: 128 MB
硬碟: 20GB
編譯程式: Microsoft Visual C++ 6.0
開發函式庫: Microsoft Platform SDK February 2003
BIA可以執行於微軟Windows XP/2003之上
XP/2003
Name Resolving:
Translate IPv6 address to IPv4 address
Conclusions
In this course, you can learn the following techniques
IPv4 Windows Socket Programming
IPv6 Windows Socket Programming
IPv4/IPv6 Domain Name Resolution
You can try to do following advanced topics.
Writing IPv4/IPv6 compatible programs
Porting IPv4 applications to IPv6 version
Writing ALG on Socket-layer Translator
Writing IPv6 Test tools on SIPv6 Analyzer
References
Microsoft Platform SDK
MSDN Library
VC++ 6.0
References
[1] RFC- 2766 Network Address Translation - Protocol Translation,G.
Tsirtsis、P. Srisuresh,2000/2
[2] RFC-2765 Stateless IP/ICMP Translator (SIIT),Nordmark, E.,2000/2
[3] RFC-2767 Bump-In-the-Stack,K. Tsuchiya、H. Higuchi、Y.
Atarashi,2000/2, [4] RFC-3338 Bump-In-the-API,S. Lee、M-K.
Shin、Y-J. Kim、E. Nordmark、A. Durand,2002/10
[5] IPv6 Guide for Windows Sockets Applications,MSDN Library,
2003/2, http://msdn.microsoft.com/library/en-
us/winsock/winsock/ipv6_guide_for_windows_sockets_applications_2.a
sp?frame=true
[6] How to upgrade WinSock application to support IPv6,Makoto
Ookawa,2003/7,
http://www.ipv6style.jp/en/apps/20030711/20030711_p.shtml
[7] RFC-2893 Transition Mechanisms for IPv6 Hosts and Routers,R.
Gilligan、 E. Nordmark,2000/8
[8] Hitachi Toolnet6, http://www.hitachi.co.jp/Prod/comp/network/pexv6-
e.htm
[9] IPv6解析,謝佳男、朱永正、陳懷恩譯,台灣歐萊禮,ISBN:986-
7794-11-7
IPv4 Header
IPv4
Address
IPv6
Address