函式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 ...