Socket编程
箭已离弓
总想着自己写博客,可是网上写好的太多。所以就转载过来学习吧。
展开
-
4、WSAStartup()函数以及DLL的加载
WinSock(Windows Socket)编程依赖于系统提供的动态链接库(DLL),有两个版本:较早的DLL是 wsock32.dll,大小为 28KB,对应的头文件为 winsock1.h;最新的DLL是 ws2_32.dll,大小为 69KB,对应的头文件为 winsock2.h。几乎所有的 Windows 操作系统都已经支持 ws2_32.dll,包括个人操作系统 Win转载 2017-05-21 13:51:53 · 1187 阅读 · 0 评论 -
17、socket文件传输功能的实现
这节我们来完成 socket 文件传输程序,这是一个非常实用的例子。要实现的功能为:client 从 server 下载一个文件并保存到本地。编写这个程序需要注意两个问题:1) 文件大小不确定,有可能比缓冲区大很多,调用一次 write()/send() 函数不能完成文件内容的发送。接收数据时也会遇到同样的情况。要解决这个问题,可以使用 while 循环,例如://转载 2017-05-21 14:05:41 · 410 阅读 · 0 评论 -
18、socket网络字节序以及大端序小端序
不同CPU中,4字节整数1在内存空间的存储方式是不同的。4字节整数1可用2进制表示如下:00000000 00000000 00000000 00000001有些CPU以上面的顺序存储到内存,另外一些CPU则以倒序存储,如下所示:00000001 00000000 00000000 00000000若不考虑这些就收发数据会发生问题,因为保存顺序的不同意味着对接收数据的解析顺转载 2017-05-21 14:07:20 · 474 阅读 · 0 评论 -
19、在socket中使用域名
客户端中直接使用IP地址会有很大的弊端,一旦IP地址变化(IP地址会经常变动),客户端软件就会出现错误。而使用域名会方便很多,注册后的域名只要每年续费就永远属于自己的,更换IP地址时修改域名解析即可,不会影响软件的正常使用。关于域名注册、域名解析、host 文件、DNS 服务器等本节并未详细讲解,请读者自行脑补。本节重点讲解如何使用域名。通过域名获取IP地址域名仅仅是I转载 2017-05-21 14:12:16 · 600 阅读 · 0 评论 -
20、理解UDP套接字
TCP 是面向连接的传输协议,建立连接时要经过三次握手,断开连接时要经过四次握手,中间传输数据时也要回复ACK包确认,多种机制保证了数据能够正确到达,不会丢失或出错。UDP 是非连接的传输协议,没有建立连接和断开连接的过程,它只是简单地把数据丢到网络中,也不需要ACK包确认。UDP 传输数据就好像我们邮寄包裹,邮寄前需要填好寄件人和收件人地址,之后送到快递公司即可,但包裹是否正确送转载 2017-05-21 14:13:04 · 409 阅读 · 0 评论 -
1、socket是什么意思
在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。socket 的典型应用就是 Web 服务器和浏览器:浏览器获取用户输入的URL,向服务器发起请求,服务器分析接收到的URL,将对应的网页内容返回给浏览器,浏览器再经过解析和渲染,就将文字、图片、视频等转载 2017-05-21 13:47:45 · 3190 阅读 · 0 评论 -
2、一个简单的Linux下的socket程序
和C语言教程一样,我们从一个简单的“Hello World!”程序切入 socket 编程。本节演示了 Linux 下的代码,server.cpp 是服务器端代码,client.cpp 是客户端代码,要实现的功能是:客户端从服务器读取一个字符串并打印出来。服务器端代码 server.cpp:#include #include #include #include #inc转载 2017-05-21 13:49:21 · 345 阅读 · 0 评论 -
3、一个简单的Windows下的socket程序
上节演示了 Linux 下的 socket 程序,这节来看一下 Windows 下的 socket 程序。同样,server.cpp 为服务器端代码,client 为客户端代码。服务器端代码 server.cpp:#include #include #pragma comment (lib, "ws2_32.lib") //加载 ws2_32.dllint main(){转载 2017-05-21 13:50:53 · 537 阅读 · 0 评论 -
21、基于UDP的服务器端和客户端
前面的文章中我们给出了几个TCP的例子,对于UDP而言,只要能理解前面的内容,实现并非难事。UDP中的服务器端和客户端没有连接UDP不像TCP,无需在连接状态下交换数据,因此基于UDP的服务器端和客户端也无需经过连接过程。也就是说,不必调用 listen() 和 accept() 函数。UDP中只有创建套接字的过程和数据交换的过程。UDP服务器端和客户端均只需1个套接字TC转载 2017-05-22 19:08:17 · 644 阅读 · 0 评论 -
Cocos2d-x Tutorial 之 Socket的使用(1)
本篇博文记录下 cocos2-x 中 socket 链接的建立使用到了第三方跨平台的 socket 库 netlink主页下载地址引擎版本:quick-cocos2d-x 3.3一、配置环境1、下载并增加到 Xcode从netlink官网下载netlink的包,解压缩并将解压缩后的文件夹放到 Classes 目录下,在 Xcode 中转载 2017-12-10 23:18:14 · 718 阅读 · 0 评论 -
16、优雅的断开连接--shutdown()
调用 close()/closesocket() 函数意味着完全断开连接,即不能发送数据也不能接收数据,这种“生硬”的方式有时候会显得不太“优雅”。图1:close()/closesocket() 断开连接上图演示了两台正在进行双向通信的主机。主机A发送完数据后,单方面调用 close()/closesocket() 断开连接,之后主机A、B都不能再接受对方传输的数据。实际上,转载 2017-05-21 14:04:16 · 364 阅读 · 0 评论 -
15、TCP四次握手断开连接(图解)
建立连接非常重要,它是数据正确传输的前提;断开连接同样重要,它让计算机释放不再使用的资源。如果连接不能正常断开,不仅会造成数据传输错误,还会导致套接字不能关闭,持续占用资源,如果并发量高,服务器压力堪忧。建立连接需要三次握手,断开连接需要四次握手,可以形象的比喻为下面的对话:[Shake 1] 套接字A:“任务处理完毕,我希望断开连接。”[Shake 2] 套接字B:“哦,是吗?请转载 2017-05-21 14:01:46 · 431 阅读 · 0 评论 -
14、TCP数据的传输过程
建立连接后,两台主机就可以相互传输数据了。如下图所示:图1:TCP 套接字的数据交换过程上图给出了主机A分2次(分2个数据包)向主机B传递200字节的过程。首先,主机A通过1个数据包发送100个字节的数据,数据包的 Seq 号设置为 1200。主机B为了确认这一点,向主机A发送 ACK 包,并将 Ack 号设置为 1301。为了保证数据准确到达,目标机器在收到数据包转载 2017-05-21 14:00:38 · 473 阅读 · 0 评论 -
5、使用socket()函数创建套接字
在Linux中,一切都是文件,除了文本文件、源文件、二进制文件等,一个硬件设备也可以被映射为一个虚拟的文件,称为设备文件。例如,stdin 称为标准输入文件,它对应的硬件设备一般是键盘,stdout 称为标准输出文件,它对应的硬件设备一般是显示器。对于所有的文件,都可以使用 read() 函数读取数据,使用 write() 函数写入数据。“一切都是文件”的思想极大地简化了程序员的理解和转载 2017-05-21 13:52:38 · 590 阅读 · 0 评论 -
6、使用bind()和connect()函数
socket() 函数用来创建套接字,确定套接字的各种属性,然后服务器端要用 bind() 函数将套接字与特定的IP地址和端口绑定起来,只有这样,流经该IP地址和端口的数据才能交给套接字处理;而客户端要用 connect() 函数建立连接。bind() 函数bind() 函数的原型为:int bind(int sock, struct sockaddr *addr, sockl转载 2017-05-21 13:53:42 · 459 阅读 · 0 评论 -
7、使用listen()和accept()函数
对于服务器端程序,使用 bind() 绑定套接字后,还需要使用 listen() 函数让套接字进入被动监听状态,再调用 accept() 函数,就可以随时响应客户端的请求了。listen() 函数通过 listen() 函数可以让套接字进入被动监听状态,它的原型为:int listen(int sock, int backlog); //Linuxint listen(S转载 2017-05-21 13:54:26 · 475 阅读 · 0 评论 -
8、socket数据的接收和发送
Linux下数据的接收和发送Linux 不区分套接字文件和普通文件,使用 write() 可以向套接字中写入数据,使用 read() 可以从套接字中读取数据。前面我们说过,两台计算机之间的通信相当于两个套接字之间的通信,在服务器端用 write() 向套接字写入数据,客户端就能收到,然后再使用 read() 从套接字中读取出来,就完成了一次通信。write() 的原型为:s转载 2017-05-21 13:55:03 · 577 阅读 · 0 评论 -
9、回声客户端的实现
所谓“回声”,是指客户端向服务器发送一条数据,服务器再将数据原样返回给客户端,就像声音一样,遇到障碍物会被“反弹回来”。对!客户端也可以使用 write() / send() 函数向服务器发送数据,服务器也可以使用 read() / recv() 函数接收数据。考虑到大部分初学者使用 Windows 操作系统,本节将实现 Windows 下的回声程序,Linux 下稍作修改即可,不转载 2017-05-21 13:55:50 · 432 阅读 · 0 评论 -
10、实现迭代服务器端和客户端
前面的程序,不管服务器端还是客户端,都有一个问题,就是处理完一个请求立即退出了,没有太大的实际意义。能不能像Web服务器那样一直接受客户端的请求呢?能,使用 while 循环即可。修改前面的回声程序,使服务器端可以不断响应客户端的请求。服务器端 server.cpp:#include #include #pragma comment (lib, "ws2_32.lib"转载 2017-05-21 13:56:37 · 452 阅读 · 0 评论 -
11、socket缓冲区以及阻塞模式
在《socket数据的接收和发送》一节中讲到,可以使用 write()/send() 函数发送数据,使用 read()/recv() 函数接收数据,本节就来看看数据是如何传递的。socket缓冲区每个 socket 被创建后,都会分配两个缓冲区,输入缓冲区和输出缓冲区。write()/send() 并不立即向网络中传输数据,而是先将数据写入缓冲区中,再由TCP协议将数据从缓转载 2017-05-21 13:57:37 · 428 阅读 · 0 评论 -
12、TCP的粘包问题以及数据的无边界性
上节我们讲到了socket缓冲区和数据的传递过程,可以看到数据的接收和发送是无关的,read()/recv() 函数不管数据发送了多少次,都会尽可能多的接收数据。也就是说,read()/recv() 和 write()/send() 的执行次数可能不同。例如,write()/send() 重复执行三次,每次都发送字符串"abc",那么目标机器上的 read()/recv() 可能分三次转载 2017-05-21 13:58:24 · 353 阅读 · 0 评论 -
13、TCP数据报结构以及三次握手(图解)
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的通信协议,数据在传输前要建立连接,传输完毕后还要断开连接。客户端在收发数据前要使用 connect() 函数和服务器建立连接。建立连接的目的是保证IP地址、端口、物理链路等正确无误,为数据的传输开辟通道。TCP建立连接时要传输三个数据包,俗称三次握手(Three-转载 2017-05-21 13:59:22 · 402 阅读 · 0 评论 -
Cocos2d-x Tutorial 之 Socket的使用(2)
本节记录下将 C++ 版本的接口,倒出到 Lua ,并在 Lua 中发送和接收消息一、编写 cocos2dx_socket_util.ini 文件参考Cocos2d-x Tutorial 之 如何绑定 C++ 类到 Lua此处贴出改写完成以后的内容1234567891011121314151617181920转载 2017-12-10 23:18:54 · 501 阅读 · 0 评论