網路程式設計有固定的模型和一定數量的函式,其實只要將模型整理出來,就可以做到程式設計游刃有餘。以下是筆者自己整理的模型,希望能夠起到拋磚引玉的作用。
客戶端模型
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參考模型的高層,為使用者提供所需要的...