建立套接字
int socket(int domain, int type, int protocol);
返回sockfd(套接字位址描述符)
domain為位址族,一般為:
pf_inet internet協議(網路位址協議)
pf_unix unix internet協議(本地位址協議)
pf_ns xerox ns協議
pf_implink inte***ce message協議
type 套接字型別
sock_stream 流式套接字
sock_dgram 資料報套接字
sock_raw 原始套接字
protocol 引數通常置為0 (原始套接字使用時需要注意下)
bind(int sockfd, struct sockaddr*addr, int addrlen);
繫結本地位址與埠
主要說下struct sockadd這個結構體。
這是個通用位址結構
struct sockaddr
;其實在實際使用中並不直接用通用位址來傳遞或繫結ip與埠資訊。
而是使用
internet協議位址結構來儲存
struct sockaddr_in;其中
struct in_addr
;然後將此型別強制轉化為struct sockaddr *型別
而這裡又要涉及到ip位址如何由點分十進位制轉化為u32網路位址
unsigned long inet_addr(char *address);
struct in_addr addr;
addr.s_addr = inet_addr("192.168.1.100");
將u32網路位址轉化為char *
char * inet_ntoa(struct in_addr address);
對於埠的轉化又要牽扯到位元組序問題
因為不同cpu的主機中,記憶體儲存多位元組整數序列有兩種方法,稱為主機位元組序(hbo):
小端序.低序位元組儲存在低位址。將低位元組儲存在起始位址。intel,amd
大端序:高序位元組儲存在低位址。將高位元組儲存在起始位址。arm,motorola
而網路中傳輸的資料必須按網路位元組序,即大端位元組序(nbo)
故在大部分pc機上,當應用程序將整數送入socket前,需要轉化成網路位元組序;當應用程序從socket取出整數後,要轉化成小端位元組序。
由主機位元組序轉化為網路位元組序的函式:
u_long htonl(u_long hostlong);
u_short htons(u_short short);
由網路位元組序到主機位元組序
u_long ntohl(u_long hostlong);
u_short ntohs(u_short short);
將字串轉化為整形又要用到atoi函式
由此有人或許要問為什麼ip位址不需要轉化位元組序:這是因為inet_addr函式本身就已經對位元組序進行了轉化,而inet_ntoa也在轉化為字串時將網路位元組序轉化為本機位元組序。
關於_u32和ip位址的轉換問題:
static unsigned char *ip_address = "\xc0\xa8\x00\x01";
if(sock_buff->nh.iph->saddr == *(unsigned int*)ip_address)
sock_buff->nh.iph->saddr是_u32型別的。將十進位制點ip位址轉換時,只需將其以unsigned char*儲存。然後用(unsigned int * )強制轉換。
lombok使用時一些注意事項
lombok常用註解 data 自動生成get,set,tostring,equals,hashcode方法 allargsconstructor 有參構造 noargsconstructor 無參構造 equalsandhashcode callsuper true 在生成equals,hashc...
關於套接字的一些概念
1.套接字是引用網路連線的特殊的檔案描述符,他有三個基本要素組成 網路型別 資料傳輸型別 採用的網路協議。套接字有三種不同的型別 流套接字 原始套接字 資料報套接字 2.說明面向連線的套接字服務端程式設計的基本步驟 1 建立乙個包含採用的網路型別 資料傳輸型別 協議型別的本地套接字物件,並將其與伺服...
finally在使用時的一些注意點記錄
1.finally是用於釋放資源的關鍵字,常用於io流操作和資料庫操作中 2.finally一定會執行,除非在執行之前使用退出jvm虛擬機器的操作 3.finally執行前,如果使用了return語句,按道理來說,應該是方法都已經返回了,不會執行的,但事實上,在執行return語句時,在完全執行完之...