Socket程式設計入門 二

2022-09-18 05:09:23 字數 2605 閱讀 6032

1.htons()

u_short htons(u_short  hostshort);

功能:把乙個u_short型別的值從主機位元組順序轉換為網路位元組順序

引數:乙個以主機位元組順序表示的16位數值

返回:網路位元組序表示的16位數值

2.htonl()

u_long htonl(u_long  hostlong);

功能:把乙個u_long型別的值從主機位元組序轉換為網路位元組序

引數:乙個以主機自己序表示的32位數值

返回:網路位元組序表示的32位數值

基於udp的資料傳送和接受函式:

3.sendto()

int sendto(socket s,  const  char  far * buf,  int  len,

int  flags,  const  struct  sockaddr  far *  to,  int  tolen);

功能:向乙個特定的目的方傳送資料

引數:第乙個引數是套接字描述符

第二個引數是乙個指向緩衝區的指標,該緩衝區包含要傳送的資料

第三個引數是緩衝區中要傳送的資料的長度,單位是位元組(一般情況下,傳送端從第二個引數指定的起始位址開始傳送這麼多個位元組)

第四個引數是標示,設定函式呼叫的行為

第五個引數是目標套接字的位址,是const sockaddr *型別

第六個引數是第五個引數指定的位址的長度,單位是位元組

返回:當沒有錯誤時,返回實際傳送的位元組個數,可能比第三個引數len指定的位元組數要少

執行失敗返回乙個socket_error

4.recvfrom()

int recvfrom(socket s,  char  far * buf,  int  len,  int  flags,

struct  sockaddr far *  from, int  far * fromlen);

引數:第乙個引數是準備接受資料報的套接字

第二個引數是乙個out型別,指向緩衝區的指標,該緩衝區用來存放接受的資料

第三個引數是緩衝區的長度

第四個引數用來設定函式呼叫的行為

第五個引數是乙個out型別,指向位址結構體的指標,用來儲存傳送方的位址資訊

第六個引數是乙個整型指標,是乙個in/out型別的引數,在呼叫前需要給它指定乙個初始值,當函式呼叫之後,會通過這個引數返回乙個值,返回值是位址結構的大小

返回:如果沒有錯誤傳送,返回實際接受的位元組數

注:sendto()和recvfrom()函式分析

1)char * buf和int len分析

socket的資料傳送和接受傳入的引數型別均是char *型別

傳送方傳入傳送的資料的記憶體起始位址,需要根據傳送的資料是否是char *型別需要強制轉換為char *型別,隨後的引數指明要送的資料長度,需要根據是否傳送的是字串資料進行加1

接收方傳入存放接受的資料的緩衝區起始位址,需要根據這段記憶體起始位址是否為char*型別強制轉換為char *型別,隨後的引數指明這段記憶體的大小(位元組數)

在sendto()這一端,傳入乙個const char *型別引數,隨後的乙個引數指明傳送端要傳送的位元組數

在recvfrom()這一端,傳入乙個char *型別的引數,隨後乙個引數指定這個緩衝區的大小(位元組數),其中char *引數是out型別,用來存放返回值

實際上我們傳入的是乙個一段記憶體的起始位址

當我們傳送和接受乙個字串時,傳入這個字串的起始位址,隨後的指定其長度的引數應為strlen(字串)+1

接收端接受字串時,傳入這個字元陣列的緩衝區的首位址,隨後的引數傳入這個緩衝區的大小(位元組數)

當我們傳送的記憶體不是char *時,我們獲取這段記憶體的首位址,然後強制轉換為char*型別,隨後的引數指定這段記憶體的長度

接收方傳入的緩衝區位址不是char *型別時,將這段緩衝區的起始位址強制轉換為char*型別作為引數傳入

隨後的引數指定這段記憶體的長度(單位是位元組)

程式**如下:

sendto(sockclient, 「hello」, strlen(「hello」)+1, 0,

(sockaddr *)&addrsrv, sizeof(sockaddr));

2)    sockaddr *和int len分析

sendto()和recvfrom()要求的位址結構型別均為sockaddr *型別,而二者定義的均是sockaddr_in型別故傳入時,需要乙個強制型別轉換

sendto()傳入的位址結構是乙個in型別的引數,隨後的引數指明這個位址結構的大小

recvfrom()傳入的位址結構是乙個out型別的引數,作為乙個返回值,儲存傳送方的位址,隨後的引數是乙個in/out型別的引數,是乙個整型的指標,在呼叫前需要給它指定乙個初始值,當函式呼叫之後,會通過這個引數返回乙個值,返回值是位址結構的大小,通常呼叫前設定它的初始值就是位址結構的大小(sizeof(sockaddr))

接受一方的程式**如下:

sockaddr_in addclient;

int len = sizeof(sockaddr_in);

char recvbuf[100];

recvfrom(socksrv, recvbuf, 100, 0, (sockaddr*)&addrclient, &len);

socket程式設計入門(二)

在動手編寫socket通訊程式之前,還需要補充一些可能用到的函式。本文列出這些函式。accept int accept int sockfd,struct sockaddr addr,socklen t addrlen 從已完成連線佇列返回第乙個連線,如果已完成連線隊列為空,則阻塞,失敗返回 1 s...

Socket程式設計入門 一

1.word型別分析 word型別是乙個16位的無符號整型,定義如下 typedef unsigned short word 提供兩個位元組的儲存,在socket中這個兩個位元組可以分別用來表示主版本號和副版本號 2.makeword巨集 word makeword byte blow,byte b...

socket程式設計(二)

標頭檔案 功能 建立乙個套接字用於通訊 原型 int socket int domain,int type,int protocol 引數 domain 指定通訊協議族 protocol family type 指定socket型別,流式套接字sock stream,資料報套接字sock dgram...