socket網路程式設計

2021-08-03 23:32:20 字數 3378 閱讀 6894

伺服器端

建立套接字(socket)

繫結套接字(bind)

將套接字設為監聽,準備接收客戶請求(listen)

等待客戶請求的到來,當請求到來後,接受請求,返回乙個對應於此次連線的套接字(accept)用返回的套接字與客戶端進行通訊(send/recv)

返回,等待另一客戶請求關閉套接字

客戶端

建立套接字(socket)

向伺服器發出連線請求(connect)

和伺服器端進行通訊(send/recv)

關閉套接字

socket():

socket函式是一種可用於根據指定的位址族、資料型別和協議來分配乙個套介面的描述字及其所用的資源的函式。

ocket()函式用於根據指定的位址族、資料型別和協議來分配乙個套介面的描述字及其所用的資源。如果協議protocol未指定(等於0),則使用預設的連線方式。

對於使用一給定位址族的某一特定套介面,只支援一種協議。但位址族可設為af_unspec(未指定),這樣的話協議引數就要指定了。協議號特定於進行通訊的「通訊域」。

支援下述型別描述:

sock_stream 提供有序的、可靠的、雙向的和基於連線的位元組流,使用帶外資料傳送機制,為internet位址族使用tcp。

sock_dgram 支援無連線的、不可靠的和使用固定大小(通常很小)緩衝區的資料報服務,為internet位址族使用udp。

sock_stream型別的套介面為全雙向的位元組流。對於流類套介面,在接收或傳送資料前必需處於已連線狀態。用connect()呼叫建立與另一套介面的連線,連線成功後,即可用send()和recv()傳送資料。當會話結束後,呼叫close()。帶外資料根據規定用send()和recv()來接收。

實現sock_stream型別套介面的通訊協議保證資料不會丟失也不會重複。如果終端協議有緩衝區空間,且資料不能在一定時間成功傳送,則認為連線中斷,其後續的呼叫也將以wsaetimeout錯誤返回。

sock_dgram型別套介面允許使用sendto()和recvfrom()從任意埠傳送或接收資料報。如果這樣乙個套介面用connect()與乙個指定埠連線,則可用send()和recv()與該埠進行資料報的傳送與接收。

#include

int connect(int sockfd, const

struct sockaddr*

server_addr, socklen_t addrlen)

// 返回:0──成功, -1──失敗。

引數sockfd

指定資料傳送的套接字,解決從**傳送的問題。核心需要維護大量io通道,所以使用者必需通過這個引數告訴核心從哪個io通道,此處就是從哪個socket介面中傳送資料。sockfd是先前socket返回的值。

引數server_addr

指定資料傳送的目的地,也就是伺服器端的位址。這裡伺服器是針對connect說的,因為connect是主動連線的一方呼叫的,所以相應的要存在乙個被連線的一方,被動連線的一方需要呼叫listen以接受connect的連線請求,如此被動連線的一方就是伺服器了。

引數addrlen

指定server_addr結構體的長度。我們知道系統中存在大量的位址結構,但socket介面只是通過乙個統一的結構來指定引數型別,所以需要指定乙個長度,以使核心在進行引數複製的時候有個有個界限。

accept():

socket accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

引數 sockfd:套接字描述符,該套介面在listen()後監聽連線。

addr:(可選)指標,指向一緩衝區,其中接收為通訊層所知的連線實體的位址。addr引數的實際格式由套介面建立時所產生的位址族確定。

addrlen:(可選)指標,輸入引數,配合addr一起使用,指向存有addr位址長度的整型數。

ssock = accept(psv->sv_sock, (struct sockaddr *)&fsin, &alen);

select():

#include 

intselect( int nfds, fd_set far* readfds, fd_set * writefds, fd_set * exceptfds, const

struct timeval * timeout);

用select就可以完成非阻塞(所謂非阻塞方式non-block,就是程序或執行緒執行此函式時不必非要等待事件的發生,一旦執行肯定返回,以返回值的不同來反映函式的執**況,如果事件發生則與阻塞方式相同,若事件沒有發生則返回乙個**來告知事件未發生,而程序或執行緒繼續執行,所以效率較高)方式工作的程式

#include 

#include

#include

intselect(nfds, readfds, writefds, exceptfds, timeout)

int nfds;

fd_set *readfds, *writefds, *exceptfds;

struct timeval *timeout;

nfds:select監視的檔案控制代碼數,視程序中開啟的檔案數而定,一般設為你要監視各檔案

中的最大檔案號加一。(注:nfds並非一定表示監視的檔案控制代碼數。官方文件僅指出nfds is the highest-numbered file descriptor in any of the three sets, plus 1. (可在linux環境中通過man select命令查得))

readfds:select監視的可讀檔案控制代碼集合。

writefds: select監視的可寫檔案控制代碼集合。

exceptfds:select監視的異常檔案控制代碼集合。

timeout:本次select()的超時結束時間。(見/usr/sys/select.h,可精確至百萬分之一秒!)

當readfds或writefds中映象的檔案可讀或可寫或超時,本次select()

就結束返回。程式設計師利用一組系統提供的巨集在select()結束時便可判

斷哪一檔案可讀或可寫,對socket程式設計特別有用的就是readfds。

fd_zero(fd_set *fdset):清空fdset與所有檔案控制代碼的聯絡。

fd_set(int fd, fd_set *fdset):建立檔案控制代碼fd與fdset的聯絡。

fd_clr(int fd, fd_set *fdset):清除檔案控制代碼fd與fdset的聯絡。

fd_isset(int fd, fd_set *fdset):檢查fdset聯絡的檔案控制代碼fd是否

可讀寫,當》0表示可讀寫。

所以乙個fd_isset(sockfd)就相當通知了sockfd可讀。

網路程式設計 Socket程式設計

一 網路部分 1.ip 2.埠號 在網路協議中使用埠號識別主機上不同的程序,不同的埠對應於不同的服務 應用程式 3.協議 tcp二 socket部門socket通訊基本流程圖 根據socket通訊基本流程圖,總結通訊的基本步驟 伺服器端 第一步 建立乙個用於監聽連線的socket對像 第二步 用指定...

socket網路程式設計

首先認識乙個表示主機資訊的結構體 struct hostent h addrtype 這是表示主機所使用的位址型別的定義,在c語言winsock2.h標頭檔案中以 af 開頭的巨集定義就是它的值。如果使用的是ipv4,則值為 af inet 如果是ipv6,值為 af inet4 h length ...

Socket網路程式設計

socket 網路程式設計 在c free中建立乙個對話方塊工程,取名socket1,建立如下檔案結構 main.h ifndef main h define main h include bool winapi main proc hwnd hwnd,uint umsg,wparam wparam...