Net4-Socket_programming.pptx

Download Report

Transcript Net4-Socket_programming.pptx

Socket Programming
授課教師:雲林科技大學 張慶龍 老師
Network Socket Data Structure
• 使用socket interface, 使用者需提供source IP/Port與
destination IP/Port
• BSD socket API定義了基本socket address 資料結構
適用不同的網路與其位址格式
針對IP Network之位址結構(socket address internet)
Socket Address結構 v.s. Socket Address Internet 結構
Endian 問題
• CPU寫資料至記憶體之方式有
– Big-Endian : 資料的High-byte寫至記憶體的Low address
– Little-Endian :資料的Low-byte寫至記憶體的Low address
• Ex: CPU將資料0x1234寫至記憶體位址1000
• 不同的CPU可能會有不同的Endian方式
1000H 0x12
1000H 0x34
• 如何讓不同的CPU仍可以藉由IP 網路
1001H 0x34
1001H 0x12
互相溝通?
1002H
1002H
– 在IP網路上傳輸之封包統一是以
Big-Endian來傳送
不管CPU是何種Endian,
Big-Endian
Little-Endian
當要組裝成封包時即要改為Big-Endian
Net_Util_Host_To_Net_16()
• 將16-bit之host endian轉為network endian
• val: 16-bit 整數值
• Return value:
– Netwrok endian 之16-bit整數值
Net_Util_ Host_To_Net_32()
• 將16-bit之host endian轉為network endian
• val: 32-bit 整數值
• Return value:
– Network endian 之32-bit整數值
Net_Util_Net_To_Host_16()
• 將16-bit之network endian轉為host endian
• val: 16-bit 整數值(network endian)
• Return value:
– host endian 之16-bit整數值
Net_Util_Net_To_Host_32()
• 將32-bit之network endian轉為host endian
• val: 32-bit 整數值(network endian)
• Return value:
– host endian 之32-bit整數值
Socket Address IP協定之使用範例
Datagram Socket – UDP Protocol – BSD socket call
• Connectionless不用事先建立連線
Datagram Socket – UDP Protocol – uC/TCP-IP
socket call
UDP Server(1)
UDP Server(2)
UDP Server(3)
UDP Client(1)
UDP Client(2)
Stream Socket – TCP Protocol – BSD
Socket Call
• Connection oriented
Stream Socket – TCP Protocol – uC/TCP-IP
socket call
TCP Server(1)
TCP Server(2)
TCP Server(3)
TCP Server(4)
TCP Client(1)
TCP Client(2)
Select()應用
int main ()
{
int rc;
NET_ERR err;
fd_set readfd;
SOCKET sock1, sock2;
FD_ZERO(&readfd);
sock1 = NetSock_Open( NET_SOCK_ADDR_FAMILY_IP_V4, NET_SOCK_TYPE_STREAM, NET_SOCK_PROTOCOL_TCP, &err);
conn_rtn_code = NetSock_Conn( sock1, &server_sock_addr_ip1, sizeof(server_sock_addr_ip1), &err);
sock2 = NetSock_Open( NET_SOCK_ADDR_FAMILY_IP_V4, NET_SOCK_TYPE_STREAM, NET_SOCK_PROTOCOL_TCP, &err);
conn_rtn_code = NetSock_Conn( sock2, &server_sock_addr_ip2, sizeof(server_sock_addr_ip2), &err);
FD_SET(socke1, &readfd);
FD_SET(socke2, &readfd);
while(1)
{
select(s+1,&readfd,NULL,NULL, NULL, &rc);
if(FD_ISSET(sock1,&readfd))
rx_size = NetSock_RxData( sock1, rx_buf1, RX_BUF_SIZE, NET_SOCK_FLAG_NONE, &err);
if(FD_ISSET(sock2,&readfd))
rx_size = NetSock_RxData( sock2, rx_buf2, RX_BUF_SIZE, NET_SOCK_FLAG_NONE, &err);
}
}