基于TCP的socket套接字的网络编程(客户端/服务端模式)
6 关闭套接字。
基于TCP(面向连接)的socket编程的客户端程序流程如下:
1 创建套接字(socket())。
2 向服务器发出连接请求(connect())。
3 和服务器端进行通信(send/recv())。
4 关闭套接字。
于数据完整性要求较高的场合,就应采用TCP协议。
IP网络层提供IP寻址和路由。因为在网络上数据可以经由多条线路到达目的地,网络层负责找出最佳的传输线路。
IP地址与数据包:
IP层就是把数据分组从一个主机跨越千山万水搬运到另外一主机, 并且这搬运服务一点都不可靠, 丢包、重复、失序可以说是家常便饭。如果失败是否需要重传?如果需要,那就使用TCP协议实现可靠的、面向连接的传输连接,如果不需要,那就使用UDP协议使用不可靠的、不面向连接的传输连接。
所以不同的网络应用程序可以用TCP实现,也可以用UDP实现,只是可靠性和实时性不一样。
在TCP或UDP协议上编程是比较复杂的。例如TCP协议, 我们不能要求每个程序员都去实现建立连接的3次握手(确认客户端、服务端的发信、收信能力),分组交换、失败重传(中间节点的路由可以是随机的,允许失序、重复、丢失,可靠的传输完全由两端点来实现,失败后重传即可,而顺序可以由数据包的序号来确定), 这些应该是属于操作系统内核的部分, 没必要重复开发, 但是对于应用程序来讲, 操作系统可以抽象出一个socket概念, 让上层应用去编程。
所以,Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
Socket是连接应用程序与网络驱动程序的桥梁,Socket在应用程序中创建,通过bind与驱动程序建立关系。此后,应用程序送给Socket的数据,由Socket交给驱动程序向网络上发送出去。计算机从网络上收到与该Socket绑定的IP+Port相关的数据后,由驱动程序交给Socket,应用程序便可从该Socket中提取接收到的数据。网络应用程序就是这样通过socket进行数据的发送与接收的。
基于TCP(面向连接)的socket编程的服务器端程序流程如下:
1 创建套接字(socket())。
2 将套接字绑定到一个本地地址和端口上(bind())。
3 将套接字设为监听模式,准备接收客户请求(listen())
4 等待客户请求到来;当清求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept())。
5 用返回的套接字和客户端进行通信(send/recv())返回,等待另一客户请求。
6 关闭套接字。
基于TCP(面向连接)的socket编程的客户端程序流程如下:
1 创建套接字(socket())。
2 向服务器发出连接请求(connect())。
3 和服务器端进行通信(send/recv())。
4 关闭套接字。
代码:
//tcp server#include <Winsock2.h>#include <stdio.h>#pragma comment(lib,"ws2_32.lib")void main(){ WORD wVersionRequested; // 指定准备加载的Winsock库版本 WSADATA wsaData; // Winsock库版本信息的结构体 wVersionRequested = MAKEWORD( 1, 1); int err = WSAStartup( wVersionRequested, &wsaData ); // 加载套接字库 if ( err != 0 ) { return;} if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) { WSACleanup( ); // 释放为该应用程序分配的资源,终止对WinSock动态库的使用 return; } SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0); // 创建套接字AF_INET表示TCP/IP协议// SOCK_STREAM表示TCP连接,SOCK_DGRAM表示UDP连接// 第三个参数为零表示自动选择协议 SOCKADDR_IN addrSrv; // 定义一个地址结构体的变量 addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(6000);//htons把一个u_short类型从主机字节序转换为网络字节序 bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); //将套接字绑定到本地的某个地址和端口上 listen(sockSrv,5); //将指定的套接字设定为监听模式 SOCKADDR_IN addrClient; int len=sizeof(SOCKADDR); while(1) { SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len); //接受客户端发送的连接请求 char sendBuf[100]; sprintf(sendBuf,"Welcome %s to here",inet_ntoa(addrClient.sin_addr)); send(sockConn,sendBuf,strlen(sendBuf)+1,0); //通过一个已建立连接的套接字发送数据 char recvBuf[100]; recv(sockConn,recvBuf,100,0); //从一个已建立连接的套接字接收数据 printf("%s
",recvBuf); closesocket(sockConn); }}//添加ws2_32.lib:工程→设置→连接,添加该库(前面要有空格)或//#pragma comment(lib,"ws2_32.lib")
//Tcp client
#include <Winsock2.h>#include <stdio.h>#pragma comment(lib,"ws2_32.lib")void main(){ WORD wVersionRequested; // 指定准备加载的Winsock库版本 WSADATA wsaData; // Winsock库版本信息的结构体 wVersionRequested = MAKEWORD( 1, 1); int err = WSAStartup( wVersionRequested, &wsaData ); // 加载套接字库 if ( err != 0 ) { return;} if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) { WSACleanup( ); // 释放为该应用程序分配的资源,终止对WinSock动态库的使用 return; }
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0); // 创建套接字。AF_INET表示TCP/IP协议
// SOCK_STREAM表示TCP连接,SOCK_DGRAM表示UDP连接
//第三个参数为零表示自动选择协议 SOCKADDR_IN addrSrv; //定义一个地址结构体的变量 addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1"); addrSrv.sin_family = AF_INET; addrSrv.sin_port = htons(6000);
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); //向服务器发出连接请求
char recvBuf[1000]; recv(sockClient,recvBuf,100,0); //接收数据 printf("%s
",recvBuf);
send(sockClient,"Hello!",strlen("Hello!")+1,0); //发送数据
closesocket(sockClient); //关闭套接字 WSACleanup(); system("pause");}//添加ws2_32.lib:工程→设置→连接,添加该库(前面要有空格)或//#pragma comment(lib,"ws2_32.lib")
-End-
基于TCP的socket套接字的网络编程(客户端/服务端模式)的更多相关文章
- [网络编程之Socket套接字介绍,套接字工作流程,基于TCP协议的套接字程序]
[网络编程之Socket套接字介绍,套接字工作流程,基于TCP协议的套接字程序] 为何学习socket套接字一定要先学习互联网协议: 1.首先:要想开发一款自己的C/S架构软件,就必须掌握socket ...
- 01:osi七层---基于TCP协议的套接字(socket)
1 : osi 七层,tcp/ip 五层 1 cs架构和bs架构2 互联网3 osi七层 tcp/ip五层 -物理层 -网线.光纤 -数据链路层 -网卡 - ...
- 网络编程----socket介绍、基于tcp协议的套接字实现、基于udp协议的套接字实现
一.客户端/服务器架构(C/S架构) 即C/S架构,包括: 1.硬件C/S架构(打印机) 2.软件C/S架 ...
- 网络编程(二)--TCP协议、基于tcp协议的套接字socket
一.TCP协议(Transmission Control Protocol 传输控制协议) 1.可靠传输,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会 ...
- 什么是 socket?简述基于 tcp 协议的套接字通信流程?
Socket的英文原义是"孔"或"插座".通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄, 可以用来实现不同虚拟机或不同计 ...
- 网络编程(二)——TCP协议、基于tcp协议的套接字socket
TCP协议与基于tcp协议的套接字socket 一.TCP协议(流式协议) 1.可靠传输,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的 ...
- 网络编程之TCP三次握手与四次挥手、基于TCP协议的套接字编程
目录 TCP三次握手和四次挥手 背景描述 常用的熟知端口号 TCP概述 TCP连接的建立(三次握手) TCP四次挥手 如果已建立连接,客户端突然断开,会怎么办呢? 基于TCP协议的套接字编程 什么是S ...
- python 之 网络编程(基于TCP协议的套接字通信操作)
第八章网络编程 8.1 基于TCP协议的套接字通信 服务端套接字函数 s.bind() 绑定(主机,端口号)到套接字 s.listen() 开始TCP监听 s.accept() 被动接受TCP客户的连 ...
- Python中利用原始套接字进行网络编程的示例
Python中利用原始套接字进行网络编程的示例 在实验中需要自己构造单独的HTTP数据报文,而使用SOCK_STREAM进行发送数据包,需要进行完整的TCP交互. 因此想使用原始套接字进行编程,直接构 ...
随机推荐
- gparted增加Ubuntu14.04根目录空间(转)
转自:https://blog.csdn.net/t765833631/article/details/79031063 在win7上装了Ubuntu14.04双系统后,突然发现ubuntu开机会弹出 ...
- css3边框与背景
一.css3边框 1.border-image 边框 border-image: url(xxx.png) number stretch 很好理解就是拉伸,有多长拉多长. repeat (和4角上 同 ...
- NCBI之gene系列
1.基因系列中的data索引 2.基因ID之间的转换 对于生信,依托于别人的工具不如自己动手,由于研究发表的滞后性,往往很多工具提供的转换并不是最新的,况且开发者水平也参差不齐,理解原理才能让你来去自 ...
- 去掉Android新建项目的顶部标题
[ 去掉Android新建项目的顶部标题] 使用NoActionBar的Theme即可. 参考:http://blog.csdn.net/u012246458/article/details/5299 ...
- Java volatile关键字的用法
volatile不能解决同步问题 如果想要理解volatile关键字的作用不得不先了解Java内存模型 摘抄一下来自百度百科的话 在本次线程内,当读取一个变量时,为提高存取速度,编译器优化时有时会先把 ...
- JavaScript中判断null、undefined与NaN的方法
1.判断undefined: ? 1 2 3 4 var tmp = undefined; if (typeof(tmp) == "undefined"){ alert(" ...
- as3.0去除空格
var str:String="是 我们 呀CuPlay er.com网站" function trim(string:String):String { return string ...
- 2019年华南理工大学程序设计竞赛(春季赛)-H-Parco_Love_GCD
题目链接:https://ac.nowcoder.com/acm/contest/625/H 题意:给定n个数(<=1e9)的序列,其中n<=5e5,求该序列所有子序列的对应的gcd对1e ...
- window中磁盘空间不足但是找不到使用空间的文件
今天看到 电脑的 d盘 空间爆红,空间满了,去找了找没有找到具体是哪个文件占用的空间.一个一个文件的查看属性,都没有找到.文件都不大,几百个g的空间就没了.莫名其妙!!! 自己开启了备份还原,存储的 ...
- Android 环境搭建与Android SDK目录介绍
Android SDK下载和安装 本地已有合适版本Android SDK,则无需再下载,或者可以使用SDK Manager更新SDK: 没有SDK,则需要下载. 这里说一下使用SDK Manager下 ...