網路程式設計基礎(二)
struct in_addr
//這個結構體中儲存的是網路二進位制的ip位址
#include
struct hostent *gethostbyname(const
char *name);
//name:網域名稱**
//返回值:
struct hostent
#define h_addr h_addr_list[0] /* 第乙個ip位址 */
#include /* for af_inet */
struct hostent *gethostbyaddr(const
void *addr, socklen_t len, int type);
//addr:ip位址,是網路二進位制的ip位址
//len:ip位址的長度
//type:ip位址的型別 af_inet(ipv4協議族)
struct in_addr
;struct sockaddr
;struct sockaddr_in
;/*sin_family 在socket程式設計中只能是af_inet */
/*sin_port儲存埠號(使用網路位元組順序),在linux下,埠號的範圍0~65535,同時0~1024範圍的埠號已經被系統使用或保留。*/
/*sin_zero[8]這8個位元組是為了補全和struct sockaddr長度一樣使用的*/
int len=0;
len=sizeof(struct sockaddr);//16
len=sizeof(struct sockaddr_in);//16
//使用時是這樣使用的
struct sockaddr_in server;
(struct sockaddr *)&server;
socket()
#include
#include
//生成socket檔案描述符
intsocket(int domain, int type, int protocol);
domain:
af_inet
af_inet6
af_unix,af_local
type:
sock_stream//tcp協議
sock_dgram//udp協議
protocol:
ipproto_tcp
ipproto_udp
/*說明:如果domain和type確定了,protocol也就確定了,所以protocal可以寫0,預設預設
舉例:socket(af_inet,sock_stream,0)<=>socket(af_inet,sock_stream,ipproto_tcp)
socket(af_inet,sock_dgram,0)<=>socket(af_inet,sock_dgram,ipproto_udp)
返回值:
成功返回socket檔案檔案描述符;失敗返回-1
*/close()
#include
intclose(int fd);
/*fd:socket檔案描述符
返回值:
成功是0,錯誤是-1
*/send(write)
#include
#include
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
/*sockfd:socket生成的檔案描述符
buf:收發資料的陣列或結構體指標
len:收發資料的實際的長度
flags:一般取0;
返回值:
成功返回的是傳送的位元組數,失敗返回-1
int len=0;
len=send(sockfd,buf,sizeof(buf),0)<=>len=write(sockfd,buf,sizeof(buf))
*/recv(read)
#include
#include
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
引數同send
返回值:
返回正確接收的位元組數;
出錯返回-1;
如果返回值=0,說明對端socket已經關閉
send() recv()是socket專用的函式,socket資料的收發,或者說socket資料的讀寫,也是使用write() read()
//客戶端
socket()
connect()
#include
#include
//通過3次握手和伺服器的accept函式建立連線
intconnect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
/*sockfd:socket生成的檔案描述符
addr:(struct sockaddr *)&servaddr, struct sockaddr_in servaddr;
addrlen:sizeof(servaddr)
返回值:成功返回0,出錯返回-1
*/send()/write()
recv()/read()
close()
//伺服器
socket()
bind()
#include
#include
/*把addr賦值的結構體變數繫結到sockfd,也就是說讓socdfd具有addr這個結構體變數的屬性,具有這樣的family,port,addr */
intbind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
/*sockfd:socket生成的檔案描述符
addr:(struct sockaddr *)&servaddr
addrlen:sizeof(servaddr)
返回值:
成功返回0,出錯返回-1
*/listen()
#include
#include
//監聽,不阻塞的
intlisten(int sockfd, int backlog);
/*sockfd:socket生成的檔案描述符
backlog:5~20,指的是客戶端連線在伺服器端的未完成佇列和已完成佇列的長度,這個長度並不是直接的5~20,5~20只是乙個基數,具體的佇列長度是經過乙個演算法得出的f(x)=x^3+x^2+x+1 [5,20]
返回值:成功返回0,出錯返回-1
*/accept()
#include
#include
intaccept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
/*sockfd:socket檔案描述符
addr:(struct sockaddr *)&cliaddr
addrlen:sizeof(cliaddr)
返回值:
成功返回的是新生成的和客戶端連線對應的socket檔案描述符,失敗返回的是-1
*/recv()/read()
send()/write()
close()
//已連線的udp socket
//客戶端
socket()
connect()
send/write()
recv/read()
close()
//伺服器
socket()
bind()
recvfrom()
#include
#include
//recvfrom等價於accept和recv函式的組合
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
/*sockfd:socket檔案描述符
buf:接收資料的陣列
len:接收資料的長度
flags:0
src_addr:客戶端傳送過來的ip位址
addrlen:位址傳遞方式,客戶端結構體的長度
返回值:
正確返回接收到的位元組數;錯誤返回-1;如果返回0說明socket對端已經關閉
*/sendto()
#include
#include
//sendto函式相當於是connect和send函式的組合
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
/*sockfd:socket檔案描述符
buf:傳送的資料儲存的陣列
len:傳送的資料的位元組數
flags:0
dest_addr:目的位址,伺服器的位址
addrlen:sizeof(dest_addr)
*/close()
//2.未連線的udp socket
//客戶端
socket()
sendto()
recvfrom()
close()
//伺服器
socket()
bind()
recvfrom()
sendto()
close()
網路程式設計(二)
一 流式服務和資料報服務 1 位元組流服務 傳送端send 只是將資料寫到tcp傳送緩衝區中,然後將傳送緩衝區中的資料打包成報文段傳送出去。接收端又將接收到的報文段寫到緩衝區中,最後recv 直接取資料。位元組流服務特點 資料沒有明確分割 由底層做分割 不分一定的報文段,什麼時候想發便可將寫入緩衝區...
網路程式設計(二)
在之前的部落格中,介紹了傳輸層的一種重要協議 tcp協議。今天來介紹另外一種傳輸層協議 udp 一 udp udp 無連線的 不可靠的 資料報服務。首先看一下udp報頭 從上圖可以看出,udp協議報頭比tcp協議報頭簡單很多,沒有tcp報頭裡面那麼多的保證機制,所以udp較比tcp簡單。不可靠 ud...
網路程式設計(二)
1.掌握伺服器怎麼列印誰來連線的我 connect fd accept sock fd,null,null 阻塞,等待客戶端連線 accept函式 引數1 監聽套接字 2.掌握tcp客戶端怎麼寫的,流程 3.熟悉netstat antp命令 該命令可以檢視所有tcp連線狀態 4.套接字有傳送緩衝區和...