1、套接字地址結構:
struct sockaddr {
sa_family_t sa_family;
char sa_data[14];
};
其中,成員sa_family表示套接字的協議族類型,對應於TCP/IP協議該值為AF_INET;成員sa_data存儲具體的協議地址。
sa_data之所以被定義成14個字節,因為有的協議族使用較長的地址格式。一般在編程中並不對該結構體進行操作,
而是使用另一個與它等價的數據結構:sockaddr_in
每種協議族都有自己的協議地址格式,TPC/IP協議族的地址格式為結構體struct sockaddr_in
他在netinet/in.h頭文件中定義。
struct sockaddr_in
{
unsigned short sin_family;
unsigned short sin_port;
struct in_addr sin_addr; /* Internet address. */
unsigned char sin_zero[8];
};
其中成員sin_family表示地址類型,對於使用TCP/IP協議進行的網絡編程,該值只能是AF_INET。
sin_port是端口號,
sin_addr用來存儲32位的ip地址。
數組sin_zero為填充字段,一般賦值為0
結構體struct in_addr的定義如下:
struct in_addr{
unsigned long s_addr;
};
結構體sockaddr 的長度為16個字節,結構體sockaddr_in的長度也為16個字節。通常在編寫基於TCP/IP協議
的網絡程序時,使用結構體sockaddr_in來設置地址,然后通過強制類型轉換成sockaddr 類型。
以下是設置地址信息的示例代碼:
struct sockaddr_in sock;
sock.sin_family = AF_INET ;
sock.sin_port = htons(6000);
sock.sin_addr.s_addr = inet_addr("200.200.3.18");
memset(sock.sin_zero, 0, sizeof(sock.sin_zero));
2、創建套接字
socket函數用來創建一個套接字。
int socket(int domain, int type, int protocol);
參數domain用於指定創建套接字所使用的協議族,
常用的協議族:
AF_UNIX, AF_LOCAL 創建只在本機內進行通信的套接字
AF_INET 使用 IPv4 TCP/IP 協議
AF_INET6 使用 IPv6 TCP/IP 協議
參數type指定套接字的類型,可取如下值:
SOCK_STREAM 創建TCP流套接字
SOCK_DGRAM 創建UDP數據報套接字
SOCK_RAW 創建原始套接字
參數protocol通常設置為0,表示通過參數domain指定的協議族和參數type指定的套接字類型來確定使用的協議。當創建原始
套接字時,系統無法唯一地確定協議,此時就需要使用該參數指定所使用的協議。
---------------------------------------
創建TCP套接字:
int sock_fd;
sock_fd = socket(AF_INET, SOCK_STREAM, 0);
if (sock_fd < 0)
{
perror("socket error:");
exit(1);
}
創建UDP套接字:
int sock_fd;
sock_fd = socket(AF_INET, SOCK_DGRAM, 0);