socket:
tcp/ip協議中乙個埠號和乙個ip位址繫結在一起就生成乙個socket就表示了網路中唯一的乙個程序,它是全雙工的工作方式。
基於tcp的socket程式設計
函式的使用:
1、socket()
#include /* see notes */
#include int socket(int domain, int type, int protocol);
socket它用於建立乙個套接字,返回值是乙個檔案描述符。
domin表示該套接字網路層所用的協議,因為我們用的是ipv4協議,所以這裡填af_inet。
type表示該套接字傳輸層使用什麼模式傳輸,tcp是位元組流的,所以這裡填sock_stream。
protocol填寫為0,系統會根據你之前的引數把它設定為相應字段,比如我們引數設定為af_inet,sock_stream,0,後面的0會自動設定為ipproto_tcp。
2、bind()
#include /* see notes */
#include int bind(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
sockfd就是套接字
struct sockaddr:首先需要認識下面兩個結構體struct sockaddr_in 和struct sockaddr_un。
通常情況下習慣於用sockaddr_in結構體來填充ip和埠號字段然後強轉為struct sockaddr。
struct sockaddr_in
;
3、網路位元組序:
一台主機有大小端模式而在網路中傳輸資料的時候需要遵循一定的規則,即傳送端從地位址開始傳送,接收端從低位址開始接受,如果兩台主機的大小端模式不一樣,那麼就會導致資料的錯亂,tcp/ip協議中規定網路資料流應該採用大段的位元組序,即高位址高位。為了方便就有了一系列轉化的函式方便使用。
#include uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
//上面這些函式用於將埠號轉化為大端模式
//下面的多用於將ip位址字串轉化為大端模式
#include #include #include int inet_aton(const char *cp, struct in_addr *inp);
in_addr_t inet_addr(const char *cp);
in_addr_t inet_network(const char *cp);
char *inet_ntoa(struct in_addr in);
struct in_addr inet_makeaddr(int net, int host);
in_addr_t inet_lnaof(struct in_addr in);
in_addr_t inet_netof(struct in_addr in);
4、listen()
#include /* see notes */
#include int listen(int sockfd, int backlog);
listen的作用主要是用來將當前已經繫結的套接字設定為監聽狀態,保持乙個listen的狀態
backlog的作用是用來設定當前最多能允許多少遠端套接字在監聽佇列中排隊。
5、accept()
#include /* see notes */
#include int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
函式中的addr和addrlen即時輸入型引數也是輸出型引數,因為我們要獲取遠端的套接字資訊
6、connect()
#include /* see notes */
#include int connect(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
很顯然這是乙個客戶端需要的乙個函式,它用來鏈結遠端的伺服器。
下面是實現的**:
分了三種形式來實現,一對一,一對多(多程序)和一對多(多執行緒)。
伺服器端:
1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 #include10 #include11 #include12 #include13
14 using namespace std;
15 16 //下面是在多程序下註冊的乙個訊號處理函式,能使得父程序不用
//再阻塞式或者輪詢式的等待子程序的退出,當有子程序退出時會
//傳送sigchld訊號我們捕捉這個訊號後對其**。
17 void hander(int sign)
18 else if(_size<0)else if(_size==0)else if(_size ==0)
44 return 0;
45 }
46
總結:雖然實現了乙個一對多的伺服器,但是弊端是很容易發現的,首先,不管是多執行緒還是多程序的伺服器,它的資源消耗是很大的,再說說多執行緒和多程序的缺點,當連線數目非常大的時候,cpu的排程也會變的很麻煩,雖然說cpu的執行速度非常快,但當成千上萬個程序或者執行緒在執行的時候它也是會吃不消的。
本文出自 「痕跡」 部落格,請務必保留此出處
基於tcp協議的socket
serve服務端 import socket sk socket.socket 例項物件 sk.bind 127.0.0.1 8080 集合內設定ip和埠,利用bind方法 sk.listen 監聽資訊 conn,addr sk.accept 接受到資訊 while true ret conn.re...
基於TCP協議的socket程式設計
什麼是socket socket是應用層與tcp ip協議族通訊的中間軟體抽象層,它是一組介面。在設計模式中,socket其實就是乙個門面模式,它把複雜的tcp ip協議族隱藏在socket介面後面,對使用者來說,一組簡單的介面就是全部,讓socket去組織資料,以符合指定的協議。所以,我們無需深入...
基於TCP協議的socket通訊
一 伺服器端 1 建立serversocket,即伺服器端的socket,繫結指定的埠,並偵聽此埠 serversocket server new serversocket 8888 2 呼叫accept 方法,開始偵聽,等待客戶端的連線,在未連線成功之前,處於阻塞狀態,返回的socket,用於與客...