socket通過以下3個屬性分類:域、連線型別和協議。
域包括unix檔案域和網際網路域等。
連線型別用來區分是tcp連線還是udp連線。
協議包括http協議、ftp協議等。
(其他知識請參考計算機網路相關教材)
建立socket
int socket(int domain, int type, int protocol);
domain可以為以下值:
af_unix unix檔案域套接字
af_inet internet域套接字
type可以為以下值:
sock_stream tcp連線
sock_dgram udp連線
protocol表明選擇哪種協議,一般為0(預設協議)。
成功則返回檔案描述符,通過對該描述符的讀寫而進行通訊。
失敗返回-1。
位址資訊
對於unix檔案域套接字,位址資訊用以下結構描述:
struct sockaddr_un ;
sun_family的值為af_unix,sun_path為檔名。
對於internet域套接字則用以下結構描述位址資訊:
struct sockaddr_in ;
其中sin_family為af_inet,sin_port為埠號,sin_addr為internet位址。
in_addr結構如下:
struct in_addr ;
該結構用32位整型變數來儲存ip位址。標準ip位址形式可以用inet_addr()
函式轉換成32位整型值。如:
struct sockaddr_in address;
address.sin_addr.s_addr = inet_addr("127.0.0.1");
繫結socket
int bind(int socket, const struct sockaddr *address, size_t address_len);
該函式為描述符socket分配乙個位址address,address_len為位址結構的長度。
成功返回0,失敗返回-1。
建立socket佇列
伺服器程式必須建立乙個佇列來儲存等待處理的請求。
int listen(int socket, int backlog);
該函式為伺服器端得socket建立乙個長度為backlog的佇列。成功返回0,失敗返回-1。
請求連線
int connect(int socket, const struct sockaddr *address, size_t address_len);
客戶端程式向服務程式請求連線,伺服器的位址資訊儲存在address所指向的空間中,
address_len為該段空間的長度。socket為客戶端未繫結的套接字。
成功返回0,失敗返回-1。
接受請求
int accept(int socket, struct sockaddr *address, size_t *address_len);
伺服器端接受請求。socket引數必須是先前呼叫bind()繫結過的,並且必須呼叫過listen(),
使socket擁有待連線佇列。客戶端的位址資訊將會寫入address所指向的空間。address_len
引數必須被設定成所期望的長度。函式返回的時候,address_len會被設定成客戶端位址的
實際長度。如果隊列為空,則accept函式為阻塞。成功返回0,失敗返回-1。
網路資訊
獲取主機資訊:
struct hostent *gethostbyaddr(const void *addr, size_t len, int type);
struct hostent *gethostbyname(const char *name);
其中hostent如下:
struct hostent ;
利用這兩個函式可以通過主機名或ip位址得到主機的網路資訊。
例子:獲取服務資訊
struct servent *getservbyname(const char *name, const char *proto);
struct servent *getservbyport(int port, const char *proto);
proto指明的服務的協議,"tcp"對應於sock_stream(tcp連線),"udp"對應於sock_dgram(udp連線)。
name為服務的名稱,port為埠號。servent結構如下:
struct servent ;
資料報(udp)
int sendto(int sockfd, void *buffer, size_t len, int flags, struct sockaddr *to, socklen_t tolen);
通過sockfd向遠端主機to傳送長度為len的資料報buffer。在一般應用中flags為0。
int recvfrom(int sockfd, void *buffer, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen);
通過sockfd從位址為from的主機讀取長度為len的資料報到buffer中。flags可為0。
例子
socket程式設計總結 1
使用socket寫 主要是要看自己的需求是什麼。如果通訊時,內容很重要就要使tcp方式。如果使用者數太多,可能就要使用udp方式了。在tcp模式下,最簡單的方式就是這樣的,使阻塞方式 服務端 1.初始化socket環境,建立socket 2.梆定乙個埠 3.開始監聽 4.接收客戶端 5.接收到客戶端...
socket程式設計API總結
一 注釋 1.cpp view plain copy include include include include include include include include define servport 3333 define backlog 10 define max connected...
Socket網路程式設計總結
1.sockaddr結構體 sockaddr結構體包含了網路位址和埠的一些資料。以下三個函式實現了字串轉sockaddr結構體的功能。1 int inet aton const char strptr,struct in addr addrptr 2 in addr t inet addr cons...