網路程式設計(二)

2021-07-30 00:25:35 字數 4959 閱讀 1854

網路程式設計基礎(二)

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.套接字有傳送緩衝區和...