http://blog.csdn.net/hguisu/article/details/7445768/

原文:http://www.cnblogs.com/dolphinX/p/3460545.html

:http://goodcandle.cnblogs.com/archive/2005/12/10/294652.aspx

:http://www.cnblogs.com/skynet/archive/2010/12/12/1903949.html

:http://www.cnblogs.com/skynet/archive/2010/12/11/1903347.html

一.server和client整体流程(及Unix下的socket API)

1.

int socket(int domain, int type, int protocol);

根据指定的地址族、数据类型和协议来分配一个socket的描述字及其所用的资源。

domain:协议族,常用的有AF_INET、AF_INET6、AF_LOCAL、AF_ROUTE其中AF_INET代表使用ipv4地址

注: 头文件socket.h中有 #define AF_INET PF_INET

type:socket类型,常用的socket类型有SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等

protocol:协议,常用的协议有IPPROTO_TCP、IPPTOTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC等

2.

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

把一个地址族中的特定地址赋给socket

sockfd:socket描述字,也就是socket引用

addr:要绑定给sockfd的协议地址

addrlen:addr的长度

通常服务器在启动的时候都会绑定一个众所周知的地址(如ip地址+端口号),用于提供服务,客户就可以通过它来接连服务器;而客户端就不用指定,有系统自动分配一个端口号和自身的ip地址组合。这就是为什么通常服务器端在listen之前会调用bind(),而客户端就不会调用,而是在connect()时由系统随机生成一个。

3.

int listen(int sockfd, int backlog);

监听socket

sockfd:要监听的socket描述字

backlog:相应socket可以排队的最大连接个数

4.

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

连接某个socket

sockfd:客户端的socket描述字

addr:服务器的socket地址

addrlen:socket地址的长度

5.

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

TCP服务器监听到客户端请求之后,调用accept()函数取接收请求

sockfd:服务器的socket描述字

addr:客户端的socket地址

addrlen:socket地址的长度

6.

ssize_t read(int fd, void *buf, size_t count);

读取socket内容

fd:socket描述字

buf:缓冲区

count:缓冲区长度

7.

ssize_t write(int fd, const void *buf, size_t count);

向socket写入内容,其实就是发送内容

fd:socket描述字

buf:缓冲区

count:缓冲区长度

8.

int close(int fd);
socket标记为以关闭 ,使相应socket描述字的引用计数-1,当引用计数为0的时候,触发TCP客户端向服务器发送终止连接请求。

最新文章

  1. Codeforces
  2. 【leetcode】Convert Sorted List to Binary Search Tree (middle)
  3. asp.net对cookie的操作
  4. webstorm卡、闪退以及win10中jdk配置【转】
  5. Cocos2d-x中jsb结构剖析
  6. hdu 5495 LCS 水题
  7. c/c++指针基础使用
  8. sql 判断表是否存在
  9. AQL Subset Compiler:手把手教你如何写一个完整的编译器
  10. Ubuntu桌面版与服务器版有什么不同?
  11. TDD(测试驱动开发)的推广方法论
  12. 通过smtp直接发送邮件
  13. ElasticSearch 启动时加载 Analyzer 源码分析
  14. (4.10)mysql备份还原——利用binlog+全备恢复误删表【不推荐使用】
  15. tensorflow实现二分类
  16. POJ1275 Cashier Employment(差分约束)
  17. Android 程序优化总结
  18. 【代码笔记】Web-HTML-布局
  19. day6 字符串
  20. 【python36--对象】

热门文章

  1. Applied Nonparametric Statistics-lec3
  2. The 2018 ACM-ICPC Chinese Collegiate Programming Contest Moving On
  3. JavaSE——final修饰符
  4. Http协议中的get和post
  5. 解决子线程操作UI的方法
  6. java web开发基础实例(javabean+jsp+servlet+jdbc)
  7. 03009_HttpServletResponse
  8. 小甲鱼零基础入门PYTHON
  9. Sogou日志分析(hive)
  10. Java判断浏览器是微信还是支付宝