socket程式設計

2021-10-08 01:21:42 字數 4365 閱讀 2421

文章參考socket教程及《linux高效能伺服器程式設計》

客戶端採用int socket(int domain, int type, int protocal)函式建立乙個套接字;

其中第乙個引數domain指定協議族(ipv4/ipv6);

第二個引數type指定服務型別(sock_stream/sock_ugram分別對應tcp和udp);

第三個引數一般預設為0。

#include

#include

intmain()

printf

("socket is %d\n"

, server_socket)

;return0;

}

在步驟1中僅僅建立了基於ipv4及tcp協議的socket,但並沒有指定該socket的位址,也即沒有命名。這裡採用int bind(int sockfd, const stuct sockaddr *my_addr, socklen_t addrlen)函式來給1中建立的socket繫結乙個socket位址;

其中第乙個引數sockfd表示socket檔案的描述符,也即步驟1中返回的server_socket;

第二個引數表示socket所要繫結的位址,是乙個結構體;

第三個引數表示socket位址的長度,也即sizeof(my_addr)。

#include

#include

// exit

#include

#include

// sockaddr_in

#include

intmain

(int argc,

char

*ar**)

printf

("socket is %d\n"

, server_socket)

;struct sockaddr_in address;

memset

(&address,0,

sizeof

(address));

address.sin_family = af_inet;

// ipv4

address.sin_port =

htons

(server_port)

;// 伺服器端口號,轉換為網路序

address.sin_addr.s_addr =

inet_addr

(server_ip)

;// 繫結server_socket到address上if(

bind

(server_socket,

(struct sockaddr*

)&address,

sizeof

(address))==

-1)printf

("bind ok\n");

return0;

}

建立完socket並繫結位址後,socket進入監聽狀態,使用int listen(int sockfd, int backlog)函式建立乙個監聽佇列以存放待處理的客戶連線,將套接字sockfd指定為被監聽的socket;

其中第乙個引數sockfd為socket檔案描述符;

第二個引數表示核心監聽佇列的最大長度;

成功返回0,失敗返回-1。

#include

#include

#include

#include

// sockaddr_in

#include

intmain()

printf

("socket is %d\n"

, server_socket)

;struct sockaddr_in address;

memset

(&address,0,

sizeof

(address));

address.sin_family = af_inet;

// ipv4

address.sin_port =

htons

(server_port)

;// 伺服器端口號,轉換為網路序

address.sin_addr.s_addr =

inet_addr

(server_ip)

;// 繫結server_socket到address上if(

bind

(server_socket,

(struct sockaddr*

)&address,

sizeof

(address))==

-1)printf

("bind ok\n");

// 監聽server_socketif(

listen

(server_socket,5)

==-1)

printf

("listen ok\n");

return0;

}

當伺服器端socket建立完成後,就可以接受來自客戶端的連線請求,呼叫int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)函式;

第乙個引數sockfd表示listen指定的監聽socket;

第二個引數addr表示客戶端的位址;

第三個引數addrlen表示客戶端位址的長度;

成功返回乙個新的連線socket,該socket唯一標示了接受的新連線,後續雙方可以利用已連線套接字進行通訊;失敗返回-1。

#include

#include

#include

#include

// sockaddr_in

#include

intmain()

printf

("socket is %d\n"

, server_socket)

;struct sockaddr_in address;

memset

(&address,0,

sizeof

(address));

address.sin_family = af_inet;

// ipv4

address.sin_port =

htons

(server_port)

;// 伺服器端口號,轉換為網路序

address.sin_addr.s_addr =

inet_addr

(server_ip)

;// 繫結server_socket到address上if(

bind

(server_socket,

(struct sockaddr*

)&address,

sizeof

(address))==

-1)printf

("bind ok\n");

// 監聽server_socketif(

listen

(server_socket,5)

==-1)

printf

("listen ok\n");

// 客戶機位址

struct sockaddr_in client_addr;

socklen_t client_addr_len =

sizeof

(client_addr)

;printf

("等待連線中...\n");

int connfd =

accept

(server_socket,

(struct sockaddr*

)&client_addr,

&client_addr_len);if

(connfd ==-1

)printf

("accept ok\n");

return0;

}

當伺服器端做好接受連線的準備之後,客戶端就可以主動請求連線了,這裡採用int connect(int sockfd, const struct sockaddr *server_addr, socklen_t *addrlen)函式;

第乙個引數sockfd表示socket檔案描述符;

第二個引數server_addr表示伺服器端的位址;

第三個引數addrlen表示伺服器端位址長度;

成功返回0,客戶端利用connect函式連線服務端,如果連線成功後,其第乙個引數sockfd就唯一標示這個連線;失敗返回-1。

socket程式設計

一直以為serversocket accept之後客戶端才能發資訊,實驗後得出如下結論 1 serversocket沒有accept時,client是可以傳送資訊到server端的。2 serversocket accept之後,正在處理訊息時,client也是可以傳送資訊到server端。如果se...

Socket程式設計

對tcp ip udp socket程式設計這些詞你不會很陌生吧?隨著網路技術的發展,這些詞充斥著我們的耳朵。那麼我想問 1.什麼是tcp ip udp?2.socket在 呢?3.socket是什麼呢?4.你會使用它們嗎?什麼是tcp ip udp?tcp ip transmission cont...

socket程式設計

建立socket 建立乙個 socket,它可用於在基於 tcp ip 的網路 如 internet 上通訊。socket s new socket addressfamily.internetwork,sockettype.stream,protocoltype.tcp 若要使用 udp 而不是 ...