TCP与UDP网络编程总结(一)
(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网络编程总结(一)的更多相关文章
- TCP/IP协议网络编程以及UDP和TCP之传输协议
1.什么是TCP/IP协议? 网络编程协议有很多,目前应用最广泛的是TCP/IP协议(Transmission Control Protocal/Internet Protoal 传输控制协议/英特网 ...
- JAVA UDP网络编程学习笔记
一.UDP网络编程概述 采用TCP协议通信时,客户端的Socket必须先与服务器建立连接,连接建立成功后,服务器端也会持有客户端连接的Socket,客户端的Socket与服务器端的Socket是对应的 ...
- unix域套接字UDP网络编程
unix域套接字UDP网络编程,服务器如下面: #include <stdio.h> #include <stdlib.h> #include <string.h> ...
- TCP/UDP网络编程的基础知识与基本示例(windows和Linux)
一.TCP编程的一般步骤 服务器端: 1.创建一个socket,用函数socket() 2.绑定IP地址.端口等信息到socket上,用函数bind() 3.开启监听,用函数listen() 4.接收 ...
- 自测之Lesson15:TCP&UDP网络编程
题目:编写一个TCP通信的程序. 实现代码: #include <stdio.h> #include <sys/socket.h> #include <unistd.h& ...
- Java Web 基础(一) 基于TCP的Socket网络编程
一.Socket简单介绍 Socket通信作为Java网络通讯的基础内容,集中了异常.I/O流模式等众多知识点.学习Socket通信,既能够了解真正的网络通讯原理,也能够增强对I/O流模式的理解. 1 ...
- TCP/IP协议-网络编程
本文转载自公众号“呆呆熊一点通”,作者:呆呆 开篇语 前两年, 就买了<TCP/IP网络编程>这本书, 由于自身基础薄弱, 只是走马观花翻阅了几张. 后来工作了这些年, 越来越感到瓶颈期已 ...
- 【linux高级程序设计】(第十五章)UDP网络编程应用 2
UDP广播通信 单播:一对一,TCP和UDP均可完成 广播:只能UDP完成.广播时发送方只发送一个数据包,但是网络上的交换机默认转发广播数据包到所有端口.路由器默认不转发任何广播数据包.故广播在局域网 ...
- C++ 利用socket实现TCP,UDP网络通讯
学习孙鑫老师的vc++深入浅出,有一段时间了,第一次接触socket说实话有点儿看不懂,第一次基本上是看他说一句我写一句完成的,第二次在看SOCKET多少有点儿感觉了,接下来我把利用SOCKET完成T ...
随机推荐
- Bzoj 1853: [Scoi2010]幸运数字 容斥原理,深搜
1853: [Scoi2010]幸运数字 Time Limit: 2 Sec Memory Limit: 64 MBSubmit: 1774 Solved: 644[Submit][Status] ...
- 一步一步写一个简单通用的makefile(四)--写一个通用的makefile编译android可执行文件
通常要把我们自己的的代码编译成在android里面编译的可执行文件,我们通常是建一个文件夹 . ├── Android.mk ├── Application.mk ├── convolve.cl ├─ ...
- tomcat6~7~8用户设置及一个独立服务器上跑多个tomcat配置JVM设置优化亲测
tomcat6管理用户 在tomcat `安装根目录`/conf/tomcat-users.xml
- Shell简介:什么是Shell,Shell命令的两种执行方式
Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成的.Shell既是一种命令语言,又是一种程序设计语言.作为命令语言,它交互式地解释 ...
- hdoj 1827 Summer Holiday【强连通分量&&缩点】
Summer Holiday Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- sublime中安装sublimelinter php 语法检查
打开控制台,install package 搜 sublimelinter 先安装sublimelinter本体 安装完以后再搜索一下,安装sublimelinter-php 接下来,打开prefer ...
- Scene的实时追踪显示
最近在处理酷跑类型游戏时,遇到一个功能需求:需要在摄像机实时追踪角色显示(Game)的同时,Scene同时实时显示NPC的位置状态等信息? 这个问题有三种解决方法,各有利弊:1)使用unity系统内置 ...
- ubuntu给手机建wifi
声明 笔者近期意外的发现 笔者的个人站点http://tiankonguse.com/ 的非常多文章被其他站点转载,可是转载时未声明文章来源或參考自 http://tiankonguse.com/ 站 ...
- java代理
首先,java中为什么要提出代理的设计模式呢?代理模式的作用是:为其它对象提供一种代理以控制对这个对象的訪问.在某些情况下,一个客户不想或者不能直接引用还有一个对象,而代理对象能够在client和目标 ...
- [Redux] Fetching Data on Route Change
We will learn how to fire up an async request when the route changes. A mock server data: /** /api/i ...