WinSocket程式設計筆記(五)

2022-04-29 15:21:11 字數 3137 閱讀 2012

三.udp的socket程式設計

先前的socket伺服器端與客戶端需要建立連線才能通訊,因此是面向連線的基於tcp的socket。而這裡的基於udp的socket是面向無連線的,也就是說不必呼叫 listen() 和 accept() 函式,那麼connect()函式也就一樣沒有使用的必要了。

udp新增的函式:

1.傳送資料sendto() 函式(相比send()函式多了最後面兩個引數)

函式原型:

int sendto(int s, const

void * buf, int len, unsigned int flags, const

struct sockaddr * to, int addrlen);

定義例項:

sendto(sock, buffer, strlen(buffer), 0, (struct sockaddr*)&servaddr, sizeof(servaddr));
2.接收資料recvfrom() 函式

函式原型:

int recvfrom(socket sock, char *buf, int nbytes, int flags, const

struct sockaddr *from, int *addrlen);

定義例項:

recvfrom(sock, buffer, buf_size, 0, &clntaddr, &nsize);

伺服器:

#include #include

#include

#include

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

using

namespace

std;

const

int port = 8000

;#define buf_size 100

intmain()

socket listensocket = socket(af_inet,sock_stream,0

);sockaddr_in listenaddr;

listenaddr.sin_family=af_inet;

listenaddr.sin_addr.s_un.s_addr=inaddr_any;

listenaddr.sin_port=htons(port);

intn;

n=bind(listensocket,(lpsockaddr)&listenaddr,sizeof

(listenaddr));

if(n==socket_error)

else

//接收客戶端

sockaddr clntaddr; //

客戶端位址資訊

int nsize = sizeof

(sockaddr);

char buffer[buf_size]; //

緩衝區while(1

)closesocket(listensocket);

wsacleanup();

return(0

);}

客戶端:

#include #include

#include

#include

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

using

namespace

std;

const

int port = 8001

;#define buf_size 100

intmain()

socket listensocket = socket(af_inet,sock_stream,0

);sockaddr_in listenaddr;

listenaddr.sin_family=af_inet;

listenaddr.sin_addr.s_un.s_addr=inaddr_any;

listenaddr.sin_port=htons(port);

intn;

n=bind(listensocket,(lpsockaddr)&listenaddr,sizeof

(listenaddr));

if(n==socket_error)

else

//伺服器位址資訊

sockaddr_in servaddr;

memset(&servaddr, 0, sizeof(servaddr)); //

每個位元組都用0填充,可省略

servaddr.sin_family =pf_inet;

servaddr.sin_addr.s_addr = inet_addr("

127.0.0.1");

servaddr.sin_port = htons(1234

);

//不斷獲取使用者輸入並傳送給伺服器,然後接受伺服器資料

sockaddr fromaddr;

int addrlen = sizeof

(fromaddr);

while(1

); printf(

"input a string: ");

gets(buffer);

sendto(listensocket, buffer, strlen(buffer),

0, (struct sockaddr*)&servaddr, sizeof

(servaddr));

recvfrom(listensocket, buffer, buf_size,

0, &fromaddr, &addrlen);

cout

<

message from server:"}

closesocket(listensocket);

wsacleanup();

return(0

);}

伺服器端接收到客戶端資訊以後發回給客戶端,客戶端列印接收到的訊息

執行結果

(待續)

WinSocket程式設計筆記(三)

二.kerberos協議的實現 現有alice as tgs bob,實現alice和bob的安全金鑰交換 這裡只實現alice和as之間的通訊 我把各個部分的 拆開來寫 1.隨機會話金鑰生成 include include using namespace std intmain 2.加密演算法 i...

WinSocket程式設計筆記(一)

前言 注 以下 都以c 環境為例 一.windows socket 基礎 windows socket dll的初始化和釋放函式的呼叫方法 windows socket 網路程式設計思路 1.初始化 windows socket 2.建立socket 3.將socket與位址結構繫結 4.傳送 接收...

winsocket程式設計例項

include include void main if lobyte wsadata.wversion 1 hibyte wsadata.wversion 1 socket socksrv socket af inet,sock stream,0 sockaddr in addrsrv addrs...