Chap.1 理解网络编程和套接字

网络编程基本流程

安装电话机(创建套接字):

#include 
int socket(int domain, int byte, int protocol);    // 如果成功,返回sockfd

分配电话号码(绑定IP地址和端口):

#include 
int bind(int sockfd, struct sockaddr *myaddr, socklen_t addrlen);

连接电话线以等待来电(套接字可接收连接):

#include 
int listen(int sockfd, int backlog);

拿起话筒(套接字接收了连接):

#include 
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);



客户端安装电话机(创建套接字)的过程与服务端相同,随后直接拨打电话(发送连接请求)就可以了:

#include 
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 
#include 
#include 
int open(const char *path, int flag);

关闭文件(或套接字):

#include 
int close(int fd);

将数据写入文件(套接字):

#include 
ssize_t write(int fd, const void *buf, size_t nbytes);

读取文件(套接字)中的数据:

#include 
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


习题

  1. 套接字在网络编程中的作用是什么?为何称它为套接字?
    完成网络数据传输。插头插座用来提供电力,同样,套接字是用来提供网络连接,所以给予了它这样一个象形的名字。
  2. 在服务器端创建套接字后,回一次调用listen函数和accept函数。请比较并说明二者作用。
    处于listen阶段的服务器已经做好了交换网络网络数据所需的准备工作,但并没有开放连接给客户端连(类似于餐厅装修好了,但未开业)。accept阶段循环监听,直到用客户端的连接到来。
  3. Linux中,对套接字数据进行I/O时可以直接使用文件I/O相关函数;而在Windows中则不可以。原因为何?
    Linux中套接字也是文件,因而可以通过文件I/O函数read和write进行数据传输。而Windows中则有些不同。Windows严格区分文件I/O函数和套接字I/O函数。
  4. 创建套接字后一般会给它分配地址,为什么?为了完成地址分配需要调用哪个函数?
    有了地址,客户端才有连接的目标。bind函数。
  5. Linux中的文件描述符与Windows的句柄实际上非常类似。请以套接字为对象说明它们的含义。
    Linux内部将套接字当做普通文件,Windows中的套接字是套接字句柄。
  6. 底层文件I/O函数与ANSI标准定义的文件I/O函数之间有何区别?
    底层文件I/O和ANSI标准I/O的区别
  7. 参考示例file_wr.c和file_rd.c,分别利用底层文件I/O和ANSI标准I/O编写文件复制程序。
    low_cp.c和ansi_cp.c。


我的问题

字符串保存到文件中后,文件的最后总有一个^@,在ASCII码中代表'\0'。总是会有这个东西吗?

附录

Github

你可能感兴趣的:( Chap.1 理解网络编程和套接字)