zoukankan      html  css  js  c++  java
  • Socket编程

    1. socket可以看成是一种特殊的文件,所以可以通用“open--read/write--close”模式来操作。
    2. socket()函数对应于普通的open()函数,用于创建一个socket。原型  intsocket(int domain, int type, int protocol);
      1. domain : 协议域/协议族(family)  
      2. type:指定socket类型  
      3. protocol :指定协议,一般默认为0,默认使用与type对应的协议
    3. bind()函数:把一个特定的地址赋给socket,即把"IP地址+端口号"与socket绑定。原型 int bind(int sockfd, conststruct sockaddr *addr, socklen_t addrlen);
      1. sockfd  :要绑定的socket
      2. addr :地址结构体。在IPV4中它的类型是:sockaddr_in ,包含协议族(指定地址类型)、端口号、IP地址。
      3. addrlen :对应的IP地址的长度。
      4. 服务器bind()的addr,要bind服务器的IP地址,一般使用127.0.0.1可以,但是如果服务器有多块网卡(多个IP),最好还是使用seraddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//INADDR_ANY指任意IP
    4. listen()、connect()函数

      1. int listen(int sockfd, int backlog);
        int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
      2. 服务器端在调用了socket()和bind()函数之后,调用listen()函数来监听socket。然后客户端调用connect()函数的时候,服务器端就能收到连接请求(服务器端调用accept()函数处理请求)。
      3. listen()函数的第一个参数即为要监听的socket描述字,第二个参数为相应socket可以排队的最大连接个数。socket()函数创建的socket默认是一个主动类型的,listen函数将socket变为被动类型的,等待客户的连接请求。
      4. connect()函数的第一个参数即为客户端的socket描述字,第二参数为服务器的socket地址,第三个参数为socket地址的长度。
    5. accept()函数:服务器端调用来接收客户端的连接请求
      1. int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
      2. 第一个参数是服务器的套接字地址,第二个参数返回客户端的协议地址,第三个是客户端协议地址的长度。
      3. accept()函数返回的是一个全新的socket,代表与返回客户端的TCP连接。
      4. 注意:accept的第一个参数为服务器的socket描述字,是服务器开始调用socket()函数生成的,称为监听socket描述字;而accept函数返回的是已连接的socket描述字。一个服务器通常通常仅仅只创建一个监听socket描述字,它在该服务器的生命周期内一直存在。内核为每个由服务器进程接受的客户连接创建了一个已连接socket描述字,当服务器完成了对某个客户的服务,相应的已连接socket描述字就被关闭。
    6.  read()、write()等 函数:连接建立完成之后,进行网络I/O操作。
      1. 常用的操作函数
      2. 原型可以查,推荐recvmsg()和sendmsg()
    7. close()函数:读写操作完成之后关闭相应的socket描述字。对应文件操作的fclose操作。
      1. 原型: int close(int fd);  fd为要关闭的套接字。
      2. close一个TCP scoket的缺省行为是把该socket标记为关闭,然后立即返回调用进程,然后该套接字就不能再被进程调用了,也就是说不能在作为write或者read函数的第一个参数。
      3. close操作只是使相应的socket描述字的引用计数-1,只有当引用计数为0时,才会触发TCP客户端向服务器发送中止连接请求。
  • 相关阅读:
    lambda表达式
    Java的MongoDB驱动及读写策略
    MongDB主从复制、复制集
    PL/SQL练习
    MySQL数据库MyISAM和InnoDB存储引擎的比较(转)
    Java的垃圾回收概述
    springMVC源码浅析
    ActiveMQ使用总结
    常用的缓存产品比较
    Nginx+tomcat负载均衡并动静态分离
  • 原文地址:https://www.cnblogs.com/CoolSummer/p/3517334.html
Copyright © 2011-2022 走看看