【1】流程:
舉個例子:
買個手機和卡
手機和卡必須匹配
將卡和手機進行綁定
設置為非飛行模型
進行通信
服務器端:
創建套接字 socket( )
填充服務器網絡信息結構體
將套接字與網絡信息結構體綁定 bind( )
將套接字設置為監聽狀態 listen( )
阻塞等待客戶端的連接請求 accept( )
進行通信 recv( )/send( )
客戶端:
創建套接字 socket( )
填充服務器網絡信息結構體
發送客戶端的連接請求 connect( )
進行通信 send( )/recv( )
【2】socket( )
#include
#include
int socket(int domain, int type, int protocol);
功能:創建套接字,返回文件描述符
參數:
domain:通信域(協議族)
AF_UNIX 本地通信
AF_INET 網絡通信
AF_PACKET 底層通信
type:類型
SOCK_STREAM 流式套接字 TCP
SOCK_DGRAM 數據報套接字 UDP
SOCK_RAM 底層的
protocol:協議
一般為0,如果需要其他協議則設置
返回值:
成功:文件描述符
失敗:-1
【3】bind( )
#include
#include
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
功能:將套接字與網絡信息結構體綁定
參數:
sockfd:文件描述符,socket的返回值
addr:網絡信息結構體
通用的:
struct sockaddr {
sa_family_t sa_family; 2個字節
char sa_data[14]; 14個字節
}
一般使用:sockaddr_in
#include
struct sockaddr_in
{
__SOCKADDR_COMMON (sin_);
===>
#define __SOCKADDR_COMMON(sa_prefix) \
sa_family_t sa_prefix##family
在宏函數里面,##代碼表字符串的拼接
==>sa_family_t sin_family; 協議族 2個字節
in_port_t sin_port; 端口號 2個字節
struct in_addr sin_addr;
===>
struct in_addr {
__be32 s_addr; IP地址 4個字節
};
沒有用,為了是sockaddr_in和sockaddr保持大小一致
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;/定義變量
serveraddr.sin_family = AF_INET;//填充地址信息 地址族
serveraddr.sin_port = htons(9999);//填充地址信息 端口號
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);
功能:將套接字設置為監聽狀態
參數:
sockfd:文件描述符,socket的返回值
backlog:允許同時處理客戶端的個數,一般設置為5 10
返回值:
成功:0
失敗:-1
【5】accept( )
#include
#include
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功能:阻塞等待客戶端的連接請求
參數:
sockfd:文件描述符,socket的返回值
addr:網絡信息結構體(自動填充客戶端的信息,如果位NULL, 則得不到客戶端的IP地址和端口號)
addrlen:addr的長度
返回值:
成功:文件描述符,用于通信
失敗:-1
【6】connect( )
#include
#include
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
功能:發送客戶端的連接請求
參數:
sockfd:文件描述符,socket的返回值
addr:服務器網絡信息結構體
addrlen:addr的長度
返回值:
成功:0
失敗:-1