網路程式設計函式2

2021-10-21 05:57:38 字數 4446 閱讀 9429

函式accept();send();recv();sendto();recvfrom();close();shutdown();getpeername();gethostname();

函式作用

accept()函式用於等待連線,客戶端從我監聽(listen())的埠連線到我的機器上,他的連線將加入乙個等待連線(accept())佇列中,我呼叫accept()表示有空閒的連線,並在連線後返回乙個新的套接字描述符。

原本的套接字還在監聽埠,新的套接字用於傳送和接受資料。

函式定義

#include

#include

intaccept

(int s,

struct sockaddr * addr,

int* addrlen)

;

原型:

winsock_api_linkage

socket

wsaapi

accept

( socket s,

struct sockaddr far * addr,

int far * addrlen

);

函式說明

accept()用來接受引數s 的socket 連線. 引數s 的socket 必需先經bind()、listen()函式處理過, 當有連線進來時accept()會返回乙個新的socket 處理**, 往後的資料傳送與讀取就是經由新的socket處理, 而原來引數s 的socket 能繼續使用accept()來接受新的連線要求. 連線成功時, 引數addr 所指的結構會被系統填入遠端主機的位址資料, 引數addrlen 為scokaddr 的結構長度.

return

成功返回新的socket套接字描述符,失敗返回-1;錯誤資訊儲存於errno中。

示例**:

#include

#include

#include

#define myport 3490

#define backlog 10

main()

注意

在系統呼叫 send() 和 recv() 中你應該使用新的套接字描述符 new_fd。如果你只想讓乙個連線進來,那麼你可以使用 close() 去關閉原來的檔案描述符sockfd 來避免同乙個埠更多的連線。

函式作用

send() and recv()用於流式套接字或資料報套接字的通訊。

send()函式:

int

send

(int sockfd,

const

void

*msg,

int len,

int flags)

;

sockfd 是你想傳送資料的套接字描述符(或者是呼叫 socket() 或者是accept()返回的)。 msg 是指向你想傳送的資料的指標。len 是資料的長度。 把 flags 設定為 0 就可以了。

返回:

send() 返回實際傳送的資料的位元組數–它可能小於你要求傳送的數目!錯誤時返回-1,並設定errno。

recv()函式:

int

recv

(int sockfd,

void

*buf,

int len,

unsigned

int flags)

;

sockfd 是要讀的套接字描述符。buf 是要讀的資訊的緩衝。len 是緩衝的最大長度flags可以設定為0。(請參考recv() 的 man page) recv() 返回實際讀入緩衝的資料的位元組數。或者在錯誤的時候返回-1, 同時設定 errno。

使用:sendto() 和 recvfrom() 函式用於無連線資料報套接字

函式定義:

sendto():

int

sendto

(int sockfd,

const

void

*msg,

int len,

unsigned

int flags,const

struct sockaddr *to,

int tolen)

;

前四個引數和send()函式一樣,第五個引數to是個指向資料結構 struct sockaddr 的指標,它包含了目的地的 ip 位址和埠資訊。tolen可以簡單地設定為 sizeof(struct sockaddr)。 和函式send()類似,sendto() 返回實際傳送的位元組數(它也可能小於你想要傳送的位元組數!),在錯誤的時候返回 -1。

recvfrom():

int

recvfrom

(int sockfd,

void

*buf,

int len,

unsigned

int flags,

struct sockaddr *from,

int*fromlen)

;

除了兩個增加的引數外,這個函式和 recv() 也是一樣的。from 是乙個指向區域性資料結構 struct sockaddr 的指標,它的內容是源機器的 ip 位址和埠資訊。fromlen 是個 int 型的區域性指標,它的初始值為sizeof(struct sockaddr)。函式呼叫返回後,fromlen 儲存著實際儲存在 from 中的位址的長度

返**到的位元組長度,發生錯誤時返回-1;

使用:close()用於關閉套接字描述符;

close

(sockfd)

;

防止套接字上產生更多的資料讀寫,減少錯誤資訊的產生。

sutdown()比close()功能更加強大一些,它允許關閉單邊通訊或者雙向通訊。

int

shutdown

(int sockfd,

int how)

;

sockfd 是你想要關閉的套接字檔案描述復。how 的值是下面的其中之 一:

0 - 不允許接受

1 - 不允許傳送

2 - 不允許傳送和接受(和close() 一樣)

getpeername()作用:告訴你連線的流式套接字上誰在另一邊。

int

getpeername

(int sockfd,

struct sockaddr *addr,

int*addrlen)

;

sockfd 是連線的流式套接字的描述符。addr 是乙個指向結構 struct sockaddr (或者是 struct sockaddr_in) 的指標,它儲存著連線的另一邊的資訊。addrlen 是乙個 int 型的指標,它初始化為sizeof(struct sockaddr)。 函式在錯誤的時候返回 -1,設定相應的 errno。

一旦你獲得它們的位址,你可以使用inet_ntoa()或者gethostbyaddr()來列印或者獲得更多的資訊

gethostname()作用:

它返回你程式所執行的機器的主機名字。然後你可以使用gethostbyname()以獲得你的機器的ip 位址。

#include

intgethostname

(char

*hostname, size_t size)

;

引數:hostname 是乙個字元陣列指標,它將在函式返回時儲存主機名。size是hostname 陣列的位元組長度。

函式呼叫成功時返回 0,失敗時返回 -1,並設定errno。

網路程式設計的相關函式2

8 大端模式 小端模式 大端模式 低位元組放在低位址,高位元組放在高位址 小端模式 低位元組放在高位址,高位元組放在低位址 位元組序的轉化函式 標頭檔案 include 從主機傳送到網路 uint32 t htonl uint32 t hostin32 32位資料傳送,從主機到網路 uint16 t...

網路程式設計2

1.tcp和udp的區別 1 tcp是面向連線的傳輸控制協議,而udp是無連線的資料報服務 2 tcp傳輸資料可靠,保證資料傳輸的正確性和順序,而udp傳輸資料不可靠,會發生丟包,不保證傳輸資料的順序 3 tcp對系統資源要求多,udp對系統資源要求少 4 udp具有較好的實時性,工作效率較tcp高...

網路程式設計2

url類 url url new url throws malformedurlexception 這樣可以通過其方法獲得我們想要的資訊 string getfile 獲取此 url 的檔名。myweb demo.html?name df,age 30 string gethost 獲取此 url ...