概念:
1.服務端將乙個套接字繫結指定ip位址和埠,並通過此套接字等待監聽客戶端的連線請求。
2.客戶端傳送請求給服務端
3.服務端接受請求
4.客戶端和服務端通過讀寫套接字實現通訊
int sock=socket(pf_inet, sock_stream, ipproto_tcp))(建立套接字):
servaddr.sin_family = af_inet;//位址簇
servaddr.sin_port = htons(5188);//伺服器端口
servaddr.sin_addr.s_addr = inet_addr("192.168.73.129");//伺服器位址
int con=connect(sock, (struct sockaddr*)&servaddr, sizeof(servaddr)) (客戶端連線函式)
con<0:連線失敗 con>0:連線成功
setsockopt(listenfd, sol_socket, so_reuseaddr, &on, sizeof(on))(套接字選項函式)
引數1:服務端套接字型大小
引數2: level:選項定義的層次;目前僅支援sol_socket和ipproto_tcp層次。
引數3: optname:需設定的選項。
(bool)so_reuseaddr 允許套介面和乙個已在使用中的位址**(參見bind())
so_broadcast 允許套介面傳送廣播資訊。
so_debug 記錄除錯資訊。
so_dontliner 不要因為資料未傳送就阻塞關閉操作。設定本選項相當於將so_linger的l_onoff元素置為零。
so_dontroute 禁止選徑;直接傳送。
so_keepalive 傳送「保持活動」包。
so_linger 如關閉時有未傳送資料,則逗留。
so_oobinline 在常規資料流中接收帶外資料。
so_rcvbuf 為接收確定緩衝區大小。
…引數4: optval:指標,指向存放選項值(引數3)的緩衝區。
引數5:optlen:optval緩衝區的長度。
int b=bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr))(服務端繫結函式)
int lis=listen(listenfd, somaxconn) (服務端監聽函式)
引數1:服務端套接字型大小
引數2:此套接字維護的最大連線個數,包括「未完成連線佇列–未完成3次握手」、「已完成連線佇列–已完成3次握手,建立連線」。大多數系統預設值為20。
lis<0:監聽失敗 lis>0:監聽成功
int ack = accept(listenfd, (struct sockaddr*)&peeraddr, &peerlen))(服務端接受函式)
其中: struct sockaddr_in peeraddr;
socklen_t peerlen = sizeof(peeraddr);
引數1:服務端套接字型大小
引數2:客戶端位址結構體(客戶端ip和埠資訊)
引數3:客戶端位址結構體大小
ack返回值對應客戶端套接字型大小 -1為錯誤情況。
客戶端操作:
1.建立socket得到客戶端套接字型大小(socket)
2.設定服務端的ip和埠的結構體
3.呼叫connect函式連線服務端(connect)
服務端操作:
1.建立socket得到客戶端套接字型大小(socket)
2.設定服務端的ip和埠的結構體
3.設定套接字選項函式(setsockopt)
4.呼叫繫結函式繫結ip和埠(bind)
5.實現伺服器的監聽(listen)
6.接受客戶端的連線請求(accept) 返回客戶端的套接字型大小
1.客戶端程式
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define err_exit(m) \
do while(0)
//while(0)只執行一次 當遇到err_exit執行後面do裡的函式
void
handler
(int sig)
intmain()
;while(1
)fputs
(recvbuf,
stdout);
}printf
("child close\n");
close
(sock)
;kill
(getppid()
, sigusr1);}
else
;while
(fgets
(sendbuf,
sizeof
(sendbuf)
,stdin)!=
null
)printf
("parent close\n");
close
(sock);}
close
(sock)
;return0;
}
2.服務端程式
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define err_exit(m) \
do while(0)
void
handler
(int sig)
intmain()
;while
(fgets
(sendbuf,
sizeof
(sendbuf)
,stdin)!=
null
)printf
("child close\n");
exit
(exit_success);}
else
fputs
(recvbuf,
stdout);
}close
(conn)
;close
(listenfd)
;return0;
}
對於sockte簡單的理解與整理
建立套接字 intserv sock socket af inet sock stream ipproto tcp 第乙個引數指定應用程式使用的通訊協議的協議族,對於tcp ip協議族,該引數置 af inet 第二個引數指定要建立的套接字型別,流套接字型別為 sock stream 資料報套接字型...
python網路程式設計 TCP網路程式設計
tcp程式設計 客戶端 import socket 1 套接字 tcp socket socket.socket socket.af inet,socket.sock stream 2 建立鏈結 tcp socket.connect 172.27.35.1 8080 3 傳送資訊 tcp socke...
網路程式設計 網路基礎
1.物理層 提供建立 維護和拆除物理鏈路所需的機械 電氣 功能和規程的特性 提供有關在傳輸介質上傳輸非結構的位流及物理鏈路故障檢測指示。在這一層,資料還沒有被組織,僅作為原始的位流或電氣電壓處理,單位是位元。常用協議 eia tia rs 232 eia tia rs 449 v.35 rj 45 ...