socket 使用

来源:互联网 发布:云计算技术专业 编辑:程序博客网 时间:2024/05/24 06:34
创建一个socket的函数int socket(int domain, int type, int protocol){    sockfd = socket(domain, type, protocol);}domain指定使用何种的地址类型,里面的参数定义在linux的sys/socket.h中,比较常用的有:PF_INET(协议族),AF_INET(地址族): Ipv4网络协议PF_INET, AF_INET6: Ipv6网络协议AF_UNIX, AF_LOCAL  本地进程间通讯type参数的作用是设置通信的协议类型,可能的取值如下所示:SOCK_STREAM: 提供面向连接的稳定数据传输,即TCP协议。OOB: 在所有数据传送前必须使用connect()来建立连接状态。SOCK_DGRAM: 使用不连续不可靠的数据包连接。SOCK_SEQPACKET: 提供连续可靠的数据包连接。SOCK_RAW: 提供原始网络协议存取。SOCK_RDM: 提供可靠的数据包连接。SOCK_PACKET: 与网络驱动程序直接通信。参数protocol用来指定socket所使用的传输协议编号。这一参数通常不具体设置,一般设置为0即可。设置nonblock mode{    flag = fcntl(sockfd, F_GETFL, 0)    fcntl(sockfd, F_SETFL, flag|O_NONBLOCK)    //设置成非阻塞模式;    fcntl(sockfd, F_SETFL, flags&~O_NONBLOCK); //设置成阻塞模式;}socket 的阻塞模式意味着必须要做完IO 操作(包括错误)才会返回。非阻塞模式下无论操作是否完成都会立刻返回,需要通过其他方式来判断具体操作是否成功。{    /* reuse the address */    /* 设置了reuseaddr后,服务程序停止后可立即重启*/    int32_t choice = 1;    setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR,                    &choice, sizeof (int32_t));     /* 设置非阻塞模式,关闭Nagle算法,用来提高交互的实时性*/    int32_t choice = 1;    setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY,                &choice,sizeof(int32_t));    struct sockaddr_in addr;    /* clean up */    memset(&addr,0,sizeof(struct sockaddr_in));    addr.sin_family = AF_INET;    addr.sin_port = htons(port);    /* 把点分十进制的IP转换成一个长整型(u_long)*/    if (service_type == SERVER) {    /*如果是server的话,就用inet_addr("0.0.0.0"),也就是INADDR_ANY*/    addr.sin_addr.s_addr = htonl(INADDR_ANY);    } else {        addr.sin_addr.s_addr = inet_addr(addr);    }    /* bind the socket for internet socket */    bind(sockfd,(struct sockaddr *)&addr,sizeof(struct sockaddr));} 未完,待续epoll学习:https://www.cppfans.org/1418.html           http://www.cnblogs.com/Anker/archive/2013/08/17/3263780.html
0 0
原创粉丝点击