SOCKTE網路程式設計

2021-10-22 21:17:49 字數 3376 閱讀 8762

概念:

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