socket通信中用到的函数介绍

客户端和服务端利用socket来通信,应分别写出客户端程序和服务器程序:
不管是在客户端和服务器端,需要添加两个头文件,

# include <sys/socket.h>

因为socket通信用到的相关函数在其中。

 # include <netinet/in.h> 

因为要用到struct sockaddr_in数据结构。
客户端:
1. 用socket函数来创建一个套接字,介绍下socket函数。
int socket(int domain, int type, int protocol)
先说socket的返回值,返回一个非负套接字描述符,类型是整形,唯一表示一个套接字,是生成的套接字的编号。若返回-1,表示创建套接字失败。
domain参数表示协议簇,也叫协议域。常见的有AF_INET表示IPv4协议,AF_INT6表示IPv6,AF_LOCAL为UNIX协议域。
type表明套借口的类型,类型有SOCK_STREAM, SOCK_DGRAM, SOCK_SEQPACKET等。分别表示字节流,数据报,有序分组等。
protocol指定传输协议,有TCP和UDP。系统会针对每一个协议簇和类型提供默认的传输协议,因此我们一般将这个参数设置为0.
2. 连接套接字和服务器端地址
int connect(int sockfd, const struct aockaddr_in myaddr, socklen_t addrlen)。返回值为0,表示三次握手已完成,连接成功,返回-1,连接失败。
第一个参数socket就是创建成功套接字的返回值,也就是套接字描述符,或叫做套接字编号。
第二个参数类型是指向sockaddr_in类型的指针。sockaddr结构体的定义是:
struck sockaddr_in
{
__SOCKADDR_COMMON sin_family; // 表示协议簇
in_port_t sin_port; // 表示端口号
struct in_addr sin_addr; // 表示IP地址
}
用法是先定义这个结构体,即:struct sockaddr myaddr,定义了一个名为myaddr的结构体,然后给这个结构体中的成员进行赋值。
其中协议簇有IPv4,IPv6和本地UNIX协议簇,分别用AF_INET, AF_INT6, AF_LOCAL。端口设置需注意,我们应该将本地主机字节序转化为网络字节序,即以大端法设置端口号,定义网络字节序的函数为htons(端口号)。
而IP地址转化为网络字节序的函数为inet_aton(IP地址字符串, 字符串指针长度)。
第三个参数可用sizeof(struct sockaddr_in)来表示。IP地址和端口号应是服务器提供的IP地址和端口号。
3. 向套接字描述符读写数据。调用send和recv函数来执行读写操作
4. 调用close(套接字描述符),关闭套接字。
服务器端:
1. 调用socket函数来创建套接字
2. 将套接字与客户端的IP地址和端口号进行绑定,调用函数bind()。
int bind(int sockfd, const struct sockaddr * myaddr, socklen_t addrlen)
若返回值是0,则表明bind连接成功,若返回-1,则表明bind连接失败。sockaddr_in中的协议簇参数应与客户端协议簇保持一致,IP地址应为客户端IP地址,端口号应为客户端提供的端口号。
3. 连接好之后,调用listen()函数监听客户端套接字是否申请连接服务器端
int listen(int sockfd, int backlog),若成功监听到客户端的连接请求,则返回0,否则返回-1。
第一个参数表明要监听的套接字描述符,第二个参数规定了内核为这个套接字接口排队的最大连接个数。
4. 监听到之后,调用accept()函数来同意连接.
int accept(int sockfd, struct sockaddr_in myaddr, socklen_t addrlen),若函数调用成功,该函数会返回一个非负描述符(编号),若调用失败,则返回-1.
我们称该函数的第一个参数套接字描述符为监听套接字描述符,而connect函数返回的套接字表述符称为已连接套接字描述符。
第二个参数为客户端的IP地址和端口号
第三个参数为aockaddr_in数据结构长度。
为什么内核要重新为一个连接生成一个已连接套接字描述符呢?因为一个服务器创建的这个套接字会一直存在,知道服务器关闭,而内核为每个客户端生成一个已连接套接字,当服务结束后,关闭已连接套接字而不需要关闭服务器的套接字。服务器套接字能够继续监听套接字来提供服务。
5. 调用recv()函数和send()在已连接套接字描述符中接受和发送数据
6. 关闭已连接套接字
7. 关闭服务器套接字
在listen接收到连接请求后,程序进入循环,开始调用accept()函数,执行recv()和send()函数,知道无数据接收或发送为止,关闭已连接套接字描述符,跳出循环,关闭服务器套接字描述符。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值