(1):TCP网络编程

我们注意到服务端与客户端通信时是通过客户端的套接字相互通信的,那么服务端的套接字主要是干什么用的呢?

TCP服务端设置监听套接字时

int listen(int sock,int backlog);

会一直阻塞在此函数,等待客户端的连接请求。其中 backlog 是设置等待连接请求的队列大小;

当有多个客户端连接一个服务端时,在某个客户端请求连接,直到服务端受理连接时,服务端处于等待连接请求的状态。

客户端请求连接的状态,本身也是一种往网络中发送数据,所以此时服务端想要接收这种数据,就需要套接字,这就是服务端的套接字了。

当多个客户端向某个服务端来请求连接时,服务端套接字一次只能处理一个客户端,所以服务端套接字会把这些请求放入等待连接请求的队列中,队列的大小是由 backlog设置的。当服务端准备好了后,从等待连接请求的队列中取出一个客户端,接受连接。

服务端套接字就像是一个门卫,只是用来处理来自客户端的连接的,(接收此时的数据),并不用来和客户端通信。

服务端与客户端的通信是通过什么方式呢?

当有一个客户端往服务端请求连接时,客户端的请求放在请求连接队列中,当服务端开始处理客户端的连接时,使用

int accept(int sock,struct sockaddr* addr,socklen_t* addrlen) 函数。

该函数调用成功时,会产生一个用于服务端与客户端通信的数据IO套接字,并且返回其文件描述符,通过这个文件描述符,我们就可以和客户端通信了,姑且把这个文件描述符称为服务端的客户端的套接字了。

有了这个文件描述符,我们就可以用read(...),write(...)等函数往这个文件描述符里读和写消息了。

服务端与客户端的断开?

断开服务端与客户端,最直接的方法是 close或者是closesocket函数,但是这样太直接,任何一方关闭了套接字,双发就不能进行通信了。

我们可以采用一种更优雅的方式,基于TCP的半关闭,accept函数会在内部生成一个数据IO套接字,用于双方通信,这个套接字分为了两个部分,读缓冲与写缓冲,相当于一条全双工管道。

当服务端使用:

int shutdown(int sock,int howto);

关闭输出缓冲时,会向客户端发送一个EOF;客户端的read(...)函数,会返回一个-1;但是此时客户端可以通过其输出缓冲,向服务端发送消息,服务端仍然能够接到客户端的信息。这种断开的方式比直接close套接字优雅点。

TCP与UDP网络编程总结(一)的更多相关文章

  1. TCP/IP协议网络编程以及UDP和TCP之传输协议

    1.什么是TCP/IP协议? 网络编程协议有很多,目前应用最广泛的是TCP/IP协议(Transmission Control Protocal/Internet Protoal 传输控制协议/英特网 ...

  2. JAVA UDP网络编程学习笔记

    一.UDP网络编程概述 采用TCP协议通信时,客户端的Socket必须先与服务器建立连接,连接建立成功后,服务器端也会持有客户端连接的Socket,客户端的Socket与服务器端的Socket是对应的 ...

  3. unix域套接字UDP网络编程

    unix域套接字UDP网络编程,服务器如下面: #include <stdio.h> #include <stdlib.h> #include <string.h> ...

  4. TCP/UDP网络编程的基础知识与基本示例(windows和Linux)

    一.TCP编程的一般步骤 服务器端: 1.创建一个socket,用函数socket() 2.绑定IP地址.端口等信息到socket上,用函数bind() 3.开启监听,用函数listen() 4.接收 ...

  5. 自测之Lesson15:TCP&UDP网络编程

    题目:编写一个TCP通信的程序. 实现代码: #include <stdio.h> #include <sys/socket.h> #include <unistd.h& ...

  6. Java Web 基础(一) 基于TCP的Socket网络编程

    一.Socket简单介绍 Socket通信作为Java网络通讯的基础内容,集中了异常.I/O流模式等众多知识点.学习Socket通信,既能够了解真正的网络通讯原理,也能够增强对I/O流模式的理解. 1 ...

  7. TCP/IP协议-网络编程

    本文转载自公众号“呆呆熊一点通”,作者:呆呆 开篇语 前两年, 就买了<TCP/IP网络编程>这本书, 由于自身基础薄弱, 只是走马观花翻阅了几张. 后来工作了这些年, 越来越感到瓶颈期已 ...

  8. 【linux高级程序设计】(第十五章)UDP网络编程应用 2

    UDP广播通信 单播:一对一,TCP和UDP均可完成 广播:只能UDP完成.广播时发送方只发送一个数据包,但是网络上的交换机默认转发广播数据包到所有端口.路由器默认不转发任何广播数据包.故广播在局域网 ...

  9. C++ 利用socket实现TCP,UDP网络通讯

    学习孙鑫老师的vc++深入浅出,有一段时间了,第一次接触socket说实话有点儿看不懂,第一次基本上是看他说一句我写一句完成的,第二次在看SOCKET多少有点儿感觉了,接下来我把利用SOCKET完成T ...

随机推荐

  1. ACM2035_(递归法求幂)

    /* 编写一个递归算法,求解m的n次方. 我们一般求解m的n次方,一般使用n个m相乘的办法来求解. 其实我们还可以使用另外一种更有效率的办法求解这个问题. 我们知道一个数的0次方等于1,一个数的1次方 ...

  2. Maven的安装与使用(ubuntu)

    一.安装Maven 1.下载Maven,http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.3.9/binaries/apache-m ...

  3. usaco 购买饲料 && 修剪草坪

    购买饲料 Description 如约翰在镇上,沿着公路开车回家,他的家离起点有E公里.他顺便准备买K吨饲料回家.运送饲料是要花油钱的,如果他的车上有X吨饲料,行驶一公里需要X^2元,行驶D公里就 需 ...

  4. hdoj 1869 六度分离【最短路径求两两边之间最长边】

    六度分离 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  5. 命令 "sudo -H" 中的这个 "H" 什么作用?

    脚本中使用$HOME变量 问题描述:某些同事原来写的脚本中包含如下内容. BIN_DIR=${HOME}/tools TAIR_BIN_DIR=${HOME}/tair_bin TAIR_SRC_DI ...

  6. Expression Blend 4 激活码

    Expression Blend 4 激活码: 6WDDQ-K7D4F-GQGF4-2VYBJ-8K6MB

  7. 配置好maven后,设置tomcat:run运行程序

    1.要在intellij idea使用maven,同样是先要配置maven的路径,不过intellij idea已经集成maven插件了,省去了安装的麻烦 2.创建maven web项目 点击fini ...

  8. Android开发学习之LauncherActivity开发启动的列表

    Android开发学习之LauncherActivity开发启动的列表 创建项目:OtherActivity 项目运行结果:   建立主Activity:OtherActivity.java [jav ...

  9. Reactor构架模式--转载

    原文:http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece76310468a3b404380143c86964868d4e419ce3b464 ...

  10. Android开发之Toast解析

    Toast是Android系统提供的一个显示消息提示的类,它的使用非常简单,用途很广,如软件的升级,可以用它进行提示:退出程序时,也可以用它进行提醒,输入限制的提醒,等等. 使用场景: 1.需要提示用 ...