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 ...
随机推荐
- 【解决】小米M1刷机教程(卡刷)
1.下载合适的rom 下载地址为:http://rom.xiaomi.cn/ 选择合适的机型.硬件版本.固件类.软件版本后,点击“搜索”后,下载合适版本即可. 2.备份 个人手机主要需要备份的项目如下 ...
- make it clear how to use const in C++
1.first of all,take a lookup on the left side of keyword const.If there is something(type or pointer ...
- c语音中打印参数调用层级即call stack, call trace
http://stackoverflow.com/questions/105659/how-can-one-grab-a-stack-trace-in-c There's backtrace(), a ...
- Android 镜像地址[持续更新中]
这里收集android国内镜像资源地址 大连东软信息学院镜像服务器地址:– http://mirrors.neusoft.edu.cn 端口:80北京化工大学镜像服务器地址:– IPv4: http: ...
- sublimeText3安装package control和禁止弹出更新下载弹窗
1.sublimeText3安装package control import urllib.request,os; pf = 'Package Control.sublime-package'; ip ...
- Codeforces 114A-Cifera(暴力)
A. Cifera time limit per test 2 seconds memory limit per test 256 megabytes input standard input out ...
- [Javascript] MetaProgramming: function name
Each function should have a 'name' property. It can be anonymous, empty, the same as function name, ...
- Hack工具
黑客工具一般是由黑客或者恶意程序安装到您计算机中,用来盗窃信息.引起系统故障和完全控制电脑的恶意软件程序.同时也指黑客进行黑客任务时使用的工具.著名的有nmap,流光等等. 目录 1 种类 2 恶意程 ...
- iTunes无法验证服务器“s.mzstatic.com.”的身份
修改hosts文件,在里面添上一行 23.214.233.166 s.mzstatic.com
- Cracking the coding interview-String
关于字符串 问题描述:一般这类程序设计的题目较简单,通过设计字符串的反转,寻找子串,以及字符串的拼接.删除操作等问题. 问题 实现一个算法来判断一个字符串中的字符是否唯一(即没有重复)? 设计算法并写 ...