TCP/IP网络编程

理解网络编程和套接字

网络编程就是编写程序使两台连网的计算机相互交换数据。

套接字是网络数据传输用的软件设备。

网络编程中接受连接请求的服务器端套接字创建过程如下:

  • 调用socket函数创建套接字
  • 调用bind函数分配IP地址和端口号
  • 调用listen函数转为可接收请求状态
  • 调用accept函数受理连接请求

用于请求连接的客户端套接字创建过程如下:

  • 调用socekt函数创建套接字
  • 调用connect函数向服务器端发送连接请求

对于Linux而言,socket操作与文件操作没有区别,socket也被认为是文件的一种,因此在网络数据传输的过程中,可以使用文件I/O的相关函数。

底层文件访问中“底层”可理解为“与标准无关的、操作系统独立提供的”。

使用Linux提供的文件I/O函数(而非ANSI标准定义的函数),应该理解文件描述符的概念。文件描述符是系统分配给文件或套接字的整数。

文件和套接字一般经过创建过程才会被分配文件描述符。但标准输入、标准输出及标准错误未经过特殊的创建过程,程序开始运行后也会被自动分配文件描述符。

基于文件描述符的I/O操作:

  • 打开文件:
#include <sys/types.h>
#include <sys/stat.h>
#include <funtl.h>

int open(const char* path, int flag);

open函数调用时第一个参数为目标文件名及路径信息,第二个参数是文件打开模式。调用成功时返回文件描述符,失败时返回-1。文件打开模式包括:

打开模式 含义
O_CREAT 必要时创建文件
O_TRUNC 删除全部现有数据
O_APPEND 维持现有数据,保存到其后面
O_RDONLY 只读打开
O_WRONLY 只写打开
O_RDWR 读写打开
  • 关闭文件:
#include <unistd.h>

int close(int fd);

close函数调用时参数为需要关闭的文件或套接字的文件描述符。调用成功时返回0,失败时返回-1。

  • 将数据写入文件:
#include <unistd.h>

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

write函数调用时第一个参数为目标对象的文件描述符,第二个参数为保存数据的缓存地址值,第三个参数为要传输的字节数。调用成功时返回写入的字节数,失败时返回-1。

write函数中,返回值ssize_t是通过typedef声明的unsigned int类型。对ssize_t来说,size_t前面多加的s代表signed,即ssize_t是通过typedef声明的signed int类型。通过typedef为基本数据类型赋予别名,当程序从一个平台切换到使用不同位数表示相同数据类型的另一个平台上时,仅修改并编译相应的typedef声明即可。而操作系统定义的数据类型一般会添加后缀_t。

  • 读取文件中的数据:
#include <unistd.h>

ssize_t read(int fd, void * buf, size_t nbytes);

read函数调用时第一个参数为目标对象的文件描述符,第二个参数为保存数据的缓冲地址值,第三个参数为要接收数据的最大字节数。调用成功时返回接收的字节数,失败时返回-1。

以上内容同样适用于套接字。

文件描述符一般从3开始以从小到大的顺序编号,而0、1、2是分配给标准I/O的描述符。

套接字类型与协议设置

创建套接字:

#include <sys/socket.h>
int socket( int domain, int type int protocol )
  套接字中使用的协议族(Protocol Family)信息 套接字数据传输类型信息 计算机通信中使用的协议信息  
posted @ 2020-10-20 16:39  溪嘉嘉  阅读(198)  评论(0编辑  收藏  举报