udp通訊C 實現的細節

2021-09-08 18:35:36 字數 3039 閱讀 7007

在windows/linux下有下面結構:

sockaddr結構

struct sockaddr ;

sa_family是位址家族,一般都是「af_***」的形式。通常大多用的是都是

af_inet,代表tcp/ip協議族。

sa_data是14位元組

協議位址。

此資料結構用做bind、connect、recvfrom、sendto等函式的引數,指明位址資訊。但一般程式設計中並不直接針對此資料結構操作,而是使用另乙個與sockaddr等價的資料結構

sockaddr_in(在netinet/in.h中定義): 1

2

3

4

5

6

7

8

9

10

11

12

13

structsockaddr_in

;

(在ws2def.h中定義): 1

2

3

4

5

6

7

8

9

10

11

structsockaddr_in

(在winsock2.h中定義): 1

2

3

4

5

6

structsockaddr_in ;

在linux下:

in_addr結構 1

2

3

4

5

typedefuint32_t in_addr_t;

structin_addr

;

在windows下: 1

2

3

4

5

6

7

8

typedefstructin_addr

s_un_b;

structs_un_w;

unsignedlongs_addr;

}s_un;

}in_addr;

sin_family指代協議族,在socket程式設計中只能是af_inet

sin_port儲存

埠號(使用網路

位元組順序),在linux下,埠號的範圍0~65535,同時0~1024範圍的埠號已經被系統使用或保留。 s

in_addr儲存ip位址,使用in_addr這個資料結構

sin_zero是為了讓sockaddr與sockaddr_in兩個資料結構保持大小相同而保留的空位元組。

s_addr按照網路位元組順序儲存ip位址

sockaddr_in和sockaddr是並列的結構,指向sockaddr_in的

結構體的

指標也可以指向

sockaddr的結構體,並代替它。也就是說,你可以使用sockaddr_in建立你所需要的資訊,

然後用memset函式初始化就可以了memset((char*)&mysock,0,sizeof(mysock));//初始化

sockaddr_in mysock;

memset((char*)&mysock,0,sizeof(mysock));

mysock.sin_family=af_inet;

mysock.sin_port=htons(1234);//1234是

埠號mysock.s

in_addr.s_addr=inet_addr("192.168.0.1");

相關函式:inet_addr, inet_aton, inet_ntoa, htonl, htons, makeword, wsasocket, wsahtons……

int wsastartup( word wversionrequested, lpwsadata lpwsadata);

wsastartup,即wsa(windows sockets asynchronous,windows非同步

套接字)的啟動命令。是windows下的

網路程式設計介面軟體winsock1 或 winsock2 裡面的乙個命令(ps:winsock 是由unix下的bsd socket發展而來,是乙個與

網路協議無關的程式設計

介面)。

為了在應用程式當中呼叫任何乙個winsock api

函式,首先第一件事情就是必須通過wsastartup函式完成對winsock服務的

初始化,因此需要呼叫wsastartup函式。使用socket的程式在使用socket之前必須呼叫wsastartup函式。該函式的第乙個引數指明程式請求使用的socket版本,其中高位

位元組指明副版本、低位位元組指明主版本;

作業系統利用第二個引數返回請求的socket的版本資訊。當乙個應用程式呼叫wsastartup函式時,作業系統根據請求的socket

C 實現UDP通訊

using system using system.text using system.net using system.net.sockets namespace udptest dns.gethostname 設定服務ip,設定tcp埠號 ipendpoint ip newipendpoint ...

C 通過socket實現UDP 通訊

接下來我們通過乙個簡單的程式看一下udp通訊的過程。服務端程式 using system using system.collections.generic using system.linq using system.text using system.threading.tasks using s...

linux下C 實現UDP通訊

簡要介紹udp原理,通過 例項講解。本篇部落格不強調server跟client 的概念,重在實現雙方互通。收的一方 socket bind recvfrom close 發的一方 socket sendto close 只有收資料的一方需要bind 而傳送的一方不需要bind 由上圖可以看出,bin...