前面說到的進(jìn)程間的通信,所通信的進(jìn)程都是在同一臺計(jì)算機(jī)上的,而使用socket進(jìn)行通信的進(jìn)程可以是同一臺計(jì)算機(jī)的進(jìn)程,也是可以是通過網(wǎng)絡(luò)連接起來的不同計(jì)算機(jī)上的進(jìn)程。通常我們使用socket進(jìn)行網(wǎng)絡(luò)編程,這里將會簡單地講述如何使用socket進(jìn)行簡單的網(wǎng)絡(luò)編程。
一、什么是socket
socket,即套接字是一種通信機(jī)制,憑借這種機(jī)制,客戶/服務(wù)器(即要進(jìn)行通信的進(jìn)程)系統(tǒng)的開發(fā)工作既可以在本地單機(jī)上進(jìn)行,也可以跨網(wǎng)絡(luò)進(jìn)行。也就是說它可以讓不在同一臺計(jì)算機(jī)但通過網(wǎng)絡(luò)連接計(jì)算機(jī)上的進(jìn)程進(jìn)行通信。也因?yàn)檫@樣,套接字明確地將客戶端和服務(wù)器區(qū)分開來。
二、套接字的屬性
套接字的特性由3個屬性確定,它們分別是:域、類型和協(xié)議。
1、套接字的域
它指定套接字通信中使用的網(wǎng)絡(luò)介質(zhì),最常見的套接字域是AF_INET,它指的是Internet網(wǎng)絡(luò)。當(dāng)客戶使用套接字進(jìn)行跨網(wǎng)絡(luò)的連接時,它就需要用到服務(wù)器計(jì)算機(jī)的IP地址和端口來指定一臺聯(lián)網(wǎng)機(jī)器上的某個特定服務(wù),所以在使用socket作為通信的終點(diǎn),服務(wù)器應(yīng)用程序必須在開始通信之前綁定一個端口,服務(wù)器在指定的端口等待客戶的連接。另一個域AF_UNIX表示UNIX文件系統(tǒng),它就是文件輸入/輸出,而它的地址就是文件名。
2、套接字類型
因特網(wǎng)提供了兩種通信機(jī)制:流(stream)和數(shù)據(jù)報(datagram),因而套接字的類型也就分為流套接字和數(shù)據(jù)報套接字。這里主要講流套接字。
流套接字由類型SOCK_STREAM指定,它們是在AF_INET域中通過TCP/IP連接實(shí)現(xiàn),同時也是AF_UNIX中常用的套接字類型。流套接字提供的是一個有序、可靠、雙向字節(jié)流的連接,因此發(fā)送的數(shù)據(jù)可以確保不會丟失、重復(fù)或亂序到達(dá),而且它還有一定的出錯后重新發(fā)送的機(jī)制。
與流套接字相對的是由類型SOCK_DGRAM指定的數(shù)據(jù)報套接字,它不需要建立連接和維持一個連接,它們在AF_INET中通常是通過UDP/IP協(xié)議實(shí)現(xiàn)的。它對可以發(fā)送的數(shù)據(jù)的長度有限制,數(shù)據(jù)報作為一個單獨(dú)的網(wǎng)絡(luò)消息被傳輸,它可能會丟失、復(fù)制或錯亂到達(dá),UDP不是一個可靠的協(xié)議,但是它的速度比較高,因?yàn)樗⒁恍枰偸且⒑途S持一個連接。
3、套接字協(xié)議
只要底層的傳輸機(jī)制允許不止一個協(xié)議來提供要求的套接字類型,我們就可以為套接字選擇一個特定的協(xié)議。通常只需要使用默認(rèn)值。
三、套接字地址
每個套接字都有其自己的地址格式,對于AF_UNIX域套接字來說,它的地址由結(jié)構(gòu)sockaddr_un來描述,該結(jié)構(gòu)定義在頭文件sys/un.h中,它的定義如下:
struct sockaddr_un{ sa_family_t sun_family;//AF_UNIX,它是一個短整型 char sum_path[];//路徑名 };
新聞熱點(diǎn)
疑難解答