如题:用tcp协议进行数据的收发!我想知道数据包(报)的原理!也就是数据是以类似一个字符串的方式发送吗?我不会抓包,所以不太知道原理!还有就是我的缓存问题!我的客户端和服务端都要设置?如果接收或发送信息大于缓存?出现什么结果?

解决方案 »

  1.   

    如果用Socket来进行socket通信没必要看太底层的东西,那玩意看一本书你也不一定能看全,你所设置的缓冲区如果小于你的发送数据,可能会丢包,所以你在发送的时候就做下限制,如果过大,就自己拆包发送就好了
      

  2.   

    没人回答是不是我说的不清楚呢?我再详细补充下:
    首先我有个要发送的信息我定义为string sendmessage=“该字符串的长度不定”;
    const int BufferSize = 1024;//定义缓存大小为1024字节
    然后我创建个缓存数组byte[] buffer = new byte[BufferSize];
    我现在是直接将字符串buffer = Encoding.Unicode.GetBytes(sendmessage);/将字串转码
    然后用send或NetworkStream发送或写入
    因为我对数据包根本不了解所以想知道我这么做的缺点还有如何应用数据包?
      

  3.   

    学习一下:
    http://www.cnblogs.com/goodcandle/archive/2005/12/10/socket.html
      

  4.   

    首先TCP是基于流传输的,故需要处理边界问题,否则会出现粘包现象
    一般处理:定义消息头,消息体,消息头包括,该包的长度,版本等信息,这个头必须是定长的,
    消息体是变长,存放实际的数据
    至于能够发送多大的包,我没做过实验,但一般大小的都能发送.
    在IP层里面会自动分包,最大传输单元(MTU)TCP一般是不会丢包的,每次在传输数据时都会有确认握手.所以不必考虑丢包问题
      

  5.   

    看了楼主的问题,感到很难帮你
    简单的给你解释,TCP 仅适合传数据,数据一次性传多少完全由你控制,假设你传输的是一个文件,文件大小是10G,那么由于普通计算机内存达不到10G,所以缓冲区大小也没法设置为10G,所以拆包多次发送是必须的。
    那么多个包时如何判断这个文件是否传输完毕了呢?
    这就得设定相应的协议了,比如你判断到包里的数据最后是以/R/N结尾的就认为文件结束了。
    所以TCP传输的基础之上往往会使用其他的协议,比如FTP。
    建议楼主改用WS或WCF,后续研究TCP吧
      

  6.   

    你正好本末倒置了,不理解底层你不可能做出来好的应用。tcp含有流量控制,如果接受方的缓存小,发送端口会变小,也就是发送过来的数据会变小。
      

  7.   

    tcp的拥塞控制和流量控制,滑动窗口是做什么用的,这恰恰是tcp的精华呀。
      

  8.   

    你理解的没错,自己动手试一下吧,如果需要例子,我可以发给你,给学生上课用的。[email protected]
      

  9.   

    原理客户段大概是这样!我判断有没有要发是信息!如果有我就发送!没有我就把线程Sleep!但是这个时间不好控制!因为我也不知道什么时候想发?也就是类似qq原理!但是我只是举例!qq我们登陆后服务段给我们分配个线程!但是我不发信息时不想浪费资源!怎么解决?我说的那sleep原理对吗?如果可以时间怎么控制!我就开始写代码了