Unix/Linux网络编程的实现

Unix/Linux网络编程的实现
有固定套路并且有一些不方便的函数、结构。
socket编程 (插座、套接字)
socket通信包括 一对一 和一对多。
先研究一对一(一对多的模式也一样)
socket编程 早期用来做进程间通信(IPC),现在主体是网络,编程的代码差不多。
1 本地通信(IPC)
1.1 服务器端的编程步骤:
1.1.1 创建一个socket,使用socket()
int socket(int domain,int type,int protocol)
参数:domain叫域,用于选择协议簇
AF_UNIX/AF_LOCAL/AF_FILE : 本地通信IPC
AF_INET : 网络通信
AF_INET6: IPV6的网络通信
其中,AF换成PF效果一样。
type 选择通信的类型(选协议)
SOCK_STREAM : 数据流(TCP协议)
SOCK_DGRAM : 数据报(UDP协议)
protocol 本来应该选择协议,但实际上没什么用,协议已经被前2个参数决定,给0即可。
成功返回 socket描述符,类似文件描述符。失败返回-1.
注:读写函数 可以操作socket描述符。

1.1.2 准备通信地址(IPC是文件,网络是IP/端口)
系统提供了三种通信地址,就是三个结构体。
1 struct sockaddr本身不存数据,做函数的参数。
2 struct sockaddr_un 存本地通信的通信地址
3 struct sockaddr_in 存网络通信的通信地址
#include <sys/un.h>(本地)
struct sockaddr_un{
int sun_family; //协议簇,与socket()一致
char sun_path[];//socket文件的路径
};
#include <netinet/in.h>(网络)
struct sockaddr_in{
int sin_family; //协议簇,与socket()一致
short sin_port; //端口号
struct in_addr sin_addr; // IP地址
};
1.1.3 绑定socket描述符和通信地址
bind(int sockfd,struct sockaddr* addr,
int length)
length是通信地址的sizeof
1.1.4 通信(read()、write())
1.1.5 关闭socket描述符(close())
2 客户端的编程步骤
和服务器端编程步骤一样,除了第三步把bind换成connect(),但函数的参数不用改变。
bind() 是服务器绑定通信地址,开放端口。
connect()是客户端连接服务器,通信地址要使用服务器的。

展开阅读全文

没有更多推荐了,返回首页