套接字使用時候的一些注意

2021-06-05 00:19:43 字數 1838 閱讀 3639

建立套接字

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語句時,在完全執行完之...