• 计算机网络 实验之 socket编程之 send()/recv()和write()/read():发送数据和接收数据


    在 Linux 和 Windows 平台下,使用不同的函数发送和接收 socket 数据,下面我们分别讲解。

    Linux下数据的接收和发送

    Linux 不区分套接字文件和普通文件,使用 write() 可以向套接字中写入数据,使用 read() 可以从套接字中读取数据。

    前面我们说过,两台计算机之间的通信相当于两个套接字之间的通信,在服务器端用 write() 向套接字写入数据,客户端就能收到,然后再使用 read() 从套接字中读取出来,就完成了一次通信。

    write() 的原型为:

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

    fd 为要写入的文件的描述符,buf 为要写入的数据的缓冲区地址,nbytes 为要写入的数据的字节数。

    size_t 是通过 typedef 声明的 unsigned int 类型;ssize_t 在 "size_t" 前面加了一个"s",代表 signed,即 ssize_t 是通过 typedef 声明的 signed int 类型。

    write() 函数会将缓冲区 buf 中的 nbytes 个字节写入文件 fd,成功则返回写入的字节数,失败则返回 -1

    read() 的原型为:

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

    fd 为要读取的文件的描述符,buf 为要接收数据的缓冲区地址,nbytes 为要读取的数据的字节数。

    read() 函数会从 fd 文件中读取 nbytes 个字节并保存到缓冲区 buf,成功则返回读取到的字节数(但遇到文件结尾则返回0),失败则返回 -1。

    Windows下数据的接收和发送

    Windows 和 Linux 不同,Windows 区分普通文件和套接字,并定义了专门的接收和发送的函数。

    服务器端发送数据使用 send() 函数,它的原型为:

    int send(SOCKET sock, const char *buf, int len, int flags);

    sock 为要发送数据的套接字,buf 为要发送的数据的缓冲区地址,len 为要发送的数据的字节数,flags 为发送数据时的选项

    返回值和前三个参数不再赘述,最后的 flags 参数一般设置为 0 或 NULL,初学者不必深究。

    客户端接收数据使用 recv() 函数,它的原型为:

    int recv(SOCKET sock, char *buf, int len, int flags);
  • 相关阅读:
    如何将jar包加入到Maven本地仓库
    dubbo 常见错误
    关于spring”通配符的匹配很全面, 但无法找到元素 'context:component-scan' 的声明“的错误
    Maven类包冲突终极三大解决技巧 mvn dependency:tree
    springMVC传对象参数
    scp 对拷文件夹 和 文件夹下的所有文件 对拷文件并重命名
    CATALINA_BASE与CATALINA_HOME的区别
    有return的情况下try catch finally的执行顺序(最有说服力的总结)
    Slf4j MDC 使用和 基于 Logback 的实现分析
    Docker 系列01: Centos7.3 上安装docker
  • 原文地址:https://www.cnblogs.com/wsy107316/p/14206795.html
Copyright © 2020-2023  润新知