• socket网络编程-socket()、bind()、setsockopt()、recvfrom()、sendto()函数


    socket()函数

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

    #include<sys/types.h>
    #include<sys/socket.h>
    int socket(int domain, int type, int protocol);
    
    • 1
    • 2
    • 3

    ​ 函数socket()的参数domain用于设置网络通信的域,函数socket()根据这个参数选择通信协议的族。通信协议族在文件sys/socket.h中定义。

    ​ 函数socket()的参数type用于设置套接字通信的类型,主要有SOCKET_STREAM(流式套接字)、SOCK——DGRAM(数据包套接字)等。SOCK_DGRAM:支持UDP连接(无连接状态的信息)、SOCK_STEAM:TCP连接,提供序列化的、可靠的、双向连接的字节流。

    ​ 函数socket()的第3个参数protocol用于制定某个协议的特定类型,即type类型中的某个类型。通常某协议中只有一种特定类型,这样protocol参数仅能设置为0;但是有些协议有多种特定的类型,就需要设置这个参数来选择特定的类型。

    ​ 参考链接:https://blog.csdn.net/xc_tsao/article/details/44123331

    bind()函数

    在建立套接字文件描述符成功后,需要对套接字进行地址和端口的绑定,才能进行数据的接收和发送操作。

    函数原型
    bind()函数将长度为addlen的struct sockadd类型的参数my_addr与sockfd绑定在一起,将sockfd绑定到某个端口上,如果使用connect()函数则没有绑定的必要。绑定的函数原型如下:

    #include<sys/types.h>
    #include<sys/socket.h>
    int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen);
    
    • 1
    • 2
    • 3

    ​ bind()函数有3个参数。

    ​ 第1个参数sockfd是用socket()函数创建的文件描述符。
    ​ 第2个参数my_addr是指向一个结构为sockaddr参数的指针,sockaddr中包含了地址、端口和IP地址的信息。在进行地址绑定的时候,需要弦将地址结构中的IP地址、端口、类型等结构struct sockaddr中的域进行设置之后才能进行绑定,这样进行绑定后才能将套接字文件描述符与地址等接合在一起。
    ​ 第3个参数addrlen是my_addr结构的长度,可以设置成sizeof(struct sockaddr)。使用sizeof(struct sockaddr)来设置套接字的类型和其对已ing的结构。
    ​ bind()函数的返回值为0时表示绑定成功,-1表示绑定失败。

    参考链接:https://blog.csdn.net/xc_tsao/article/details/44132965#comments_13029247

    setsockopt()函数

    setsockopt()函数用于任意类型、任意状态套接口的设置选项值,其作用和使用说明如下:

    int setsockopt(SOCKET s, int level, int optname, const char FAR *optval, int optlen);
    
    • 1

    参数说明:

    • s:

      标识一个套接口的描述字。

    • level:

      被设置的选项的级别, 目前仅支持SOL_SOCKET和IPPROTO_TCP层次,想要套接字级别上设置选项,就必须把level设置为 SOL_SOCKET。

    • optname:

      需设置的选项

    • optval:

      指向存放选项值的缓冲区。

    • optlen:

      optval 缓冲区的长度。

    • 返回值:

      若无错误发生,setsockopt()返回0。否则的话,返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()获取相应错误代码。

    参考链接:https://blog.csdn.net/c_base_jin/article/details/94353956

    recvfrom()函数

    函数说明:通过socket文件描述符从对方接受数据,用于UDP协议

    #include <winsock.h>
    int  recvfrom( SOCKET s, char FAR* buf, int len, int flags,struct sockaddr FAR* from, int FAR* fromlen);
    
    • 1
    • 2

    参数说明:

    s:标识一个已连接套接口的描述字。
    buf:接收数据缓冲区。
    len:缓冲区长度。
    flags:调用操作方式。
    from:(可选)指针,指向装有源地址的缓冲区。
    fromlen:(可选)指针,指向from缓冲区长度值。

    注释:
    本函数由于从(已连接)套接口上接收数据,并捕获数据发送源的地址。

    ​ 若from非零,且套接口为SOCK_DGRAM类型,则发送数据源的地址被复制到相应的sockaddr结构中。fromlen所指向的值初始化时为这个结构的大小,当调用返回时按实际地址所占的空间进行修改。
    如果没有数据待读,那么除非是非阻塞模式,不然的话套接口将一直等待数据的到来,此时将返SOCKET_ERROR错误,错误代码是WSAEWOULDBLOCK。用select()或WSAAsynSelect()可以获知何时数据到达。

    ​ 所以使用时要先声明一个sockaddr_in的结构变量,但是不需要初始赋值!

    ​ 这个变量就是用来接收对方的IP信息的!

    sendto()函数

    函数说明:通过socket文件描述符发送数据到对方,用于UDP协议

    ssize_t sendto (int s, const void *buf, size_t len,int flags, const struct sockaddr *to ,socklen_t tolen);
    
    • 1

    传入值说明:

    s:socket文件描述符;

    buf:发送数据的首地址;

    len:发送数据的长度;

    flags:0:默认方式发送数据;

    to:存放目的主机IP地址和端口信息;

    tolen:to的长度,可设为sizeof(struct sockaddr)

    函数返回值:

    成功:实际发送的字节数,失败:-1,失败原因存在于error中

  • 相关阅读:
    vue2常见面试题
    小程序的生命周期
    Matlab进阶绘图第29期—三角热图
    LeetCode //C - 210. Course Schedule II
    浅谈App的启动优化
    〖Python网络爬虫实战㊲〗- JavaScript 逆向实战(一)
    Logstash介绍
    Ubuntu Server版 之 共享文件 samba和NFS 两种方法
    elasticsearch小技能:地理坐标的mapping的设计
    google的chromedriver最新版下载地址
  • 原文地址:https://blog.csdn.net/qq_40177571/article/details/127552544