• socket 编程


    目录:

       socket 编程

       Linux下tcp通信

    一、MSG_DONTWAIT | MSG_NOSIGNAL

    方法一、fcntl 函数可以将一个socket 句柄设置成非阻塞模式,设置之后每次的对于sockfd 的操作都是非阻塞的。

    flags = fcntl(sockfd, F_GETFL, 0); //获取文件的flags值。
    fcntl(sockfd, F_SETFL, flags | O_NONBLOCK); //设置成非阻塞模式;
    
    flags = fcntl(sockfd,F_GETFL,0);
    fcntl(sockfd,F_SETFL,flags&~O_NUNBLOCK); //设置成阻塞模式;

    方法二、recv, send 函数的最后有一个flag 参数可以设置成MSG_DONTWAIT

    临时将sockfd 设置为非阻塞模式,而无论原有是阻塞还是非阻塞。

    recv(sockfd, buff, buff_size,MSG_DONTWAIT); //非阻塞模式的消息发送
    send(scokfd, buff, buff_size, MSG_DONTWAIT); //非阻塞模式的消息接受

    注意:linux中send函数MSG_NOSIGNAL异常消息

    Linux 下当连接断开,还发送数据的时候,不仅 send() 的返回值会有反映,而且还会向系统发送一个异常消息,如果不作处理,系统会出 BrokePipe,程序会退

    出,这对于服务器提供稳定的服务将造成巨大的灾难。为此,send() 函数的最后一个参数可以设置为 MSG_NOSIGNAL,禁止 send() 函数向系统发送常消息。

    二、socket

    #include <sys/socket.h> 
    int socket(int family, int type, int protocol); //指定期望的通信协议类型,

    返回的文件描述符和套接字描述符类似,我们成为套接字描述符,简称sockfd

    AF_INET IPv4协议 SOCK_STREAM(常用) 字节流套接字 protocol:协议类型的常量或设置为0,以选择给定的family和type组合的系统默认值

    #include<arpa/inet.h>
    int inet_pton(int family,const char *strptr,void *addrptr);//成功返回1,格式不对返回0,出错返回-1

    作用:p代表表达式 n代表数值 以后所写的所有代码中都有可能会需要这个函数,所以这个函数很重要

    将char所指向的字符串,通过addrptr指针存放

    他的反函数: inet_ntop()作用相反。可以百度查阅这个函数的功能。因为例子里我们没有涉及到,就不介绍了。以后用到的时候再说

    需要注意的是:当他发生错误的时候,errno的值会被置为EAFNOSUPPORT 

    #include <sys/socket.h> 
    int connect(int sockfd,const struct sockaddr* servaddr,socklen_t addrlen);//用connect函数来建立与TCP服务器的连接
    
    #include<unistd.h>
    int close(int sockfd);//关闭socket,并终止TCP连接
    
    #include <sys/socket.h>
    int bind(int sockfd,const struct* myaddr,socklen_t addrlen);//把本地协议地址赋予一个套接字。
    //也就是将32位的IPv4或128位ipv6与16位的TCP或者UDP组合
    
    #include<sys/socket.h>
    int listen(int sockfd,int backlog)//成功返回0,失败返回-1 listen函数仅由TCP服务器调用

    listen函数将会做两件事:

      1:我们在创建套接字的时候使用了socket函数,它创建的套接字是主动套接字,bind函数的功能就是通过这个将主动套接字,变成被动套接字,

    告诉内核应该接受指向这个套接字的请求,CLOSED状态变成LISTEN状态。

      2:本函数的第二个参数规定了内核要为该套接字排队的最大连接个数。

    #include <sys/socket.h>
    int accept(int sockfd,struct sockaddr* cliaddr,socklen_t *addrlen);//成功返回描述符,失败返回-1

      1、如果第二三个参数为空,代表了,我们对客户的身份不感兴趣,因此置为NULL;

      2、第一个参数为socket创建的监听套接字,返回的是已连接套接字,两个套接字是有区别的,而且非常重要。区别:我们所创建的监听套接字

    一般服务器只创建一个,并且一直存在。

    而内核会为每一个服务器进程的客户连接建立一个连接套接字,当服务器完成对某个给定客户的服务时,连接套接字就会被关闭。

  • 相关阅读:
    线段树
    数学建模中的excel操作
    POJ 3666 Making the Grade
    POJ 1742 Coins
    CF 55D
    POJ 3280 Cheapest Palindrome
    牛客 处女座与复读机
    牛客 处女座的约会
    牛客 小a与星际探索
    POJ 2229 递推
  • 原文地址:https://www.cnblogs.com/listxue/p/12744633.html
Copyright © 2020-2023  润新知