网络编程基本流程
安装电话机(创建套接字):
#include <sys/socket.h>
int socket(int domain, int byte, int protocol); // 如果成功,返回sockfd
分配电话号码(绑定IP地址和端口):
#include <sys/socket.h>
int bind(int sockfd, struct sockaddr *myaddr, socklen_t addrlen);
连接电话线以等待来电(套接字可接收连接):
#include <sys/socket.h>
int listen(int sockfd, int backlog);
拿起话筒(套接字接收了连接):
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
客户端安装电话机(创建套接字)的过程与服务端相同,随后直接拨打电话(发送连接请求)就可以了:
#include <sys/socket.h>
int connect(int sockfd, struct sockaddr *serv_addr, socklen_t addrlen);
编译运行hello_server.c与client_server.c:
# gcc hello_server.c -o serv
# ./serv 9190
# gcc hello_client.c -o clnt
# ./clnt 127.0.0.1 9190
Message from server: Hello World!
基于Linux的文件操作
打开文件:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *path, int flag);
关闭文件(或套接字):
#include <unistd.h>
int close(int fd);
将数据写入文件(套接字):
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t nbytes);
读取文件(套接字)中的数据:
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t nbytes);
编译运行file_wr.c和file_rd.c:
# gcc file_wr.c -o fwr
# ./fwr
file descriptor: 3
# cat data.txt
Let's go!
# gcc file_rd.c -o frd
# ./frd
file descriptor: 3
file data: Let's go!
描述符从3开始从小到大分配(因为0、1、2是分配给标准输入、输出和错误的):
# gcc fd_seri.c -o fds
# ./fds
file descriptor 1: 3
file descriptor 2: 4
file descriptor 3: 5
习题
- 套接字在网络编程中的作用是什么?为何称它为套接字?
完成网络数据传输。插头插座用来提供电力,同样,套接字是用来提供网络连接,所以给予了它这样一个象形的名字。- 在服务器端创建套接字后,回一次调用listen函数和accept函数。请比较并说明二者作用。
处于listen阶段的服务器已经做好了交换网络网络数据所需的准备工作,但并没有开放连接给客户端连(类似于餐厅装修好了,但未开业)。accept阶段循环监听,直到用客户端的连接到来。- Linux中,对套接字数据进行I/O时可以直接使用文件I/O相关函数;而在Windows中则不可以。原因为何?
Linux中套接字也是文件,因而可以通过文件I/O函数read和write进行数据传输。而Windows中则有些不同。Windows严格区分文件I/O函数和套接字I/O函数。- 创建套接字后一般会给它分配地址,为什么?为了完成地址分配需要调用哪个函数?
有了地址,客户端才有连接的目标。bind函数。- Linux中的文件描述符与Windows的句柄实际上非常类似。请以套接字为对象说明它们的含义。
Linux内部将套接字当做普通文件,Windows中的套接字是套接字句柄。- 底层文件I/O函数与ANSI标准定义的文件I/O函数之间有何区别?
底层文件I/O和ANSI标准I/O的区别- 参考示例file_wr.c和file_rd.c,分别利用底层文件I/O和ANSI标准I/O编写文件复制程序。
low_cp.c和ansi_cp.c。
我的问题
字符串保存到文件中后,文件的最后总有一个^@,在ASCII码中代表'\0'。总是会有这个东西吗?