TCP/IP网络编程(1)——理解网络编程和套接字编程

  • A+
所属分类:其他教程
摘要

网络编程又称为套接字编程,为什么要用套接字?我们把插头插到插座上就能从电网获得电力供给,同样为了与远程计算机进行数据传输,需要连接到因特网,而编程中的“套接字”就是用来连接该网络的工具。它本身就带有“连接”的含义,如果将其引申,则还可以表示两台计算机之间的网络连接。

一、理解网络编程和套接字编程

1.1 socket套接字

网络编程又称为套接字编程,为什么要用套接字?我们把插头插到插座上就能从电网获得电力供给,同样为了与远程计算机进行数据传输,需要连接到因特网,而编程中的“套接字”就是用来连接该网络的工具。它本身就带有“连接”的含义,如果将其引申,则还可以表示两台计算机之间的网络连接

1.1.1 一个例子来表示TCP的网络连接

因为拨打和接听是有区别的,因此需要分开看表示

  • 接听方的流程如下:

    1. 首先需要安装一台电话机

    TCP/IP网络编程(1)——理解网络编程和套接字编程

    2. 准备好电话机后要考虑分配电话号码的问题,这样别人才能联系到自己

    TCP/IP网络编程(1)——理解网络编程和套接字编程

    TCP/IP网络编程(1)——理解网络编程和套接字编程

    3. 用blind函数给套接字分配地址后,电话机就装好了。接下来需要连接电话线并等待来电

    TCP/IP网络编程(1)——理解网络编程和套接字编程

    4. 连接好电话线后,如果有人拨打就会响铃,这时候需要拿起电话线才能对话

    TCP/IP网络编程(1)——理解网络编程和套接字编程

  • 打电话的流程如下:

    1. 和上面一样,调用socket套接字
    2. 调用connect函数

    TCP/IP网络编程(1)——理解网络编程和套接字编程

1.1.2 程序实现

所有的内容是在Linux系统下实现,因此该程序只支持Linux

服务端代码如下:

TCP/IP网络编程(1)——理解网络编程和套接字编程

客户端代码如下:

TCP/IP网络编程(1)——理解网络编程和套接字编程

实现:

代码获取:

我是用visual studio开发,在Linux虚拟机下部署文件并且实行,定位到两个文件位置,执行两个文件,注意在文件后面需要加一个端口号(这边用到9091,可以自定义5000-6535都可)

TCP/IP网络编程(1)——理解网络编程和套接字编程

1.2 文件操作

1.2.1 文件描述符

实际上,文件描述符是为了方便称呼操作系统创建的文件或套接字而赋予的

试想一下,“把那本18号书帮我打印一下” 比 “把那本叫《物联网感知、识别与控制技术》的书帮我打印一下”是不是更简介明了?

文件描述符有时也称为文件句柄,但“句柄”主要是Windows中的术语。因此,本书中如果涉及Windows平台将使用“句柄”,如果是Linux平台则用描述符

分配给标准输入输出及标准错误的文件描述符。

文件描述符 对象
0 标准输入:Standard Input
1 标准输出:Standard Output
2 标准错误:Standard Error
  • 打开文件
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int open(const char *path, int flag); /* 成功时返回文件描述符,失败时返回-1 path : 文件名的字符串地址 flag : 文件打开模式信息 */ 

文件打开模式如下表:

打开模式 含义
O_CREAT 必要时创建文件
O_TRUNC 删除全部现有数据
O_APPEND 维持现有数据,保存到其后面
O_RDONLY 只读打开
O_WRONLY 只写打开
O_RDWR 读写打开
  • 关闭文件
#include <unistd.h> int close(int fd); /* 成功时返回 0 ,失败时返回 -1 fd : 需要关闭的文件或套接字的文件描述符 */ 
  • 将数据写入文件
#include <unistd.h> ssize_t write(int fd, const void *buf, size_t nbytes); /* 成功时返回写入的字节数 ,失败时返回 -1 fd : 显示数据传输对象的文件描述符 buf : 保存要传输数据的缓冲值地址 nbytes : 要传输数据的字节数 */ 

在此函数的定义中,size_t 是通过 typedef 声明的 unsigned int 类型。对 ssize_t 来说,ssize_t 前面多加的 s 代表 signed ,即 ssize_t 是通过 typedef 声明的 signed int 类型。

  • 读取文件中的数据

与之前的write()函数相对应,read()用来输入(接收)数据。

#include <unistd.h> ssize_t read(int fd, void *buf, size_t nbytes); /* 成功时返回接收的字节数(但遇到文件结尾则返回 0),失败时返回 -1 fd : 显示数据接收对象的文件描述符 buf : 要保存接收的数据的缓冲地址值。 nbytes : 要接收数据的最大字节数 */ 
  • 我的微信公众号
  • 扫一扫关注
  • weinxin
  • 我的新浪微博号
  • 扫一扫关注
  • weinxin
小辉博客

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: