Windows網路程式設計

2021-07-26 00:16:53 字數 3295 閱讀 8192

1.先總結一些會用到的知識

中計算機都分配乙個位址,該位址是乙個

32位的數值表示;

客戶端和伺服器通訊的時候需要指定乙個

ip位址

和埠。

ip位址

一般是用「internet標準

點分表示法」

像a.b.c.d

一樣指定

的,每乙個字母代表乙個位元組的數字(

十進位制、八進位制

或十六進製制)

從左到右分配了乙個無符號

長整數的4個

位元組。

unsigned long inet_addr(_in_ const char *cp) :把

乙個點分

ip位址

轉換成乙個32位

的無符號長整數。

網路位元組序:tcp/ip協議中規定好的資料表示方法,順序採用big endian排序方式;

主機位元組序:

主機表示資料的方法,不同的作業系統位元組序不同,有big endian,有的是little endian ;若是主機位元組序與網路位元組序不同,則需

要轉換成一致的位元組序;

轉換位元組序用到的函式:
網路位元組序——主機位元組序                      主機位元組序——網路

位元組序

ntohl                                     htonl

wsantohl

wsahtonl

ntohs htons

wsantohs wsahtons

sockaddr_in結構: 用來指定ip位址

和服務埠資訊。

struct sockaddr_in

2.面向連線的

tcp協議程式設計

1)伺服器端程式

#include#include#include#pragma comment(lib,"ws2_32")//新增庫檔案

using namespace std;

int main()

{ //1.建立套接字(socket)

word version =makeword(2,2);//先確定使用套接字的版本

wsadata wdata;

int erro =wsastartup(version,&wdata);//啟動套接字

if(erro!=0)

{ cout<<"套接字啟動失敗!"<

2.客戶端的程式

#include

#include

#pragma

comment(lib,"ws2_32")

using

namespace std;

int main()

//客戶端

//1.建立套接字

wsadata wsd;

wsd.wversion=makeword(2,2);//確定套接字的版本

int erro;

erro=wsastartup(wsd.wversion,&wsd);

if(erro!=0)

cout<<"套接字啟動失敗!"

cout<<"套接字版本錯誤!"

socket clientsocket = socket(af_inet,sock_stream,0);

sockaddr_in  servadd;

servadd.sin_addr.s_un.s_addr=inet_addr("127.0.0.1");

servadd.sin_family=af_inet;

servadd.sin_port=htons(6000);

//2.向伺服器傳送連線請求(connect)

connect(clientsocket,(sockaddr*)&servadd,sizeof(sockaddr));//套接字,伺服器ip位址,位址結構體的長度

//3.與伺服器通訊(send/recv)

char sendbuf[100],recvbuf[100];

while(1)

sleep(10000);

recv(clientsocket,recvbuf,100,0);

cout<<"receive :"

closesocket(clientsocket);

// wsacleanup();

system("pause");

return 0;

以上是使用tcp協議的簡單程式設計,tcp是

面向連線的通訊,是流協議

,udp是

無連線通訊,

幾乎是基於訊息的

,因此在接收函式的呼叫必須提供乙個足夠大的緩衝

空間,如果緩衝區不夠大,接收呼叫會失敗,出現錯誤

wsaemsgsize

,緩衝區填滿,未接收完的資料會丟棄。

//udp伺服器

#include#include#pragma comment(lib,"ws2_32")

using namespace std;

int main()

{ //伺服器端

//1.建立套接字

dword wversion;

wversion =makeword(2,2);

wsadata wsa;

wsa.wversion=wversion;

int erro=0;

erro= wsastartup(wversion,&wsa);

if(erro!=0)

{ cout<<"套接字啟動失敗!"<

#include#include#pragma comment(lib,"ws2_32")

using namespace std;

int main()

{ //伺服器端

//1.建立套接字

dword wversion;

wversion =makeword(2,2);

wsadata wsa;

wsa.wversion=wversion;

int erro=0;

erro= wsastartup(wversion,&wsa);

if(erro!=0)

{ cout<<"套接字啟動失敗!"《總結。

windows網路程式設計

winsock是windows系統下利用socket套接字進行網路程式設計的相關函式,是windows下的網路程式設計介面。winsock在常見的windows平台上有兩個主要的版本,即winsock1和winsock2。編寫與winsock1相容的程式你需要引用標頭檔案winsock.h,如果編寫...

windows網路程式設計

include include include 要使用winsock api,就要包含ws2 32.lib這個庫 pragma comment lib,ws2 32.lib int main int argc,char ar 為埠號賦值 short port if port atoi ar 1 0 ...

Windows網路程式設計雜談

windows網路程式設計雜談 關於bind inaddr any 的具體含義是,繫結到0.0.0.0。此時,對所有的位址都將是有效的,如果系統考慮冗餘,採用多個網絡卡的話,那麼使用此種bind,將在所有網絡卡上進行繫結。在這種情況下,你可以收到傳送到所有有效位址上資料報。例如 sockaddr i...