SOCKET网络编程

socket网络通信

socket能够解决的问题是客户端和服务器端进行交流的问题

服务器server

  1. socket() 的作用是创建一个端点,然后返回一个fd指向这个端点。包括分配fd和分配tcb进程控制块两。接受三个参数需要指定通信域 domain(AF_INET, AF_INET6)、指定通信语义type(SOCK_STREA,SOCK_DGRAM)、指定通信协议protocol(0代表为通信语义进行默认的协议配置),返回一个fdfd是以bitmap实现的。

    int fd = socket(AF_INET, SOCK_STREAM, 0);
    
  2. bind()的作用是将地址绑定到对应fdtcb控制块上,这是因为socket分配之后,会存在一个命令空间(地址族),接受三个参数fd,地址,地址长度。

    struct sockaddr_in server; // 声明一个IPV4地址类型
    socklen_t len = sizeof(server);
    memset(&server, 0 , sizeof(server));
    server.sin_family = AF_INET;
    server.sin_port = htons(port);
    server.sin_addr.s_addr = inet_addr(IP);
    bind(fd, (struct sockaddr*)&server, &len);
    
  3. listen()的作用是使socket监听连接,接受两个参数fdbacklogbacklog指针最多挂起几个tcp连接。

    listen(fd, 10);
    
  4. accept( )的作用使接受完成的tcp连接,接受三个参数,服务端fd和客户端地址和客户长度,返回客户fd

    struct sockaddr_in server; // 声明一个IPV4地址类型
    socklen_t len = sizeof(server);
    memset(&server, 0 , sizeof(server));
    int clientfd = accept(fd, (struct sockaddr*)&client, &c_len);
    

客户端client

  1. socket()

    int fd = socket(AF_INET, SOCK_STREAM, 0);
    
  2. bind(),客户端可以进行bind,也可以不进行bind,不bind的话会默认分配地址和端口。

    struct sockaddr_in client; // 声明一个IPV4地址类型
    socklen_t len = sizeof(client);
    memset(&server, 0 , sizeof(client));
    server.sin_family = AF_INET;
    server.sin_port = htons(port);
    server.sin_addr.s_addr = inet_addr(IP);
    bind(fd, (struct sockaddr*)&client, &len);
    
  3. connect()的作用是将sockfd与对应地址fd进行连接,接受三个参数fd,地址,地址长度,返回0表示连接成功。

    struct sockaddr_in server; // 声明一个IPV4地址类型
    socklen_t len = sizeof(server);
    memset(&server, 0 , sizeof(server));
    server.sin_family = AF_INET;
    server.sin_port = htons(port);
    server.sin_addr.s_addr = inet_addr(IP);
    connect(fd, (struct sockaddr*)&server, &len)
    

注意

  1. 端口一旦被绑定,无法再次绑定

  2. 执行listen,可以通过netstat查看状态

  3. 进入listen,并且会产生新连接状态

  4. iotcp连接状态

  5. 一个fd对应一个tcp连接,唯一标识了一个客户

  6. int clientfd = accept(sockfd, (struct sockaddr*) &client, (socklen_t*)sizeof(client));这里对右值进行强转指针,那么右值会释放掉,那么指针就是未定义,所以要前面就开始定义。

  7. sudo fuser -k 2000/tcp杀死所有2000端口的tcp连接

  8. 没有accept就需要将fd IOtcp连接分开讲,有accept之后fd IOtcp连接就相同声明周期,已建立TCP连接但是阻塞在accept()

  9. IO就是一个fd,如果一个线程一个fd那么会产生很大的问题

  10. stdin, stdout, stderror分别是0,1,2fd,其它新建的连接会从3开始递增

posted @ 2024-07-24 16:40  LemHou  阅读(38)  评论(0)    收藏  举报