socket套接字通信

OSI七层模型

应用层
表示层
会话层
传输层
网络层
数据链路层
物理层

TCP/IP四层模型

IP地址
A 0 + 7 + 24
B 10 + 14 + 16
C 110 + 21 + 8
D 1110 + 28位组播地址
E 留待备用

192.168.0.103 /24

127.0.0.1:回环地址,可用于本机网络协议的测试和本地进程间通信

端口号

16位无符号整数,0-65535 1024被系统使用


字节序

---------------------------------
socket编程:
1.网络编程又叫socket编程
套接字是一个网络编程的接口,是网络数据传输的软设备,用于网络交互。

网络编程就是编写程序使两台连网的计算机相互交换数据,这个就是网络编程的全部内容。

unix/linux系统作为服务器操作系统存在至今,因此,Linux的网络功能应该是非常全面和强大。

网络编程其实有很成熟的通信模型,并且windows也通用。

2.通信模型(基于TCP的一对一的通信模型)

服务器:
1.创建socket,使用函数socket()
2.准备通信地址,使用结构体类型
3.绑定socket和通信地址,使用bind()
4.监听,使用函数listen()
5.等待连接,使用函数accept()
6.进行通信,使用read()、write()
7.关闭socket,使用函数close()

客户端:
1.创建socket,使用函数socket()
2.准备通信地址(指服务器的地址),使用结构体类型
3.连接服务器,使用函数connect()
4.进行通信,使用read()、write()
5.关闭socket,使用函数close()


具体函数:
1.socket()函数
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>


int socket(int domain, int type, int protocol);
功能:主要用于创建可以实现通信的交流点,也就是socket通信载体(相当于电话机)
第一个参数:域/协议族,决定了是本地通信还是网络通信
AF_UNIX/AF_LOCAL 用于实现本地通信
AF_INET 用于实现基于IPv4的网络通信
AF_INET6 用于实现基于IPv6的网络通信

第二个参数:通信类型,决定了具体的通信式
SOCK_STREAM 提供有序的、可靠的、双向的、面向连接的字节流通信方式,默认使用TCP协议
SOCK_DGRAM 提供无序的、不可靠的,非面向连接的数据报通信方式,默认使用UDP协议

第三个参数:指定具体的协议,默认为0,使用默认协议


返回值:成功返回新的socket描述符
失败返回-1,errno被设置


2.通信地址数据类型
1.通用地址结构
struct sockaddr
{
sa_family_t sa_family;
char sa_data[14];
};
2.IPv4通信地址结构
struct sockaddr_in
{
sa_family_t sin_family;//协议族,AF_INET
in_port_t sin_port;//16位的端口号
struct in_addr sin_addr;//IP地址 
};
struct in_addr
{
in_addr_t s_addr;
};

例:
struct sockaddr_in saddr;
memset(&saddr,0,sizeof(saddr);
saddr.sin_family = AF_INET;
saddr.sin_port = htons(10086);
saddr.sin_addr.s_addr = inet_addr("192.168.0.103");


端口格式转换相关函数:
#include <arpa/inet.h>


  uint32_t htonl(uint32_t hostlong);


  uint16_t htons(uint16_t hostshort);


  uint32_t ntohl(uint32_t netlong);


  uint16_t ntohs(uint16_t netshort);


h:host 本地格式
n:network 网络格式(大端模式)
s:short 2字节整数
l:long 4字节整数
功能:把本地格式转成网络格式,或者反过来。

IP地址格式转换相关函数:
in_addr_t inet_addr(const char *cp);
功能:将字符串形式的IP地址转为整数类型
char *inet_ntoa(struct in_addr in);
功能:将结构类型的IP地址转为字符串形式


3.绑定函数bind()
include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>


int bind(int sockfd, const struct sockaddr *addr,
                socklen_t addrlen);
功能:主要用于绑定socket和具体的通信地址
第一个参数:socket描述符,socket函数的返回值
第二个参数:结构体指针,不管是什么协议的地址结构,都需要强转为该类型
第三个参数:通信地址结构的大小,使用sizeof()计算即可
返回值:成功返回0
失败返回-1,errno被设置

4.监听listen函数
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>


int listen(int sockfd, int backlog);
功能:为套接字sockfd建立一个连接请求监听队列,在调用listen函数成功后,这个套接字便成为服务套接字,即被动套接字
第一个参数: socket描述符
第二个参数:监听队列的大小
返回值:成功返回0
失败返回-1,errno被设置

5.等待连接,accept函数
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>


int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功能:用于接收服务套接字sockfd上的连接请求
第一个参数:socket描述符,socket函数的返回值
第二个参数:结构体指针,用于保存接受的客户端通信地址
第三个参数:指针类型,用于保存客户端网络地址的信息的长度
返回值:成功返回一个连接套接字
失败返回-1,errno被设置
注:如果对客户地址不感兴趣,那么第二、三两个参数写NULL即可。
如果需要客户的地址,那么第三个参数必须由调用者初始化。



6.连接函数connect
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>


int connect(int sockfd, const struct sockaddr *addr,
                   socklen_t addrlen);
功能:用于连接服务器
第一个参数:socket描述符,socket函数的返回值
第二个参数:服务器的通信地址
第三个参数:通信地址结构的大小,使用sizeof计算
返回值:成功返回0
失败返回-1,errno被设置
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值