tcp ip網路程式設計一般模型

2021-06-26 21:02:51 字數 3094 閱讀 6110

網路程式設計有固定的模型和一定數量的函式,其實只要將模型整理出來,就可以做到程式設計游刃有餘。以下是筆者自己整理的模型,希望能夠起到拋磚引玉的作用。

客戶端模型

1 用socket建立套接字

2 用connect來連線伺服器

3 用send和recv傳送和接受資料

1 socket函式引數

socket sclient;

sclient=socket(int af, int type, int protocol );第乙個引數是位址族,對於tcp/ip型 只能是af_inet;第二個引數是socket型別 sock_stream產生流式套接字 sock_dgram是產生資料報套接字,tcp/ip協議使用scok_stream。第三個引數,特定ipproto_tcp或者0。socket建立成功則返回乙個socket資料型別,若失敗 則返回是invalid_socket。出現失敗時,在乙個多執行緒的環境下,wsacleanup()中止了windows sockets在所有執行緒上的操作。

2 在上述建立套接字後,需要構建伺服器資訊 用到sockaddr_in這個結構體  

例如  sockaddr_in clientservice(伺服器位址結構體); 之後是sockaddr_in結構體的引數

sin_family指代協議族,在socket程式設計中只能是af_inet,sin_port儲存埠號(使用網路位元組順序)htons是將主機位元組格式轉換成網路位元組格式sin_addr儲存ip位址 s_addr按照網路位元組順序儲存ip位址。inet_addr()如果正確執行將返回乙個無符號的長整數型,如果傳入的字串不是乙個合法的ip位址 將返回inaddr_none。

3 connect(引數1,引數2,引數3)作用是將socket套接字連線到sockaddr指定的伺服器上,引數1是之前建立的套接字 即為 sclient。引數2是sockaddr型伺服器,引數3是sockaddr結構長度。發生錯誤時 返回socket_error,然後需要函式closesocket(sclient),wsacleanup結束執行緒操作。

4send(引數1,引數2,引數3,引數4)

引數1是之前建立的套接字 引數2是指向包含要傳送的資料的緩衝區的指標 引數3是所指向的緩衝區的長度。準確的說,應該是所要傳送的資料的長度,因為不是緩衝區的所有資料都要同時傳送。第四個引數是0.

第2個引數相關舉例

①char *sendbuf = "client: sending data test";

iresult = send( connectsocket, sendbuf, (int)strlen(sendbuf), 0 )

②char sendmessage="zhongxingpengyue"; 

ret = send (sclient, (char *)&sendmessage, sizeof(sendmessage), 0)

③int rnt=send(connectsocket,"get\r\n\r\n",strlen("get\r\n\r\n"),0);

返回值 出現錯誤是返回值為 socket_error 依然是closesocket(sclient)

wsacleanup();

④recv(引數1,引數2,引數3,引數4)

char recvbuf[100]; 

recv(sclient,recvbuf,100,0);

recv函式返回其實際copy的位元組數 recv 1是成功 0是對端關閉 -1

伺服器端

①不管是伺服器還是客戶端  都需要初始化winsock庫 也就是

wsadata wsadata;

int iresult = wsastartup(makeword(2, 2), &wsadata);

if (iresult != no_error) (雖然不太懂什麼意思 但是套路 就記住吧)

②建立監聽套接字 依然用socket

slisten=socket(引數1,引數2,引數3)

③繫結 用到bind 將建立好的套接字繫結到某個位址和埠上

bind(socks,const struct sockaddr far*name,int namelen)

第乙個引數是建立的套接字。

第二個引數,指定該套接字的位址資訊,這裡即伺服器的位址資訊,它仍是指向struct sockaddr_in型別的結構體的指標。這個結構體和客戶端呼叫connect函式之前構建伺服器位址資訊的一樣。

第三個引數是位址的資訊的長度。

④監聽連線,使用listen函式。是將制定的套接字設定為監聽模式,如ret=listen(slisten,5)

第乙個引數是要設定為監聽的套接字描述符

第二個引數是等待連線佇列的最大的長度。

⑤接受客戶端的連線請求。使用accept函式來接受客戶端傳送的連線請求。

socket acceptsocket;

sockaddr_in clientaddr;

acceptsocket=accept(listensocket, (sockaddr *)&clientaddr, &clientaddr_bytes)

accept第乙個引數是之前設定的套接字。

第二個引數是個返回值,它指向乙個struct sockaddr型別的結構體的變數,儲存了發起連線的客戶端得ip位址資訊和埠資訊。

第三個引數是乙個返回值,指向整型的變數,儲存了返回位址資訊的長度 此處用length = sizeof(saclient)

⑥是傳送和接受此處與之前的客戶端一樣

char sendmessage="hello client";  傳送資訊給客戶端  

send(sserver,sendmessage,strlen(sendmessage)+1,0);  

char receivemessage[5000];  

nleft = sizeof(receivemessage);  

ptr = (char *)&receivemessage;  

while(nleft>0)  

if (ret == 0) 客戶端已經關閉連線  

nleft -= ret;  

ptr += ret;  

}    

最後關閉全部的accept和sock中socket。closesocket(1),closesocket(2)。

Python網路程式設計的一般步驟

python提供流套接字 tcp 和資料報套接字 udp urlparse模組提供了用於解析url的函式,以及用於url處理的函式。1.伺服器端 要在python中建立具有tcp和流套接字的簡單伺服器,需要使用socket模組。利用該模組包含的函式和類定義,可生成通過網路通訊的程式。建立這個連線需要...

lstm網路一般訓練多少輪 網路運營一般多少錢

網路運營一般多少錢由於市場競爭的加劇,市場環境的變化,常常會出現一些意想不到的市場營銷問題,需要企業進行解決。由於這些問題往往含有大量的不確定因素,因而這些問題的解決必須在全面系統的分析基礎上,採取靈活的對策加以解決。企業全網營銷系統的好壞在與其是否完善。以上給大家介紹了全網營銷系統的四個特點,企業...

Linux網路程式設計 TCP IP模型

一 tcp ip四層模型 tcp ip是一組用於實現網路互連的通訊協議。internet網路體系結構以tcp ip為核心。基於tcp ip的參考模型將協議分成四個層次,它們分別是 網路訪問層 網際互聯層 傳輸層 主機到主機 和應用層。1.應用層 應用層對應於osi參考模型的高層,為使用者提供所需要的...