2011-07-29 15:28
482人閱讀
(0)收藏
舉報[cpp]view plain
copy
print?
structsockaddr ;
sockaddr_in和sockaddr結構的關係
填值的時候使用sockaddr_in結構,而作為函式(如socket, listen, bind等)的引數傳入的時候轉換成sockaddr結構就行了,畢竟都是16個字元長。
上面是通用的socket位址,具體到internet socket,用下面的結構,二者可以進行型別轉換 。
[cpp]view plain
copy
print?
structsockaddr_in ;
struct in_addr這個結構就是儲存ip位址。
[cpp]view plain
copy
print?
typedef
structin_addr s_un_b;
structs_un_w;
structs_un;
}
}in_addr;
下面舉例說明一下用法
[cpp]view plain
copy
print?
/*sockadddr_in結構體用作bind、connect、recvfrom、sendto等函式的引數*/
intsockfd;
sockfd = socket(af_inet, sock_stream, 0); //socket函式建立乙個socket,並指定通訊方式。
structsockaddr_in my_addr;
/*為此結構體賦值*/
my_addr.sin_family = af_inet;
my_addr.sin_port = htons(myport); //採用htons函式轉換為網路位元組序
my_addr.sin_addr.s_addr = inet_addr("192.168.0.1"
);
bzero(&(my_addr.sin_zero), 8);
bind(sockfd, (structsockaddr *)&my_addr,sizeof(structsockaddr));
關於上面程式中部分難點的講解。
(1)socket函式
函式原型: socket socket(int af, int type, int protocal);
引數: af: 指代協議簇,在socket程式設計中只能使用af_inet
type:為新的socket指定傳輸型別。在windows scokets只能使用以下兩種型別函式功能:socket函式產生乙個socket描述符,並與所分配的資源相聯絡,和繫結特定的傳輸服務。sock_stream 即tcp
sock_dgram即udp
protocal:用於指定協議簇的特定協議,一般情況下賦值為0 是正確的。
返回值:如果沒有錯誤發生,那麼socket函式將返回乙個指向新socket的描述符。否則,乙個invalid_socket 值返回。
(2)主機位元組序:
不同的cpu有不同的位元組序型別,這些位元組序是指整數在記憶體中儲存的順序,這個叫做主機序。最常見的有兩種 1.little endian:低位元組存高位址,高位元組存低位址 2.big endian:低位元組存低位址,高位元組存高位址
網路位元組序:
網路位元組順序是tcp/ip中規定好的一種資料表示格式,它與具體的cpu型別、作業系統等無關,從而可以保證資料在不同主機之間傳輸時能夠被正確解釋。網路位元組順序採用big endian排序方式。
為了進行轉換bsd socket提供了轉換的函式,有下面四個網路與主機位元組轉換函式:htons ntohs htonl ntohl (s 就是short l是long h是host n是network)
htons 把unsigned short型別從主機序轉換到網路序,htonl 把unsigned long型別從主機序轉換到網路序,ntohs 把unsigned short型別從網路序轉換到主機序,ntohl 把unsigned long型別從網路序轉換到主機序。
在使用little endian的系統中 這些函式會把位元組序進行轉換 在使用big endian型別的系統中這些函式會定義成空巨集。
(3)inet_addr()是將乙個點分制的ip位址(如192.168.0.1)轉換為上述結構中需要的32位ip位址(0xc0a80001)。
sockaddr和sockaddr in的區別
struct sockaddr和struct sockaddr in這兩個結構體用來處理網路通訊的位址。在各種系統呼叫或者函式中,只要和網路位址打交道,就得用到這兩個結構體。1 位址型別 ipv4還是ipv6 2 ip位址 3 埠 相應的,標頭檔案有如下定義 c include struct soc...
sockaddr和sockaddr in的區別
from 初學者很容易對二者有困惑的感覺,下面來講一下二者的區別。sockaddr是在標頭檔案 usr include bits socket.h 中定義的,如下 view source print?1.structsockaddr 2.而sockaddr in是在標頭檔案 usr include ...
SOCKADDR和SOCKADDR IN的區別
二者的占用的記憶體大小是一致的,因此可以互相轉化,從這個意義上說,他們並無區別。sockaddr常用於bind connect recvfrom sendto等函式的引數,指明位址資訊。是一種通用的套接字位址。而sockaddr in 是internet環境下套接字的位址形式。所以在網路程式設計中我...