TCP網絡編程詳解
時間(jian):2018-08-28 來源:未(wei)知
【1】流程:
舉個例子:
買個手機和(he)卡
手(shou)機和卡必須匹配
將卡和手機進行綁定(ding)
設置為非(fei)飛行模型
進行通信
服務器端:
創建套接字(zi) socket( )
填充服務器網絡信息結構(gou)體(ti)
將(jiang)套接字與網絡信息結構(gou)體綁定 bind( )
將(jiang)套(tao)接字設置為監聽(ting)狀態(tai) listen( )
阻塞等待客戶(hu)端的(de)連(lian)接請求 accept( )
進行通(tong)信 recv( )/send( )
客戶端:
創建套(tao)接字 socket( )
填充(chong)服務器(qi)網絡信息結構(gou)體
發送(song)客(ke)戶端的連接請求 connect( )
進行通信 send( )/recv( )
【2】socket( )
#include
#include
int socket(int domain, int type, int protocol);
功能(neng):創(chuang)建套接字,返(fan)回文(wen)件描述(shu)符
參數:
domain:通信域(yu)(協議族)
AF_UNIX 本地通信
AF_INET 網(wang)絡通(tong)信
AF_PACKET 底層通信
type:類型
SOCK_STREAM 流式套接(jie)字 TCP
SOCK_DGRAM 數據報(bao)套接字(zi) UDP
SOCK_RAM 底(di)層的
protocol:協(xie)議
一般(ban)為(wei)0,如果需要(yao)其他協議則設(she)置
返回值:
成(cheng)功(gong):文件描(miao)述符
失敗:-1
【3】bind( )
#include
#include
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
功(gong)能:將套接字(zi)與(yu)網絡信(xin)息結(jie)構體綁定
參數:
sockfd:文件描述符,socket的返回值
addr:網絡信息(xi)結(jie)構體
通用的:
struct sockaddr {
sa_family_t sa_family; 2個字(zi)節
char sa_data[14]; 14個字節
}
一般(ban)使用:sockaddr_in
#include
struct sockaddr_in
{
__SOCKADDR_COMMON (sin_);
===>
#define __SOCKADDR_COMMON(sa_prefix) \
sa_family_t sa_prefix##family
在宏函數里面,##代碼表(biao)字符串(chuan)的(de)拼接
==>sa_family_t sin_family; 協議族 2個(ge)字節(jie)
in_port_t sin_port; 端口號 2個字節
struct in_addr sin_addr;
===>
struct in_addr {
__be32 s_addr; IP地址 4個字(zi)節
};
沒有用,為了是sockaddr_in和(he)sockaddr保持大小一致(zhi)
unsigned char sin_zero[sizeof (struct sockaddr) -
__SOCKADDR_COMMON_SIZE -
sizeof (in_port_t) -
sizeof (struct in_addr)];
};
addrlen:addr的長度
返回值:
成功:0
失敗:-1
例子:
struct sockaddr_in serveraddr;/定(ding)義變量
serveraddr.sin_family = AF_INET;//填(tian)充(chong)地(di)址(zhi)信息(xi) 地(di)址(zhi)族(zu)
serveraddr.sin_port = htons(9999);//填充地址信息 端口號(hao)
serveraddr.sin_addr.s_addr = inet_addr(“192.168.2.27”);//填充地址信息 IP地址
if(bind(sockfd, (struct sockaddr *)&serveraddr, sizeof(struct sockaddr_in)) < 0)
{
perror("fail to bind");
exit(1);
}
【4】listen( )
#include
#include
int listen(int sockfd, int backlog);
功能:將(jiang)套接字設置(zhi)為監聽狀態
參數:
sockfd:文件描述符,socket的返回值(zhi)
backlog:允許同時處理(li)客戶端的個數,一般設置為5 10
返回值:
成功:0
失敗:-1
【5】accept( )
#include
#include
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功(gong)能:阻(zu)塞等待客(ke)戶(hu)端的連(lian)接(jie)請求
參數:
sockfd:文件描述符,socket的返(fan)回值
addr:網絡(luo)信息結構體(自動填充(chong)客戶(hu)端(duan)(duan)的信息,如果位NULL, 則(ze)得不到(dao)客戶(hu)端(duan)(duan)的IP地(di)址(zhi)和端(duan)(duan)口(kou)號)
addrlen:addr的長度(du)
返回值:
成功:文(wen)件(jian)描述符,用于通信
失敗:-1
【6】connect( )
#include
#include
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
功能:發送客戶端的連接請求
參數:
sockfd:文件描述符,socket的返回(hui)值
addr:服務器網絡(luo)信息結構體
addrlen:addr的(de)長度(du)
返回值:
成功:0
失敗:-1

