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客户端向服务器发送中止连接请求。

转载于:https://www.cnblogs.com/CoolSummer/p/3517334.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值