日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

TCP编程函数和步骤

發布時間:2023/11/27 生活经验 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TCP编程函数和步骤 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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?字節的協議地址?*/

??????????};?


2DNS結構
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);?
domainAF_INETsocket的類型,typeSOCK_STREAM?SOCK_DGRAM,分別表示TCP連接和UDP連接;protocol0

返回一個整型socket描述符。

?
2.bind: 

socket描述符與你本機上的一個端口相關聯(僅用于服務器)

int?bind(int?sockfd,struct?sockaddr?*my_addr,?int?addrlen);

Sockfd是一個socket描述符
my_addr是一個指向包含有本機IP地址及端口號等信息的sockaddr類型的指針;
addrlensizeof(struct?sockaddr)。?
返回:成功=0;失敗=-1errno=錯誤號。
可以用下面的賦值自動獲得本機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;失敗=-1errno=錯誤號。

4Listen:?

監聽是否有服務請求?,用于bind()
int?listen(int?sockfd,?int?backlog);?
SockfdSocket系統調用返回的socket?描述符;
backlog指定在請求隊列中允許的最大請求數,缺省值為20
返回:成功=0;失敗=-1errno=錯誤號。

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地址及端口號。
fromlensizeof(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_INETAF_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_INETAF_INET6:第二個參數是一個指向網絡字節序的二進制值的指針;第三個參數是一個指向轉換后的點分十進制串的指針;第四個參數是目標的大小,以免函數溢出其調用者的緩沖區。?
返回:指向結果的指針---成功   NULL---失敗?


總結

以上是生活随笔為你收集整理的TCP编程函数和步骤的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。