服务器与Socket操作
与Socket 相关的概念:
1.客户/服务器模型
2.用管道来双向通信
3.协同进程
4.文件/进程的相似性
5.socket 的概念及使用
6.网络服务
7.socket 编写客户端,服务器程序
linux 的 数据源类型:
1.磁盘文件,read/write 读/写
2.设备文件 read/write 读/写
3.管道,pipe 创建,fork 创建,read/wirte 读/写
4.sockets socket、line和connect连接,read/write 读/写
客户/服务器模型:
双向通信:
永久性服务:协同进程
一个客户/服务器模型程序要成为协同系统必须有明确指明消息结束的方法,并且程序必须使用简单并可预测的请求和应答。
fdopen:让文件描述符像文件一样使用
#include
FILE *fopen(const char *path, const char *mode);
FILE *fdopen(int fd, const char *mode);
FILE *freopen(const char *path, const char *mode, FILE *stream);
返回 FILE 类型的值,以文件描述符作为参数
popen :让进程看似文件
FILE *fp;
fp=open("file1","r");
c=getc(fp);
fgets(buf, len ,fp);
fscnf(fp, "%d %d %s",&x,&y,x);
fclose(fp);
FILE *fp;
fp=popen("ls","r");
fgets(buf, len ,fp);
pclose(fp);
pclose 对 popen 是必须的。进程在产生之后必须等待退出运行,否则会称为zombie。pclose中调用了wait函数等待进程的结束
popen :运行一个程序并返回指向该程序的标准输入或者标准输出的连接。
#include
FILE *popen(const char *command, const char *type);
int pclose(FILE *stream);
访问数据:
1.从文件获取数据,fopen。依赖于特定的文件格式和结构体中的特定成员名称
2.从函数获取数据:静态库、共享库
3.从进程获取数据:和服务器连接
socket:与远端进程相连
socket允许在不相关的进程间创建类似管道的连接,甚至可以通过socket连接其他主机上的进程,
概念:
1.客户和服务器:服务器是提供服务的程序
2.主机名和端口。
3.地址族:
4.协议:服务器和客户之间交互的规则。
telnet:连接远端的服务器。
服务器编写:
1.向内核申请一个socket: socket
#include
#include
int sockid=socket(int domain, int type, int protocol);
domain=通信域:PF_INET 适用于Internet socket
type=socket的类型,
protocol=协议
sockid:返回值,-1=失败,其余=成功
socket 调用创建一个通信端点并返回一个标识符。存在很多中类型的通信系统,每个系统都是一个通信域。
socket 的类型指出程序将要使用的数据流类型。
协议指的是内核中网络代码所使用的协议,不是客户端/服务器之间的协议。0=标准协议
2.绑定地址到socket 上,地址包括主机、端口: bind
#include
#include
int ret=bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
sockfd=socket 的id
addr=指向包含地址结构的指针
addrlen=地址长度
ret:-1=失败,0=成功.
bind 调用把 一个地址发呢配给 socket.
3.在socket 上 允许接入呼叫并设置队列长度为1 :
监听socket上的连接:listen
#include
#include
int fd=listen(int sockfd, int backlog);
sockfd=请求接收的socked的id
backlog=允许接入的数目
fd: -1=失败, fd =读写的文件描述符
4.等待/接收呼叫: accept
#include
#include
int fd=accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
sockfd=接收呼叫的socket id
addr=指向呼叫者地址结构的指针
addrlen=指向呼叫者地址结构长度的指针
fd: -1=失败,fd=读写的文件描述符
accept 阻塞当前进程,一直到socket 上的接入连接被建立起来.accept 返回文件描述符。
5.传输数据:
accept 返回的 fd 是普通文件的描述符,正常操作文件读写。
6.关闭连接:close
当一段的进程关闭了该端的 socket ,若另一端的进程在试图读数据的话,它将得到文件结束标记。
编写客户端:socket connect read/write close
1.向内核请求建立 socket :建立 Internet 域 AF_INET socket,必须是流 socket SOCK_STREAM
2.与服务器相连 connect
#include
#include
int ret=connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
sockfd= 建立连接的socket 的id
addr=指向服务器地址结构的指针
addrlen=结构的长度
ret:-1=错误,0=成功
3.正常文件读写 read/write
4.close