socket(二)

一、TCP客户/服务器模型

                                                                   

二、socket函数

#include <sys/socket.h>

int socket(int domain, int type, int protocol);

功能:创建一个套接字用于通信
参数:domain:指定通信协议族
            type:指定套接字类型,SOCK_STREAM,SOCK_DGRAM,SOCK_RAW
            protocol:协议类型
返回值:成功返回非负整数,类似文件描述符,称为套接字描述字。失败返回-1.

三、bind函数

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

参数:
    sockfd:socket函数返回的套接字
    addr:要绑定的地址
    addrlen:地址长度
返回值:成功返回0,失败返回-1


四、listen

int listen(int sockfd,int backlog);
参数:
    sockfd:socket函数返回的套接字
    backlog:规定内核为此套接字排队的最大连接个数,未完成连接队列加已完成连接队列。可以用宏SOMAXCONN。
返回值:成功返回0,失败返回-1.

监听后,套接字就变成了被动套接字,即接受连接的套接字,accept。主动套接字是用来发起连接的,connect。

三个状态:三次握手未完成,三次握手完成但未被接受,已被accept。


五、accept

int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen);
功能:从已完成连接队列返回第一个连接,如果队列为空,则阻塞。
参数:
    sockfd:服务器套接字
    addr: 将存储对等方的套接字地址
    addrlen:addr的长度
返回值:成功返回非负整数,失败返回-1。 从返回的套接字中读写信息即是与对等方的通信。称为已连接套接字,不再处于监听状态,属于主动套接字!


六、connect

int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
参数:
    sockfd:套接字
    addr:对方地址
    addrlen:addr长度
返回值:成功返回0,失败返回-1.通过sockfd与对方通信!


注:假设accept返回的是conn,逻辑上来说客户端通过sockfd与服务器的conn进行通信。conn的地址是在bind的时候确定的,sock的地址包括本机的IP地址和自动选择的一个端口号。对于服务器端来说,一旦连接成功,它会将客户端地址填充到accept的addr参数中,addrlen一定要初始化,他是一个输入输出参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值