一、通信 --- 不同主机上进程间的通信
1、IP和端口号
IP:标识网络中的一台主机
本质上 32位的整型数据
端口号:
标识某个进程
本质上 16位的整型数据
2、udp和tcp
udp的特点:
- 1.无连接
- 2.不可靠
tcp的特点:
- 1.面向链接
- 2.可靠传输
二、udp编程(c/s模型 )
客户端
socket
sendto
...
服务器端 ---把自己的地址公布出去
socket
bind //绑定
recvfrom
...
1、recvfrom 函数
ssize_t recvfrom(int sockfd, //socket的fd
void *buf, //保存数据的一块空间的地址
size_t len, //这块空间的大小
int flags, // 0 默认的接收方式 --- 阻塞方式
struct sockaddr *src_addr, //用来保存发送方的地址信息
socklen_t *addrlen //表示发送方实际的地址信息大小
);
返回值:
成功 返回接收到的字节数
失败 -1
2、bind 函数
int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);
功能:如果该函数在服务器端调用,则表示将参数1相关
的文件描述符文件与参数2 指定的接口地址关联,
用于从该接口接受数据。
如果该函数在客户端调用,则表示要将数据从
参数1所在的描述符中取出并从参数2所在的接口
设备上发送出去。
注意:
如果是客户端,则该函数可以省略,由默认接口发送数据。
参数:
sockfd 之前通过socket函数创建的文件描述符,套接字id
my_addr 是物理接口的结构体指针。表示该接口的信息。
struct sockaddr 通用地址结构 --- ip + 端口
{
u_short sa_family; 地址族
char sa_data[14]; 地址信息
};
3、转换网络地址
转换成网络地址结构如下:
struct sockaddr_in //网络地址结构
{
u_short sin_family; //地址族
u_short sin_port; //地址端口
struct in_addr sin_addr; //地址IP //"192.168.1.123"
char sin_zero[8]; //占位
};
(in_addr_t === unsigned int )
struct in_addr
{
in_addr_t s_addr;
}
三、tcp编程(c/s模式)
1、tcp 客户端
1).建立连接
socket //买了一部手机
bind //可选 //插上sim卡
connect //拨打电话
....
2).通信过程
read
write
close
2、tcp服务器
1).建立连接
socket //买了一部手机
bind //插上sim卡
listen //监听 客户端的连接请求
accept //接听 ---这一步完成之后 连接就建立好了,之后就可以收发数据
.....
2).通信过程
read
write
close
3、tcp的建立过程
tcp三次握手 :
4、connect 函数
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
功能:该函数固定有客户端使用,表示从当前主机向目标
主机发起链接请求。
参数:sockfd 本地socket创建的套接子id
addr 远程目标主机的地址信息。
addrlen 参数2的长度。
返回值:成功 0
失败 -1;
struct sockaddr *addr //通用地址结构类型,并没有实际去用,实际用到都是具体地址结构类型