TCP編程的伺服器端一般步驟是
1、 建立一個socket,用函數socket();
2、 設定socket屬性,用函數setsockopt(); * 可選
3、 綁定IP地址、連接埠等資訊到socket上,用函數bind();
4、 開啟監聽,用函數listen();
5、 接收用戶端上來的串連,用函數accept();
6、 收發資料,用函數send()和recv(),者read()和write();
7、 關閉網路連接;
8、 關閉監聽;
TCP編程的用戶端一般步驟是:
1、 建立一個socket,用函數socket();
2、 設定socket屬性,用函數setsockopt();* 可選
3、 綁定IP地址、連接埠等資訊到socket上,用函數bind();* 可選
4、 設定要串連的對方的IP地址和連接埠等屬性;
5、 串連伺服器,用函數connect();
6、 收發資料,用函數send()和recv(),或者read()和write();
7、 關閉網路連接;
UDP編程的伺服器端一般步驟是:
1、 建立一個socket,用函數socket();
2、 設定socket屬性,用函數setsockopt();* 可選
3、 綁定IP地址、連接埠等資訊到socket上,用函數bind()
4、 迴圈接收資料,用函數recvfrom();
5、 關閉網路連接;
UDP編程的用戶端一般步驟是:
1、 建立一個socket,用函數socket();
2、 設定socket屬性,用函數setsockopt();* 可選
3、 綁定IP地址、連接埠等資訊到socket上,用函數bind();* 可選
4、 設定對方的IP地址和連接埠等屬性;
5、 發送資料,用函數sendto();
6、 關閉網路連接;
常用的網路命令:
netstat
命令netstat是用來顯示網路的串連,路由表和介面統計等網路的資訊.netstat有許多的選項我們常用的選項是 -an 用來顯示詳細的網路狀態.至於其它的選項我們可以使用協助
telnet
telnet是一個用來遠端控制的程式,但是我們完全可以用這個程式來調試我們的服務端程式的. 比如我們的伺服器程式在監聽8888連接埠,我們可以用telnet localhost 8888來查看服務端的狀況
資料結構
1、地址結構
struct sockaddr_in {
short int sin_family; /* 地址族 一般為AF-INET */
unsigned short int sin_port; /* 連接埠號碼 */
struct in_addr sin_addr; /* IP地址 */
unsigned char sin_zero[8]; /* 填充0 以保持與struct sockaddr同樣大小 使用memset()或bzero()來填充*/
};
struct sockaddr {
unsigned short sa_family; /* 地址族, AF_xxx */
char sa_data[14]; /* 14 位元組的協議地址 */
};
2、DNS結構
struct hostent {
char *h_name; /* 主機的官方網域名稱 */
char **h_aliases; /* 一個以NULL結尾的主機別名數組 */
int h_addrtype; /* 返回的地址類型,在Internet環境下為AF-INET */
int h_length; /*地址的位元組長度 */
char **h_addr_list; /* 一個以0結尾的數組,包含該主機的所有地址*/
};
操作函數
1、 socket:
建立socket 描述符
int socket(int domain, int type, int protocol);
domain=AF_INET,socket的類型,type=SOCK_STREAM 或SOCK_DGRAM,分別表示TCP串連和UDP串連;protocol=0。
返回一個整型socket描述符。
2.bind:
將socket描述符與你本機上的一個連接埠相關聯(僅用於伺服器)
int bind(int sockfd,struct sockaddr *my_addr, int addrlen);
Sockfd是一個socket描述符
my_addr是一個指向包含有本機IP地址及連接埠號碼等資訊的sockaddr類型的指標;
addrlen=sizeof(struct sockaddr)。
返回:成功=0;失敗=-1,errno=錯誤號碼。
可以用下面的賦值自動獲得本機IP地址和隨機擷取一個沒有被佔用的連接埠號碼:
my_addr.sin_port = 0; /* 系統隨機播放一個未被使用的連接埠號碼 */
my_addr.sin_addr.s_addr = INADDR_ANY; /* 填入本機IP地址 */
3.Connect:
與遠端伺服器建立一個TCP串連 (用於用戶端)
int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);
Sockfd是目的伺服器的sockt描述符
serv_addr是包含目的機IP地址和連接埠號碼的指標。
返回:成功=0;失敗=-1,errno=錯誤號碼。
4、Listen:
監聽是否有服務要求 ,用於bind()後
int listen(int sockfd, int backlog);
Sockfd是Socket系統調用返回的socket 描述符;
backlog指定在請求隊列中允許的最大請求數,預設值為20。
返回:成功=0;失敗=-1,errno=錯誤號碼。
5.accept:
接受來自客戶的請求
int accept(int sockfd, void *addr, int *addrlen);
sockfd是被監聽的socket描述符,
addr 是指向sockaddr_in變數的指標,存放客戶主機的資訊 ;
addrten 指向值為sizeof(struct sockaddr_in)的整型指標變數。
返回:成功返回一個新的socket描述符,來供這個新串連來使用。 錯誤發生時返回一個-1並且設定相應的errno值。
6.Send:
在串連(TCP)的socket方式下發送資訊
int send(int sockfd, const void *msg, int len, int flags);
Sockfd是用來傳輸資料的socket描述符
msg是一個指向要發送資料的指標。
Len是以位元組為單位的資料的長度。
flags一般情況下置為0。
7.recv:
在串連(TCP)的socket方式下接收資料
int recv(int sockfd,void *buf,int len,unsigned int flags);
Sockfd是接受資料的socket描述符;
buf 是存放接收資料的緩衝區;
len是緩衝的長度。
Flags也被置為0。
返回:實際上接收的位元組數,如果串連中止,返回0,。出現錯誤時,返回-1共置相應的errno值。
8.sendto:
在在無串連(UDP)的socket方式下發送資料
int sendto(int sockfd, const void *msg,int len,unsigned int flags,const struct sockaddr *to, int tolen);
to表示目地機的IP地址和連接埠號碼資訊
tolen=sizeof (struct sockaddr)。
返回:實際發送的資料位元組長度或在出現發送錯誤時返回-1。
9.Recvfrom()
在無串連(UDP)的socket方式下接收資料
int recvfrom(int sockfd,void *buf,int len,unsigned int flags,struct sockaddr *from,int *fromlen);
from 儲存源機的IP地址及連接埠號碼。
fromlen=sizeof(struct sockaddr)。
返回:實際存入from中的資料位元組數。當出現錯誤時返回-1,共置相應的errno。
10.close()
釋放socket,停止任何資料操作
close(sockfd);
11.shutdown:
單向關閉串連
int shutdown(int sockfd,int how);
how可以設為下列值:
·0-------不允許繼續接收資料
·1-------不允許繼續發送資料
·2-------不允許繼續發送和接收資料,均為允許則調用close ()
shutdown在操作成功時返回0,在出現錯誤時返回-1(共置相應errno)。
12. gethostbyname:
網域名稱和IP地址的轉換
struct hostent *gethostbyname(const char *name);
13.inet_pton函數:
將點分十進位串轉換成網路位元組序二進位值,此函數對IPv4地址和IPv6地址都能處理。
int inet_pton(int family,const char * strptr,void * addrptr);
第一個參數可以是AF_INET或AF_INET6:第二個參數是一個指向點分十進位串的指標:第三個參數是一個指向轉換後的網路位元組序的二進位值的指標。
返回:1---成功 0---輸入不是有效表達格式 -1---失敗
14.inet_ntop函數:
和inet_pton函數正好相反,inet_ntop函數是將網路位元組序二進位值轉換成點分十進位串。
const char * inet_ntop(int family,const void * addrptr,char * strptr,size_t len);
第一個參數可以是AF_INET或AF_INET6:第二個參數是一個指向網路位元組序的二進位值的指標;第三個參數是一個指向轉換後的點分十進位串的指標;第四個參數是目標的大小,以免函數溢出其調用者的緩衝區。
返回:指向結果的指標---成功 NULL---失敗