1.socket库的2.2版本的文件:

  dll文件:ws2_32.dll

  lib文件:ws2_32.lib

  头文件:<WINSOCK2.H>

2.socket库的初始化和卸载

  2.1-初始化socket库

    int WSAStartup (

  WORD wVersionRequested, //请求使用的库的版本

LPWSADATA lpWSAData  //返回可用的库的信息

    );

  2.2-卸载socket库

    WSACleanup();

  2.3-MFC提供了一个AfxSocketInit函数,该函数内部自动调用了WSAStartup函数和WSACleanup函数,利用该函数加载和卸载socket库时,不需要为工程连接ws2_32.lib库文件,仅需包含头文件:#include <Afxsock.h>,且必须在应用的程序类的InitInstance函数中调用该函数,该函数加载的是1.1版本的socket库;

    BOOL AfxSocketInit( WSADATA* lpwsaData = NULL );

    返回值:函数调用成功返回非0值,调用失败返回0;

3.TCP通信

  3.1-TCP服务器

    1--创建服务器端socket

      SOCKET socket (int af, int type, int protocol);

        af:指定地址族,AF_UNIX/AF_LOCAL/AF_FILE--本地通信;AF_INET--网络通信IPv4(主用);AF_INET6--网络通信IPv6(前缀AF替换成PF效果一样);

        type:指定socket类型,SOCK_STREAM--流式套接字,SOCK_DGRAM--数据报式套接字;

        protocol:推荐为0;

      函数返回值:成功返回socket描述符;失败返回一个INVALID_SOCKET值,错误信息可通过WSAGetLastError函数返回;

    2--绑定IP地址和端口(bind)

      int bind (SOCKET s, const struct sockaddr FAR*  name, int namelen);

        s:要绑定的套接字;

        name:指定该套接字的通信地址信息,指向sockaddr结构体或sockaddr_un结构体或sockaddr_in结构体的指针变量;

        nameLen:指定地址结构的长度;

      函数返回值:成功返回0;失败返回一个SOCKET_ERROR,错误信息可通过WSAGetLastError函数返回;

      通信地址包括结构体:

        struct sockaddr  --主要用于做函数的参数,不负责存储数据;

          struct sockaddr {

          unsigned short   sa_family;  //指定地址族

           char             sa_data[14];  //要求一块内存分配区,起占位作用

          };

        struct sockaddr_in  --负责存储网络通信的地址数据

          struct sockaddr_in{

           short            sin_family;  //指定地址族

           unsigned short      sin_port;  //端口号

          struct   in_addr      sin_addr;  //主机IP地址

          char               sin_zero[8];

          };

          注:若本地机器具有多个网卡,则每个网卡均有自己的IP地址,可将IP地址指定为INADDR_ANY,允许向分配给本地机器的各个IP地址发送或接收数据;

    3--监听(listen)

      int listen ( SOCKET s, int backlog );

        s:套接字;

        backlog:SOMAXCONN,设置等待队列的最大长度(可接收的请求个数);

    4--等待客户端连接并接受(accept)

      SOCKET accept ( SOCKET s, struct sockaddr FAR* addr, int FAR* addrlen );

        s:套接字;

        addr:指向一个缓冲区,该缓冲区用来保存服务器端接受的发起连接的客户端的IP地址信息和端口信息;

        addrlen:返回包含地址信息的长度;

      函数返回值:成功返回socket描述符;失败返回一个INVALID_SOCKET值,错误信息可通过WSAGetLastError函数返回;

    5--数据收发(send/recv)

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

        s:套接字;

        buf:指向一个缓冲区,该缓冲区包含将要传递的数据;

        len:缓冲区的长度;

        flags:设为0;

      int recv ( SOCKET s, char FAR* buf, int len, int flags );

        s:套接字;

        buf:指向一个缓冲区,用来保存接收的数据;

        len:缓冲区的长度;

        flags:设为0;

    6--关闭socket

      int closesocket ( SOCKET s );

    通过netstat -an,查看网络端口状态

  

  3.2-TCP客户端

    1--创建客户端socket

    2--连接服务器,如果是本机 inet_addr("127.0.0.1");

      int connect ( SOCKET s, const struct sockaddr FAR*  name, int namelen );

        s:套接字;

        name:设定连接的服务器端地址信息;

        namelen:指定服务器端地址的长度;

    3--数据收发(send/recv)

    4--关闭socket

4.UDP通信

  4.1-UDP服务器

    1--创建服务器端socket

    2--绑定IP地址和端口(bind)

    3--数据收发  recvfrom/sendto

      int recvfrom ( SOCKET s, char FAR* buf, int len, int flags, struct sockaddr FAR* from, int FAR* fromlen );

        s:套接字;

        buf:指向一个缓冲区,用来接收数据;

        len:缓冲区的长度;

        flags:设为0;

        from:指向地址结构体,用来接收发送数据方的地址信息;

        fromlen:调用前须给一个初始值,函数调用后会返回地址结构的大小;

      int sendto ( SOCKET s, const char FAR * buf, int len, int flags, const struct sockaddr FAR * to, int tolen );

        s:套接字;

        buf:指向一个缓冲区,包含将要发送的数据;

        len:指定缓冲区中数据的长度;

        flags:设为0;

        to:可选指针,指定目标套接字的地址;

        tolen:参数to指定的地址的长度;

    4--关闭socket

  4.2-UDP客户端

    1--创建客户端socket

    2--数据收发  sendto/recvfrom

    3--关闭socket

5.IP地址格式和端口格式的转换

  5.1-IP地址格式的转换

    将点分十进制的IP地址转为十六进制的格式:

      unsigned long inet_addr ( const char FAR * cp );

    将IP地址从十六进制转为点分十进制的格式:

      char FAR * inet_ntoa ( struct in_addr in );

  5.2-端口格式的转换

    将本机端口的整数格式转为TCP/IP网络整数格式:

      u_short htons ( u_short hostshort );  //16位

      u_long htonl ( u_long hostlong );  //32位

    将端口的网络整数格式转为本地端口的整数格式:

      u_short ntohs ( u_short netshort );

  5.3-主机名<-->IP地址

    5.3.1主机名转换为IP地址

      函数gethostbyname从主机数据库中获取主机名相对应的IP地址;

      struct hostent FAR * gethostbyname ( const char FAR * name );

        name:指向一个主机名字符串;

      返回值:函数返回hostent结构体类型的指针,该结构体类型的定义如下:

        struct hostent {

         char FAR *       h_name;

         char FAR * FAR * h_aliases;

         short            h_addrtype;

         short            h_length;

         char FAR * FAR * h_addr_list;

        };

        该结构体的最后一个成员h_addr_list是一个指针数组,它的每个元素都是一个字符指针,指向内存中存放的一个个点分十进制表示的主机IP地址,一台主机可能会有多个IP地址;

    5.3.2IP地址转换为主机名

      函数gethostbyaddr将根据指定的IP地址获取相应的主机信息;

      struct HOSTENT FAR * gethostbyaddr (

         const char FAR * addr,

         int len,

         int type

      );

          addr:是一个指向点分十进制类型的IP地址的指针;

          len:地址长度;对于AF_INET地址族,长度必须为4个字节;

          type:地址类型,Windows平台下必须设为AF_INET;

      返回值:函数也是返回hostent结构体类型的指针,结构体中的h_name数据成员就是主机名;

转载于:https://www.cnblogs.com/zhouwanqiu/p/6919282.html

使用基本的socket函数相关推荐

  1. socket()函数详解!

    函数原型 socket()函数的原型如下,这个函数建立一个协议族为domain.协议类型为type.协议编号为protocol的套接字文件描述符.如果函数调用成功,会返回一个标识这个套接字的文件描述符 ...

  2. socket函数介绍

    文章目录 1 socket函数介绍 1 socket函数介绍 #include <sys/types.h> /* See NOTES */ #include <sys/socket. ...

  3. C语言 socket listen()函数(socket()函数创建的socket(套接字描述符)默认是一个主动类型的,listen函数将socket变为被动类型的,等待客户的连接请求)

    摘要:listen函数使用主动连接套接口变为被连接套接口,使得一个进程可以接受其它进程的请求,从而成为一个服务器进程.在TCP服务器编程中listen函数把进程变为一个服务器,并指定相应的套接字变为被 ...

  4. C语言socket()函数解析(创建套接字)af地址族,ip地址类型(Address Family)INET(Inetnet)PF(Protocol Family)

    文章目录 Linux 下的 socket() 函数 1) af 为地址族(Address Family),也就是 IP 地址类型 2) type 为数据传输方式/套接字类型 3) protocol 表 ...

  5. python socket.socket()函数 套接字详解及TCP、UDP程序示例(粘包等)

    文章目录 socket的定义 套接字的工作流程 socket函数使用 socket函数用法 服务端套接字函数 客户端套接字函数 公共用途的套接字函数 面向文件的套接字方法 打电话的流程演示 服务端.p ...

  6. socket()函数用法详解:创建套接字

    不管是 Windows 还是 Linux,都使用 socket() 函数来创建套接字.socket() 在两个平台下的参数是相同的,不同的是返回值. 在<socket是什么>一节中我们讲到 ...

  7. linux c之解决使用socket函数返回为0的问题

    1.问题: 在 linux 平台下 写socket,实现简单的tcp通信,服务端第一次调用 socket函数返回 0 2.找原因: 我的代码是这样写的 if ((server_sockfd = soc ...

  8. 三次握手 四次握手 与socket函数的关系

    我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠so ...

  9. python中用socket检测端口_python基于socket函数实现端口扫描

    本文实例为大家分享了python基于socket实现端口扫描的具体代码,供大家参考,具体内容如下 自学Python一段时间,写个端口扫描器练练手.有什么不足之处,请见谅 这是基于socket函数对端口 ...

  10. Python批量检测服务器端口可用性与Socket函数使用

    socket函数 简述 socket又称套间字或者插口,是网络通信中必不可少的工具.有道是:"无socket,不网络".由于socket最早在BSD Unix上使用,而Unix/L ...

最新文章

  1. iOS获取webView的内容或修改网页上的内容
  2. linux 三大利器 grep sed awk sed
  3. Cocos Creator实战教程(5)】——打砖块(物理引擎,碰撞检测)
  4. Java8中使用以下类计算日期时间差:Period、Duration、ChronoUnit
  5. 【DotNetMLLearn】.NET Core人工智能系列-概述
  6. Linux 命令之 xz -- POSIX 平台的具有高压缩率的压缩工具
  7. java炫舞_Java 炫舞按键功能 DancingPlay (整理)
  8. 随想录(docker应用)
  9. 用Java设计一个通讯录,保存读者的信息。
  10. 最好用的个人财务管理工具 Money Pro 2.7.4中文版
  11. php网络编程socket通讯
  12. R语言dplyr入门到进阶
  13. 数字图像处理——第三章 灰度变换与空间滤波
  14. carbon安装win7 thinkpad x1_ThinkPad X1 carbon笔记本Win7重装系统步骤详细教程。 重装系统...
  15. 计算机硬件系统的五大基本组成部分分别是,计算机的硬件系统由几大部分构成,分别包括哪些硬件,基本功能是什么?...
  16. 怎样设置一个函数C语言,C语言中怎样编写一个函数 如何在C语言中定义一个函数?...
  17. 习题4-10 猴子吃桃问题
  18. PS色彩算法理解记录 4 Screen
  19. jacob解决freemaker下载的word文档手机无法打开问题
  20. 小项目不适合微服务?别扯犊子了!

热门文章

  1. html canvas抽奖,HTML5 Canvas圆盘抽奖应用(适用于Vue项目)
  2. 湖南网络推广教大家如何“挽回”网站被降权的排名和权重?
  3. 网络推广离不开关键词的精准挖掘
  4. 网络推广——网络推广优化基础问题必须明确
  5. 网站被k不要慌,看看“老油条”们是怎么解决的吧!
  6. 注重网站用户体验优化就要避开前方弯道
  7. 浅析SEO网站优化的三点高质量外链优化技巧
  8. mysql error manager,MYSQL Starting MySQL. ERROR! Manager of pid-file quit without updating file
  9. MiguelCatalan/MaterialSearchView
  10. 机器学习 不均衡数据的处理方法