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