理解网络编程和套接字

网络编程中接受连接请求的套接字的创建过程

1.调用socket函数创建套接字

2.调用bind函数分配IP地址和端口号

3.调用listen函数转为可接收请求状态

4.调用accept函数受理连接请求

 

IP地址:在网络环境中唯一标示一台主机
端口号:在主机中唯一标示一个进程
IP+port:在网络环境中唯一表示一个进程(socket)
套接字是文件的一种类型(伪文件)
socket是全双工通信
socket一定是成对出现
socket必须绑定IP+端口
一个文件描述符指向两个缓冲区,一个读、一个写

int socket(int domain,int type,int protocol);
函数socket()的参数domain用于设置网络通信的域,函数socket()根据这个参数选择通信协议的族
IPV4一般用AF_INET
type用于设置套接字通信的类型,主要有SOCKET_STREAM(流式套接字,TCP用),SOCKET_DGRAM(数据包套接字,UDP用)
protocol用于指定某个协议的特定类型,即type类型中的某个类型。通常某协议中只有一种特定的类型,这样protocol
仅能设置为0,但是有些协议有多种特定的类型,就需要设置这个参数来选择特定的类型

 

结构体


struct sockaddr_in 
{
    sa_family_t sin_family;
    in_port_t sin_port;
    struct in_addr sin_addr;
};

struct in_addr
{

    uint32_t s_addr;
};

sin_family 地址族协议
sin_port 端口号
sin_addr ip地址

sin_family指代协议族,在socket编程中只能是AF_INET

sin_port存储端口号(使用网络字节顺序),在linux下,端口号的范围0~65535,同时0~1024范围的端口号已经被系统使用或保留。

sin_addr存储IP地址,使用in_addr这个数据结构

现在sockaddr退化了(void *)的作用,传递一个地址给函数,至于这个函数是
sockaddr_in还是sockaddr_in6,由地址族确定,然后函数内部再强制类型转化为所需的地址类型

inet_pton是一个IP地址转换函数,可以在将IP地址在“点分十进制”和“二进制整数”之间转换
int inet_pton(int af, const char *src, void *dst);
这个函数转换字符串到网络地址,第一个参数af是地址簇,第二个参数*src是来源地址,第三个参数* dst接收转换后的数据。

int socket(int domain,int type,int protocol);
成功:返回一个新创建的socket的文件描述符,失败:-1,并设置errno

htons()函数:htons是将整型变量从主机字节顺序转变成网络字节顺序,(将一个无符号短整型数值转换为网络字节序,即大端
模式(big-endian))
就是整数在地址空间存储方式变为高位字节存放在内存的低地址处。

INADDR_ANY这个宏是数值类型
htonl()函数:将主机数转换成无符号长整型的网络字节顺序。(将主机的无符号长整形数转换成网络字节顺序。)
本函数将一个32位数从主机字节顺序转换成网络字节顺序。

int bind(int sockfd,const struct sockaddr *addr,socklen_t addrlen);
成功:0 失败:-1,并设置errno

sockfd:socket文件描述符
addr:构造出IP地址加端口号
addrlen:sizeof(addr)长度
返回值:成功返回0,失败返回-1,设置errno

int listen(int sockfd,int backlog);
sockfd:文件描述符
backlog:排队建立3次握手队列和刚刚建立3次握手队列的链接数和


int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen);
sockfd:
    socket文件描述符
addr:
    传出参数,返回链接客户端地址信息,含IP地址和端口号
addrlen:
    传入传出参数(值-结果),传入sizeof(addr)大小,函数返回时返回真正接收到地址
结构体的大小
返回值:
    成功返回一个新的socket文件描述符,用于和客户端通信,失败-1,并设置errno

int connect(int sockfd,const struct sockaddr *addr,socklen_t addrlen);
sockfd:
    socket文件描述符
addr:
    传入参数,指定服务器端地址信息,含IP地址和端口号
addrlen:
    传入参数,传入sizeof(addr)大小
返回值
    成功:0,失败:-1,并设置errno

bind(),accept(),connect()函数的第二个参数都需要强转,前面加(struct sockaddr *)

atoi (表示 ascii to integer)是把字符串转换成整型数的一个函数

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值