基本結構
在windows/linux下有下面結構:
sockaddr結構
|
1
2
3
4
structsockaddr{
unsignedshortsa_family;/*addressfamily,AF_xxx*/
charsa_data[14];/*14bytesofprotocoladdress*/
};
|
|
sa_family是地址家族,一般都是“AF_xxx”的形式。通常大多用的是都是AF_INET,代表TCP/IP協議族。
sa_data是14字節協議地址。
此數據結構用做bind、connect、recvfrom、sendto等函數的參數,指明地址信息。但一般編程中并不直接針對此數據結構操作,而是使用另一個與sockaddr等價的數據結構
sockaddr_in(在netinet/in.h中定義):
|
1
2
3
4
5
6
structsockaddr_in{
shortsin_family;/*Addressfamily一般來說AF_INET(地址族)PF_INET(協議族)*/
unsignedshortsin_port;/*Portnumber(必須要采用 網絡數據 格式,普通數字可以用htons()函數轉換成網絡數據格式的數字)*/
structin_addrsin_addr;/*Internetaddress*/
unsignedcharsin_zero[8];/*Samesizeasstructsockaddr沒有實際意義,隻是為了 跟SOCKADDR結構在内存中對齊*/
};
|
|
(在ws2def.h中定義):
|
1
2
3
4
5
6
7
8
9
10
structsockaddr_in{
#if(_WIN32_WINNT<0x0600)
shortsin_family;
# else //(_WIN32_WINNT<0x0600)
ADDRESS_FAMILYsin_family;
#endif//(_WIN32_WINNT<0x0600)
USHORTsin_port;
IN_ADDRsin_addr;
CHARsin_zero[8];
}
|
|
在linux下:
in_addr結構
|
1
2
3
typedefstructin_addr{
unsignedlongs_addr;
};
|
|
在windows下:
|
1
2
3
4
5
6
7
typedefstructin_addr{
union {
struct{unsignedchars_b1,s_b2,s_b3,s_b4;}S_un_b;
struct{unsignedshorts_w1,s_w2;}S_un_w;
unsignedlongS_addr;
}S_un;
}IN_ADDR;
|
|
更多參考:in_addr
參數說明
sin_family指代協議族,在socket編程中隻能是AF_INET
sin_port存儲端口号(使用網絡字節順序),在linux下,端口号的範圍0~65535,同時0~1024範圍的端口号已經被系統使用或保留。
sin_addr存儲IP地址,使用in_addr這個數據結構
sin_zero是為了讓sockaddr與sockaddr_in兩個數據結構保持大小相同而保留的空字節。
s_addr按照網絡字節順序存儲IP地址
sockaddr_in和sockaddr是并列的結構,指向sockaddr_in的結構體的指針也可以指向
sockaddr的結構體,并代替它。也就是說,你可以使用sockaddr_in建立你所需要的信息,
然後用memset函數初始化就可以了memset((char*)&mysock,sizeof(mysock));//初始化
sockaddr_in mysock;
memset((char*)&mysock,sizeof(mysock));
mysock.sin_family=AF_INET;
mysock.sin_port=htons(1234);//1234是端口号
mysock.sin_addr.s_addr=inet_addr("192.168.0.1");
相關函數:inet_addr, inet_aton, inet_ntoa, htonl, htons, MAKEWORD, WSASocket, WSAHtons……
服務端:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
intmain()
{
//創建socket
intsockfd=socket(PF_LOCAL,SOCK_DGRAM,0);
if(sockfd==-1)
perror("創建socket失敗"), exit (-1);
//準備通信地址
structsockaddr_unaddr;
addr.sun_family=PF_UNIX;
strcpy(addr.sun_path,"a.sock");
//綁定
int res =bind(sockfd,(structsockaddr*)&addr,sizeof(addr));
if(res==-1)perror("綁定失敗"),exit(-1);
printf("綁定成功n");
//通信(用讀寫文件方式)
charbuf[100]={};
read (sockfd,buf,sizeof(buf));
printf("收到信息:%sn",buf);
//關閉socket
close (sockfd);
return0;
}
|
|
客戶端:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
intmain()
{
intsockfd=socket(PF_LOCAL,SOCK_DGRAM,0);
if(sockfd==-1)
perror("創建socket失敗"),exit(-1);
structsockaddr_unaddr;
addr.sun_family=PF_UNIX;
strcpy(addr.sun_path,"a.sock");
//連接
intres=connect(sockfd,(structsockaddr*)&addr,sizeof(addr));
if(res==-1)perror("失敗"),exit(-1);
printf("成功n");
write (sockfd,"Hello,Socket!",14);
close(sockfd);
return0;
}
|
|
相關詞條
相關搜索
其它詞條