使用基本的socket函数

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数据成员就是主机名;

时间: 2024-11-03 03:26:37

使用基本的socket函数的相关文章

php socket函数详解

转自:http://blog.163.com/[email protected]/blog/static/2889641420138213514298/ 最近在用socket实现服务端向客户端主动推送消息函数名 描述socket_accept() 接受一个Socket连接socket_bind() 把socket绑定在一个IP地址和端口上socket_clear_error() 清除socket的错误或最后的错误代码socket_close() 关闭一个socket资源socket_connec

socket()函数介绍

socket()函数介绍 socket函数介绍 函数原型 domain type protocol errno 示例 函数原型 socket()函数的原型如下,这个函数建立一个协议族为domain.协议类型为type.协议编号为protocol的套接字文件描述符.如果函数调用成功,会返回一个标识这个套接字的文件描述符,失败的时候返回-1. #include<sys/types.h> #include<sys/socket.h> int socket(int domain, int

PHP Socket实现websocket(二)Socket函数

PHP socket函数和C风格的Socket函数差不多 Socket函数:http://php.net/manual/en/book.sockets.php 服务器端: <?php set_time_limit(0);    $server_socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);    socket_bind($server_socket, '127.0.0.1', '1212');    socket_listen($se

使用socket()函数创建套接字

在Linux中,一切都是文件,除了文本文件.源文件.二进制文件等,一个硬件设备也可以被映射为一个虚拟的文件,称为设备文件.例如,stdin 称为标准输入文件,它对应的硬件设备一般是键盘,stdout 称为标准输出文件,它对应的硬件设备一般是显示器.对于所有的文件,都可以使用 read() 函数读取数据,使用 write() 函数写入数据. “一切都是文件”的思想极大地简化了程序员的理解和操作,使得对硬件设备的处理就像普通文件一样.所有在Linux中创建的文件都有一个 int 类型的编号,称为文件

深入浅出Linux工具与编程(socket 函数)

1.   基本套接字函数 (1)socket函数原型 socket(建立一个socket文件描述符) 所需头文件 #include <sys/types.h> #include <sys/socket.h> 函数说明 建立一个socket文件描述符 函数原型 int socket(int domain, int type, int protocol) 函数传入值 domain AF_INET:IPv4协议 AF_INET6:IPv6协议 AF_LOCAL:Unix域协议 AF_RO

常用socket函数

关于socket函数,每个的意义和基本功能都知道,但每次使用都会去百度,参数到底是什么,返回值代表什么意义,就是说用的少,也记得不够精确.每次都查半天,经常烦恼于此.索性都弄得清楚.通透,并记录下来,一来便于自己记忆,再者以防日后查阅.回顾. 主要介绍:socket.bind.listen.connect.accept.send.sendto.recv.recvfrom.close.shutdown 网络中的进程是通过socket来通信的,那什么是socket呢?socket起源于Unix,而U

C函数篇(socket函数)

简述 创建一个套接口. #include <winsock.h> SOCKET PASCAL FAR socket( int af, int type, int protocol); af:一个地址描述.目前仅支持AF_INET格式,也就是说ARPA Internet地址格式. type:新套接口的类型描述. protocol:套接口所用的协议.如调用者不想指定,可用0指定,表示缺省. 注释       socket()函数用于根据指定的地址族.数据类型和协议来分配一个套接口的描述字及其所用的

socket 函数

socket 函数 system Call socket 函数原型: int socket(int addressfamily, int type, int protocol); 参数adressfamily 举例 adress family种类 功能描述 AF_INET IPV4用socket AF_INET6 IPV6用socket AF_UNIX 本地进程间通信用socket,也叫AF_LOCAL AF_PACKET driver lebel socket的接口 参数type 举例 typ

c/c++ socket函数详解

c/c++ socket函数详解 注意: 使用socketAPI前,要先将相关链接库(Ws2_32.lib)加入链接,并使用WSAStartUp函数初始化.每个socket函数都可能失败(返回-1),需要判断结果 socket分成两种: 一种专门用来监听新链接(或新活动),这种socket叫做master socket,一般只存在于服务器 一种专门用来收发数据,这种socket叫做connected socket,客户端和服务器都存在 int socket(int af,int type,int

C/C++网络编程2——socket函数

本节主要介绍创建套接字的socket函数. #include <sys/socket.h> int socket(int domain, int type, int protocol); // 创建成功返回文件描述符,创建失败返回-1 domain : 套接字中使用的协议族 PF_INET : IPv4互联网协议族,常用的是这个 PF_INET6 : IPv6互联网协议族 PF_LOCAL : 本地通信的UNIX协议族 PF_PACKET : 底层套接字的协议族 PF_IPX : IPX No