c++ 网络编程

标签(空格分隔): c++


建立socket

int socket(int domain,int type ,int protocol);

  • domain 通常为PF_INET,表示互联网协议(TCP/IP)
  • type 指定了Socket的类型 SOCK_STREAM(TCP),SOCK_DGRAM(UDP)
  • protocol 通常赋值为0

绑定socket

int bind(int scokfd,struct sockaddr *MyAddr,int AddrLen);

  • scokfd Socket()函数返回的Socket套接字

  • MyAddrr 指向含有本机IP地址及端口号的sockaddr类型的指针

    • sockaddr
    struct sockaddr{
    unsigned short as_family;//地址族,AF_xxx
    char sa_data[14]; //14字节的协议地址
    }
      * **sa_family** 一般为*AF_INET*,代表TCP/IP
    * **sa_data** 包含socket的IP地址和端口号
    • sockaddr_in 这个结构更加通用,与socketaddr结构体类似,且他们的指针可以互相替代
        struct sockaddr_in{
    short int sin_family;//地址族
    unsignedshort int sin_port;//端口号
    struct in_addr sin_addr;//IP地址
    unsigned char sin_zero[8];//填充0,以与 struct sockaddr大小保持一致
    }
      * **sin_family** 必须设置为*AF_INET*
    * **sin_port** 端口号
    * **sin_addr** 一个unsigned long的IP地址
    * **sin)zero** 填充0,用于与sockaddr大小保持一致

注意sin_portsin_addr需要转换成网络字节优先顺序

建立连接

面向连接的客户端程序可以使用Connect函数来配置Socket,从而与远端服务器建立一个TCP连接,其函数原型为:

int connect(int sockfd, stuct sockaddr *serv_addr ,int addrlen);

  • sockfd socket()函数返回的socket套接字
  • serv_addr 包含远端主机的IP地址和端口号的指针
  • addrlen 远端地址结构的长度
  • 当连接失败时,返回-1,并且设置错误信息

监听

服务器端程序调用listern()函数使得socket处于一个别动监听的模式,并且为这个socket建立一个输入数据队列,将到达服务器的请求保存到此队列中,直到程序处理。

int listen(int sockfd, int backlog);

  • sockfd 调用socket()函数返回的socket套接字
  • backlog 指定在请求队列中允许的最大请求数
  • 缓存队列中的请求,等待accept处理

服务器端接收

建立好缓存队列后,服务器端程序可以调用accept()函数处理客户的连接请求。

int accept(int sockfd, void *addr, int *addrlen);

  • sockfd 被监听的socket套接字
  • addr 通常是一个指向sockaddr_in变量的指针,该变量用于存储提出连接请求的主机信息
  • addrlen 通常是一个指向值为sizeof(struct sockaddr_in)的整型指针变量

数据发送和接收

面向连接的数据发送

int send(int sockfd, const void *msg, int len, int flags);

  • sockfd 监听的套接字
  • msg 指向要发送的数据
  • len 以字节为单位的数据长度
  • flags 一般设置为0
  • 返回值为实际发送出去的字节数

面向连接的数据接收

int recv(int sockfd, void *buf, int len, int flags);

  • sockfd 监听的套接字
  • buf 存放接收数据的缓冲区
  • len 以字节为单位的数据长度
  • flags 一般设置为0
  • 返回值为实际接收到的数据

无连接的数据发送

int sendto(int sockfd, const void msg, int len, int flags, const struct sockaddr to, int tolen);

这个函数比
send()
函数多了两个参数

  • to 要发送数据到的目的主机的IP地址和端口号信息
  • tolen 通常别赋值为sizeof(struct sockaddr)
  • 返回值为实际发送出去的字节数

无连接的数据接收

int recvfrom(int sockfd, void *buf, int len, int flag, struct sockaddr from, int fromlen);

这个函数比
recv()
函数多了几个参数

  • from 是一个struct sockaddr类型的变量,保存数据来源主机的IP地址和端口号
  • fromlen 一般设置为sizeof(stuct sockaddr)
  • 返回值为实际接收到的数据

关闭socket

  • 停止socket上面的全部操作

    closesocket(sockfd);

  • 关闭socket上面的某一个操作

    int shutdown(int sockfd, int how);

    how有几个可选的值

    • 0:不允许继续接收数据
    • 1:不允许接续发送数据
    • 2:不允许继续发送和接收数据

c++ 网络编程基础的更多相关文章

  1. C#网络编程基础知识

    C#网络编程基础知识一 1.IPAddress类 用于表示一个IP地址.IPAddress默认构造函数 public IPAddress(long address);一般不用 其中Parse()方法最 ...

  2. iOS开发网络篇—网络编程基础

    iOS开发网络篇—网络编程基础 一.为什么要学习网络编程 1.简单说明 在移动互联网时代,移动应用的特征有: (1)几乎所有应用都需要用到网络,比如QQ.微博.网易新闻.优酷.百度地图 (2)只有通过 ...

  3. Android 网络编程基础之简单聊天程序

    前一篇讲了Android的网络编程基础,今天写了一个简单的聊天程序分享一下 首先是服务端代码: package com.jiao.socketdemo; import java.io.Buffered ...

  4. 服务器编程入门(4)Linux网络编程基础API

      问题聚焦:     这节介绍的不仅是网络编程的几个API     更重要的是,探讨了Linux网络编程基础API与内核中TCP/IP协议族之间的关系.     这节主要介绍三个方面的内容:套接字( ...

  5. Java网络编程基础(Netty预备知识)

    今天在家休息,闲来无事,写篇博客,陶冶下情操~~~ =================我是分割线================ 最近在重新学习Java网络编程基础,以便后续进行Netty的学习. 整 ...

  6. 用Netty开发中间件:网络编程基础

    用Netty开发中间件:网络编程基础 <Netty权威指南>在网上的评价不是很高,尤其是第一版,第二版能稍好些?入手后快速翻看了大半本,不免还是想对<Netty权威指南(第二版)&g ...

  7. Linux 高性能服务器编程——Linux网络编程基础API

    问题聚焦:     这节介绍的不仅是网络编程的几个API     更重要的是,探讨了Linux网络编程基础API与内核中TCP/IP协议族之间的关系.     这节主要介绍三个方面的内容:套接字(so ...

  8. Python网络编程基础pdf

    Python网络编程基础(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1VGwGtMSZbE0bSZe-MBl6qA 提取码:mert 复制这段内容后打开百度网盘手 ...

  9. 【网络编程1】网络编程基础-TCP、UDP编程

    网络基础知识 网络模型知识 OSI七层模型:(Open Systems Interconnection Reference Model)开放式通信系统互联参考模型,是国际标准化组织(ISO)提出的一个 ...

  10. python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)

    python网络编程基础(线程与进程.并行与并发.同步与异步.阻塞与非阻塞.CPU密集型与IO密集型) 目录 线程与进程 并行与并发 同步与异步 阻塞与非阻塞 CPU密集型与IO密集型 线程与进程 进 ...

随机推荐

  1. 使用BERT模型生成token级向量

    本文默认读者有一定的Transformer基础,如果没有,请先稍作学习Transormer以及BERT. 相信网上有很多方法可以生成BERT向量,最有代表性的一个就是bert as service,用 ...

  2. Linux 反弹shell(二)反弹shell的本质

    Linux 反弹shell(二)反弹shell的本质 from:https://xz.aliyun.com/t/2549 0X00 前言 在上一篇文章 Linux反弹shell(一)文件描述符与重定向 ...

  3. Oracle 数据库中的GROUP BY与HAVING

    一.GROUP BY GROUP BY语句用来与聚合函数(aggregate functions such as COUNT, SUM, AVG, MIN, or MAX.)联合使用来得到一个或多个列 ...

  4. jquery中ajax跨域加载

    今天学习ajax跨域加载,先来一段代码,异步加载的链接是爱奇艺的开源,我直接拿来用作测试 <!DOCTYPE html> <html lang="en"> ...

  5. Default Trace 查找日志文件快速增长的原因

    select loginname, loginsid, spid, hostname, applicationname, servername, databasename, objectname, e ...

  6. Mybatis 入门 (二)

    1. Mapper配置文件处理特殊字符 用 > 和 &It; 代替 > 和 < 2. 延迟加载 单表查询性能比多表关联查询要高得多,即先查询单表,如果需要关联多表时再进行查询 ...

  7. WinDbg的安装、配置和功能

    一.WinDbg简介 WinDbg是微软发布的一款免费而十分强大的调试工具.既然是微软自己发布的调试工具,那它对微软产品的调试当然是十分的强大.Windows 调试器 (WinDbg) 可用于调试内核 ...

  8. qt加快编译速度

    菜单栏->工具-> 选项->构建与运行->构建套件->点击自动检测内容->在同一页面找到 Environment ->点击change ->在弹出的窗口 ...

  9. C# 跨域 请求带cookie

    原文:https://blog.csdn.net/z69183787/article/details/78954325 背景: 别个的项目,要开发App接口,要求用前端AJAX的方式访问接口数据. 后 ...

  10. codevs1580单词游戏

    题目描述中说: 单词为at,k=8则新单词为ib 推移规则是:如果k为正数则下推,否则上推,当推移超越边界时回到另一端继续推移. 但在我做题时发现: 这个描述与数据所要求的是完全相反的!!!! 样例1 ...