当前位置:首页 > 嵌入式培训 > 嵌入式学习 > 学习笔记 > TCP网络编程详解

TCP网络编程详解 时间:2018-08-28      来源:未知

【1】流程:

举个例子:

买个手机和卡

手机和卡必须匹配

将卡和手机进行绑定

设置为非飞行模型

进行通信

服务器端:

创建套接字 socket( )

填充服务器网络信息结构体

将套接字与网络信息结构体绑定 bind( )

将套接字设置为监听状态 listen( )

阻塞等待客户端的连接请求 accept( )

进行通信 recv( )/send( )

客户端:

创建套接字 socket( )

填充服务器网络信息结构体

发送客户端的连接请求 connect( )

进行通信 send( )/recv( )

【2】socket( )

#include /* See NOTES */

#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 /* See NOTES */

#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 /* See NOTES */

#include

int listen(int sockfd, int backlog);

功能:将套接字设置为监听状态

参数:

sockfd:文件描述符,socket的返回值

backlog:允许同时处理客户端的个数,一般设置为5 10

返回值:

成功:0

失败:-1

【5】accept( )

#include /* See NOTES */

#include

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

功能:阻塞等待客户端的连接请求

参数:

sockfd:文件描述符,socket的返回值

addr:网络信息结构体(自动填充客户端的信息,如果位NULL, 则得不到客户端的IP地址和端口号)

addrlen:addr的长度

返回值:

成功:文件描述符,用于通信

失败:-1

【6】connect( )

#include /* See NOTES */

#include

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

功能:发送客户端的连接请求

参数:

sockfd:文件描述符,socket的返回值

addr:服务器网络信息结构体

addrlen:addr的长度

返回值:

成功:0

失败:-1

上一篇:linux字符设备驱动框架及编写流程

下一篇:C++继承这样学,让你快速掌握

热点文章推荐
华清学员就业榜单
高薪学员经验分享
热点新闻推荐
前台专线:010-82525158 企业培训洽谈专线:010-82525379 院校合作洽谈专线:010-82525379 Copyright © 2004-2022 北京华清远见科技集团有限公司 版权所有 ,京ICP备16055225号-5京公海网安备11010802025203号

回到顶部