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 ...
随机推荐
- C语言snprintf函数
int snprintf(char *restrict buf, size_t n, const char * restrict format, ...); 函数说明:最多从源串中拷贝n-1个字符到 ...
- jsp 多条记录提交
前端jsp页面可以通过form提交标有name属性值得input的value数据给服务器,其中如何传递数组形式呢?如下: 1.前端jsp页面 其中灰色的部分是一个循环出现的值,因此form提交后,后台 ...
- Android基础知识回顾
- Mysql分表和分区的区别
一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一个磁盘 ...
- 谷歌google搜索打不开、谷歌gmail邮箱及相关服务无法登录的解决的方法
歌打不开 google打不开,与中国大陆封杀有关,可是主要是由于近期googleserver在全球范围内又一次进行了布局调整. 解决的方法是仅仅要改动用户本地计算机hosts文件就能够了. 一.Win ...
- android80 HttpClient框架提交数据 get方式
package com.itheima.httpclient; import java.io.IOException; import java.io.InputStream; import java. ...
- PHP内核探索之变量(1)变量的容器-Zval
http://blog.csdn.net/ohmygirl/article/details/41542445
- minicom移植到ARM开发平台
minicom需要ncurses库的支持.arm-linux-gcc中并没有此库故需要交叉编译ncurses,否则出现很多头文件.库函数找不到. 软件环境: ncurses-6.0 下载网址:http ...
- return与finally
当return遇到了finally,先标记return的值,然后执行finally,当finally修改了return的值,那么执行finally后,传递最后一次return的值,若finally没有 ...
- .net单元测试——常用测试方式(异常模拟、返回值测试、参数测试、数据库访问代码测试)
最近在看.net单元测试艺术,我也喜欢单元测试,今天介绍一下如何测试异常.如何测试返回值.如何测试模拟对象的参数传递.如何测试数据库访问代码.单元测试框架使用的是NUnit,模拟框架使用的是:Rhin ...