Windows XP Windows 7 Windows 2003 Windows Vista Windows教程綜合 Linux 系統教程
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟件教程
 Windows教程網 >> Linux系統教程 >> Linux教程 >> TCP編程函數和步驟詳解

TCP編程函數和步驟詳解

日期:2017/2/7 14:34:08      編輯:Linux教程
 

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---失敗

 

Copyright © Windows教程網 All Rights Reserved