网络编程基础socket

网络通信的基本概念
socket、套接字
socket是一种接口机制,可以让程序无论使用什么端口、协议、都可以从socket进出数据,它负责了进程与协
议之间的连接。
1、编程模型
点对点(p2p):一对一通信
客户机/服务器(C/S):一对多通信
2、函数
int socket(int domain, int type, int protocol);
功能:创建socket描述符,可以把socket当作文件来看待,发送数据就是写文件,接收数据就是读文件。
domain:地址类型
AF_UNIX/AF_LOCAL/AF_FILE 本地通信(进程间通信)
AF_INET 基本32IP地址通信,IPv4 Internet protocols
AF_INET6 基本128IP地址通信,IPv6,IPv6 Internet protocols
type:通信协议
SOCK_STREAM 数据流协议,TCP
SOCK_DGRAM 数据报协议,UDP
protocol:特别通信协议,给0即可。
返回值:socket描述符,类似文件描述符
3、通信地址
注意:函数接口定义的是sockaddr,而实际提供的是sockaddr_un或sockaddr_in
struct socketaddr{
sa_family_t sa_family;
char sa_data[14];
}
struct sockaddr_un {
_SOCKADDR_COMMON(sun); /* AF_UNIX /地址类型 参看domain参数
char sun_path[108]; /
pathname */socket文件的路径
};
struct sockaddr_in{
_SOCKADDR_COMMON(sin);
in_port_t sin_port; // 端口号 大端字节序 参看联合
struct in_addr sin_addr // ip地址 大端4字节整数
}
struct in_addr{
in_addr_t s_addr; //
}
4、绑定
socket描述符与物理通信载体(网卡或socket文件)绑定在一起。
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
sockfd:socket描述符:socket函数的返回值
addr:通信地址结构体,实际给的是sockaddr_un或sockaddr_in,需要强制类型转换。
addrlen:通信地址结构体类型的字节数,使用sizeof计算。
5、连接
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
sockfd:socket描述符
addr:通信目标地址
addrlen:通信地址结构体类型的字节数,使用sizeof计算。
返回值:在不同的编程模型下返回值意义不同,在本地通信
返回加0,失败返回-1。
6、数据接收与发送:read/write
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
recv/send与read/write功能一样,flags多了是否阻塞的功能(0阻塞,1不阻塞)。
7、关闭套接字:close
如果是网络通信,端口号并不会立即回收,大概会占用3分钟左右。
8、字节序转换
#include <arpa/inet.h>

uint32_t htonl(uint32_t hostlong);
功能:把32位本机字节序转换成32位的网络字节序
uint16_t htons(uint16_t hostshort);
功能:把16位本机字节序转换成16位的网络字节序
uint32_t ntohl(uint32_t netlong);
功能:把32位网络字节序转换成32位的本机字节序
uint16_t ntohs(uint16_t netshort);
功能:把16位网络字节序转换成16位的本机字节序

9、ip地址转换
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int inet_aton(const char *cp, struct in_addr *inp);
功能:把点分十进制的ip地址(字符串)转换成32位无符号整数,使用指针获取。
in_addr_t inet_addr(const char *cp);
功能:把点分十进制的ip地址(字符串)转换成32位无符号整数,使用返回值直接返回。
char *inet_ntoa(struct in_addr in);
功能:32位无符号整数表示的ip地址,转换成点分十进制的ip地址(字符串)。
10、本地通信编程模型
进程A 进程B
创建套接字(AF_LOCAL) 创建套接字(AF_LOCAL)
准备地址(sockaddr_un) 准备地址(sockaddr_un)
绑定(自己的socket/地址) 连接(connect,连接进程A的地址)
接收数据 发送数据
关闭套接字

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值