Socket程式設計總結

2021-05-05 22:19:38 字數 2978 閱讀 4769

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...