• socket编程 做一回文抄公


    socket接口是TCP/IP网络的APIsocket接口定义了许多函数或例程,程序员能够用他们来研发TCP/IP网络上的应用程式。要学Internet上的TCP/IP网络编程,必须理解socket接口。

    socket接口设计者最先是将接口放在Unix操作系统里面的。假如了解Unix系统的输入和输出的话,就很容易了解Socket了。网络的socket数据传输是一种特别的I/Osocket也是一种文档描述符。socket也具备一个类似于打开文档的函数调用socket(),该函数返回一个整型的socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。常用的socket类型有两种:SOCK_STREAMSOCK_DGRAM。STREAM是一种面向连接的socket,针对于面向连接的TCP服务应用;数据报式socket是一种无连接socket,对应于无连接的UDP服务应用。 

    使用socket进行网络编程,首先需要创建一个socket,创建一个tcp类型socket的代码如下:

     

    int fd = socket(AF_INET, SOCK_STREAM, 0);

    创建socket后,为了使用这个fd还需要为它绑定ip地址,代码如下:

    sockaddr_inaddr;

    addr.sin_family = AF_INET;

    addr.sin_port = 0;

    addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

    int err = bind(fd, (sockaddr*)&addr, sizeof(socketaddr_in));

    ipv4版本的socket编程中,网络地址用 sockaddr_in来表示:

     struct sockaddr_in{

         shorts in_family;

         /*Addressfamily一般来说AF_INET(地址族)PF_INET(协议族)*/

         unsigned shorts in_port;

         /*in_port必须采用网络数据格式,可以用htons()转换成网络数据格式*/

         struct in_addr sin_addr; /*ip 地址*/

         unsigned char sin_zero[8];

         /*没有实际意义,只是为了跟SOCKADDR结构在内存中对齐*/

     };

     struct in_addr{

         union{

             struct{unsigned char s_b1,s_b2,s_b3,s_b4;}S_un_b;

             struct{unsigned short s_w1,s_w2;}S_un_w;

             unsigned long S_addr;

         }S_un;

     };

    使用bind函数将fd和地址绑定到一起:

     int bind(int fd, const struct sockaddr * address, socklen_t address_len);

    bind之后,就可以使用这个socket进行网络通信。

    sockaddr_inaddraddr.sin_family = AF_INET;

    addr.sin_port=htons(PORT);

    addr.sin_addr.s_addr = inet_addr(SERVER_IP);

    interr = connect(fd, (sockaddr*)&addr, sizeof(addr));

    connect函数原型:

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

     

    参数说明:

    serv_addr:远端服务器地址

     addrlen:描述地址的结构体sockadd_in的长度

     

    返回值:如果函数执行成功,返回值为0,否则为非0

    远端服务器接收连接的代码如下:

    int err = listen(fd, 5);

    sockaddr_in addr;

    int len = sizeof(addr);

    err = accept(fd, (sockaddr*)&addr, &len);

    listen函数原型:

     int listen(intsockfd,int backlog);

    参数说明:

     sockfd:一个已绑定未被连接的套接字描述符

     

     backlog:连接请求队列(queue of pending connections)的最大长度(一般由2

    TCP协议下发送数据的代码如下:

    int len = send(fd, buf, len, 0);

    send函数原型:

     int send(int sockfd, const void * buff, size_t nbytes, int flags);

    参数说明:

     sockfd:指定发送端套接字描述符。

     buff:存放要发送数据的缓冲区

     nbytes:实际要改善的数据的字节数

     flags:一般设置为0

     

    返回值:若无错误发生,send()返回所发送数据的总数(请注意这个数字可能小

    TCP协议下接受数据的代码如下:

    int len = recv(fd, buff, nbytes, 0);

    recv函数原型:

     int recv(int sockfd, void * buff, size_t nbytes, int flags);

    参数说明:

         sockfd:接收端套接字描述符

         buff:用来存放recv函数接收到的数据的缓冲区nbytes:指明buff的长度  

     

         flags:一般置为0

    UDP协议下发送数据的代码如下:

    int len = sendto(s,buffer,len,0,&addr,addr_len);

     

    sendto函数原型:

    int sendto(int fd, char * buf, int len, int flags,

                const struct sockaddr * to, int tolen);

    参数说明:

     fd:套接字

     buf:待发送数据的缓冲区

     size:缓冲区长度

     flags:调用方式标志位, 一般为0, 改变flags,将会改变sendto发送的形式

     addr:目的地址

     

     len:描述地址的结构体sockadd_in的长度

    UDP协议下接受数据的代码如下:

    int len = recvfrom(fd,buf,buflen,0,(sockaddr*)&addr,&len);

    recvfrom函数原型:

     int recvfrom(int fd, void * buf,int len, unsigned int flags,

                  struct sockaddr * from, socket_t * fromlen);

    参数说明:

         fd:标识一个已连接套接口的描述字。

         buf:接收数据缓冲区。

         len:缓冲区长度。

         flags:调用操作方式。

         from:(可选)指针,指向保存发送地址的缓冲区。用于返回发送地址

     

         fromlen:(可选)指针,指向from缓冲区长度值。

     

     

     

     

    self.processlagerbuf

  • 相关阅读:
    postgresql 简单入门
    自用 docker-compose
    前后端分离 开发环境通过CORS实现跨域联调
    导出 java.io.IOException: 权限不够
    mysql 数值与字符类型 长度梳理
    easyui input未设id导致的问题
    springmvc处理url请求步骤
    js中的变量提升(hoisting)
    auto semicolon insertion 自动分号补齐的坑
    $.ajax dataType设置为json 回调函数不执行
  • 原文地址:https://www.cnblogs.com/qianqians/p/4186207.html
Copyright © 2020-2023  润新知