在網路通訊中,套接字一定是成對出現的,一端的傳送緩衝區對應對端的接收緩衝區,使用的是同乙個檔案描述符。
埠號:在網路中的一台主機上,唯一標識乙個程序
socket:乙個檔案描述符指向乙個套接字,該套接字內部由核心借助兩個緩衝區實現
對於udp來說, 來標識
對於tcp來說, 來標識, 畢竟對於tcp來說,每次接受乙個連線,就重新對應了一對tcp連線,所以需要4元組來區別。
記憶體中的多位元組資料相對於記憶體位址有大端和小端之分,
磁碟檔案中的多位元組資料相對於檔案中的偏移位址也有大端小端之分,
那麼如何定義網路資料流中的位址呢?
傳送主機通常將傳送緩衝區中的資料按記憶體從低到高的順序發出,接收主機把從網路上接到的位元組序依次儲存在接收緩衝區中,也是按照記憶體位址從低到高的順序儲存,因此,網路資料流的位址也應該從低到高發出。
其中,位址從上到下是從低到高、位元組呢從左到右是從高到低
因此,大端地位址存高位元組讀出就是123456,小端就是563412
tcp/ip協議規定,網路資料流應採用大端位元組序,即低位址高位元組。這樣,如果傳送主機是小端位元組序的話,傳送主機在傳送到緩衝區之前就需要做位元組序的轉化,同樣的,如果接收主機是小端位元組序也需要做位元組序的轉換;當然,如果傳送和接收的都是大端位元組序,就不需要考慮轉換的問題
#include uint32_t htonl(uint32_t hostlong);//host to net long
uint16_t htons(uint16_t hostshort);//host to net short
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
#include struct in_addr;
struct sockaddr_in;
#include struct in6_addr;
#define sin6_len
struct sockaddr_in6;
#include struct sockaddr;
#include //返回: 若字串有效則為1, 否則為0
int inet_aton(const char *strptr, struct in_addr *addrptr);
in_addr_t inet_addr(const char *strptr);
//返回: 指向乙個點分十進位制數串的指標
char* inet_ntoa(struct in_addr inaddr);
#include //返回: 若成功則為1, 若輸入不是有效的表達格式則位0, 若出錯則為-1
int inet_pton(int family, const char *strptr, void *addrptr);
//返回: 若成功則為指向結果的指標,若出錯則為null
const char* inet_ntop(int family, void *addrptr, char *strptr, size_t len);
7.1 socket函式#include //返回: 若成功則為非負描述符, 若出錯則為-1
int socket(int family, int type, int protocol);
family
宣告af_inet
ipv4協議
af_inet6
ipv6協議
af_local
unix域協議
af_route
路由套接字
af_key
金鑰套接字
type
說明sock_stream
位元組流套接字
sock_dgram
資料報套接字
sock_seqpacket
有序分組套接字
sock_raw
原始套接字
protocol
說明ipproto_cp
tcp傳輸協議
ipproto_udp
udp傳輸協議
ipproto_sctp
sctp傳輸協議
7.2 connect函式
#include //返回: 若成功則為0, 若出錯則為-1
int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);
7.3 bind函式#include
//返回: 若成功則為0, 若出錯則為-1
intbind
(int sockfd,
const
struct sockaddr *myaddr, socklen_t addrlen)
;
7.4 listen函式#include
//返回: 若成功則為0, 若出錯則為-1
7.5 accept函式
#include
//返回: 若成功則為非負描述符, 若出錯則為-1
intaccept
(int sockfd,
struct sockaddr *cliaddr, socklen_t *addrlen)
;
#include
//返回: 在子程序中為0, 在父程序中為子程序id,若出錯則為-1
pid_t fork
(void
);
#include
intgetsockname
(int sockfd,
struct sockaddr *localaddr, socklen_t *addrlen)
;int
getpeername
(int sockfd,
struct sockaddr *peeraddr, socklen_t *addrlen)
;//均返回: 若成功則為0, 若出錯則為-1
TCP 學習筆記3 TCP的互動資料流
所謂互動資料流就是指通過互動產生的一些資料量很小的分組,比如客戶端輸出乙個命令,伺服器會對客戶端傳送乙個ack以及該命令的回顯,客戶端再傳送乙個對回顯命令的確認,如果這樣的分組很多,那麼會降低傳效率。是指tcp在接受到資料時通常不會立即傳送ack,而是會等待一段時間,以便於將ack與需要沿該方向傳送...
tcp網路程式設計基礎
1.tcp客戶端 from socket import 建立socket tcp client socket socket af inet,sock stream 目的資訊 server ip input 請輸入伺服器ip server port int input 請輸入伺服器port 鏈結伺服器...
TCP網路程式設計基礎
1 套接字結構 struct sockaddr 上述結構中協議族成員變數sa family的型別是sa family t,其實這個型別是unsigned short型別,因此成員變數sa family的長度為16位。typedef unsigned short sa family t 通用套接字結構...