socket数据发送与接收问题 ( 积分: 100 )

R

runcow

Unregistered / Unconfirmed
GUEST, unregistred user!
当客户端与服务器端连接后通过 Send()方法将数据发出,服务器端通过Receive()方法接收。如果客户端执行了三个Send(),此时服务器端的Receive()得到的是三次send()过来的数据之和,还是第一次send()的数据。如果两个客户端同时send()那服务器端又是如何取的呢?还有会不会客户端才send()一半数据,服务器端就开始Receive(),而造成只取到一半的数据?
主要不清楚send()后数据在服务器端是如何存储的,服务器Receive()是如何取数据的。
 
其实这种情况你自己试一下就知道了。
不会出现像你说的那种情况的。
receive()接受时,需要人为的设置一个变量来接受数据。如果不对接受变量进行处理,那么变量的值就是最后一个客户端发过来的数据。
 
我做了两天的测试代码但还是弄不清楚。
 
服务器端接收数据并不与客户端步调一致。
激发多少次OnReceive不确定的,你应该自己定个应用协议。
比如: [数据长度]#[数据体]
其中#号是分隔符。
服务器接收时,应开个缓冲区,或者打开个文件,用来保存收到的数据,
Oneceive一次,就往缓冲区或文件追加一次,直到“[数据长度]个”字节
全部收到为止。
 
服务器端接受时,如果没有人为的设置一个变量接受,应该是存到内存里。
 
流式SOCK的接收有两种,一种是阻塞,一种是非阻塞,如果使用阻塞,那么必须收到Receive里指定的字节,才会返回,如果是非阻塞,那么只要收到一点数据都会返回,另外,如果缓存过小,前而的数据你没有读完,后面的数据又来了,这时候就会把前面的数据给洗掉,建议看一下SOCK方面的书
 
你都没有你用的什么控件, 还是直接socket编程, 还是用C#编程?
你说的情况不会出现, 操作系统socket底层代码会处理的
到底是用TCP还是UDP, 如果是TCP, 肯定不会出现你说的情况, 肯定是顺序收发的
如果是UDP, 则时序可以是乱的, 但是发送方只发一半时, 服务端不会收到成功消息, 不可能去receive的, 一般会收到其它的消息如断链消息或超时消息等
 
帮你顶,接个分
 
我有个项目,有部份是用delphi写的有部份是用C#写的,两个程序需要协调工作,所以我想大家都支持socket,所以想用socket做为之间的通信。
 
LZ,我现在就是在用delphi+c#做,他们直接的通信没问题,只要在c#端的socket超时设置比delphi端大一点就没问题
 
如果你想花最少的钱学习流行的计算机技术,本人低价提供
计算机专业高清晰 视 频 教 程,所有教程由业内名家讲解,物超所值,
所有光盘4元/张,特快专递全国三天内到货.
联系方式:手 机:1 3 5 76145612(手机联系佳) Q Q:108410943
E-mail:ncncldjjg@126.com
1、Oracle9iOCP(Oracle认证专家DBA)视频教程(23CD)
2、SQL语言、数据挖掘、SQLServer2000视频教程(6CD)
3、计算机网络原理视频教程(4CD)
4、计算机实用组网技术视频教程(3CD)
5、MCSE(微软认证系统工程师)认证视频教程(11CD)
6、windows2003即学即会视频教程(6CD)
7、J2EE Web程序开发定向班/Java就业班视频教程
(java基础jsp核心技术UML设计)(13CD)
8、J2EE基础高级案例分析视频教程(9CD)
9、马士兵J2SE入门与精通(含坦克大战、BBS实例)视频教程(6CD)
10、java语言深入详解视频教程(12CD)
11、java技术从入门到精通视频教程(21CD)
12、javascript全接触视频教程(13CD)
13、各类网站源程序(9CD)
14、unix原理视频教程(3CD)
15、Linux软件开发工程师(C语言)视频教程(4CD)
16、Linux配置、管理、优化实战工程师视频教程(8CD)
17、Linux内核编程视频教程(11CD)
18、C语言详解视频教程(2CD)
19、VC++6.0(MFC)开发技术术详解视频教程(6CD)
20、ASP.NET中文视频教程(3CD)
21、洪恩C#入门多媒体教程(1CD)
22、XML技术视频教程(2CD)
23、操作系统视频教程(3CD)
24、网络技术基础视频教程(2CD)
25、数据结构视频教程(5CD)
26、清华大学计算机专业多媒体教程(数据结构、汇编、编译原理等)(13CD)
27、大学数学[离散数学线性代数概率与数理统计微积分]视频教程(22CD)
28、LearnKey Asp.Net (老外用英语讲课)(13CD)
29、LearnKey Asp.Net Webservice(老外用英语讲课)(5CD)
30、AppDev Asp.Net2.0 UsingC# (老外用英语讲课)(1CD)
31、APPDev .Net Framework(老外用英语讲课)(2CD)
32、林清安pro/e2001(野火版)视频教程(18CD)
33、深圳大学3D设计视频教程(4CD)
34、3DMAX建模视频教程(老外用英语讲课)(6CD)
35、3DMAX纹理与贴图材质灯光视频教程(老外用英语讲课)(5CD)
36、3DMAX格式500个常用模型库(4CD)
37、lightscape基础入门视频教程(2CD)
38、聚光制造(lightscape3.2入门与精通视频教程)(4CD)
39、coreldraw12中文版入门与精通swf格式视频教程(2CD)
 
jjg000 你还真烦人,所有的帖子都有你.
 
呵呵,afd.sys是核心态驱动程序,负责与各种各样的网卡驱动程序打交道,处理来自网络的I/O。afd.sys显然有自己的数据缓冲区。网络服务器或者客户端只能通过WinSock(ws2_32.dll)的API与底层I/O进行通信。当底层驱动收到数据包后,才通知相应的应用程序去接收。一切按既定协议有序地工作。异步WinSock(WSAXXXX函数)通常将recv或send函数映射到某个通知方式上(消息或者事件或者其他I/O模型),这样应用程序就不必一直傻傻地候着,这就是所谓的“非阻塞模式”。在系统发生某些事件(如收到数据或没有更多的数据发送或连接已断开)的时候afd.sys会通知应用程序采取相应的策略来接收数据或发送数据或关闭套接字。当调用send函数的时候,应用程序仅仅只是将数据放到afd.sys的缓冲区,至于什么时候发送应用程序就不必管了;当调用recv的时候,应用程序仅仅只是从接收缓冲区中读出一部分内容给应用程序,当然如果接收数据区足够大,可以一次全部读出来;afd.sys在发送和接收数据时都是以套接字进行隔离的,每个套接字都有自己的缓冲区。
 
>>如果客户端执行了三个Send(),此时服务器端的Receive()得到的是三次send()过来的数据之和,还是第一次send()的数据。如果两个客户端同时send()那服务器端又是如何取的呢?
有多种可能,
可能:收到三次client.send回来的和
可能:收到一次client.send
可能:收到一次client.send + 一次client.send的一半
>>还有会不会客户端才send()一半数据,服务器端就开始Receive(),而造成只取到一半的数据?
会有这情况
>>主要不清楚send()后数据在服务器端是如何存储的,服务器Receive()是如何取数据的。
我也不清楚,按楼上barton所说,如果一个client,在afd.sys中的缓冲区为默认情况下,client不断发包,而server处理不及时的话,我搞不太清会出错何情况了。
一般我是认为winsock帮我们做了这个缓冲的问题,它是以流的方式存取的,将数据一点点存进缓冲后,由应用层收取,在公共的情况下,可能会出现一些网络异常(带宽时好时坏),这样则会出现一些数据包分时段的进入缓冲,造成粘包情况,所以应用层需要考虑这些问题
 
顶部