TCP只是一个可靠传输的通信管道,上层协议要你自己定的,通俗来说就是发送方和接收方的约定。
你有时候想发6个字节的数据,有时候想发4个字节的数据,没有个协议,接收方怎么知道是按照哪种方式来解析呢?你说的那个,如果在这个TCP通道上只发送这种数据,接收方每次收6个字节,按照这种固定格式解析,也能算一个协议,只要双方不会产生歧义就行。一般的来说,要比较通用点的话,传二进制数据一般都采用以下序列:
数据块总长度
数据

解决方案 »

  1.   

    那我要先把数据转成2进制,再传?然后接收方再把二进制转成字符串么?socket不是可以直接发送结构体的么?
      

  2.   

    TCP有粘包的问题,你做个协议解决掉,应该就可以完成老师的要求了。
      

  3.   

    自己定义一个协议非常简单,关键是设计的能够满足要求。
    至于什么所谓的程序员创造出来“粘包”这个词语看来给大家的误导不浅,害人。
    TCP是stream传输协议,有保障机制确保stream的可靠性。至于货物的识别和处理
    需要应用层自己定义和解析。搞网络编程的人最好能够推TCP/IP协议有一个基础的了解。我是做通信协议的,对这个非常了解。
      

  4.   


    定义成一个结构就完了
    struct message
    {
    char car_num[6]; //车辆号
    char person_num[6]; //司机工号
    ...
    };
      

  5.   


    问题就是说老师说这样是不行的诶。。以下是他的邮件回复,我是越来越糊涂了。。这是帧格式,是协议的一部分;
    还要考虑对不同帧的处理,比如数据帧、控制帧、应答帧等的处理;两者要合起来,不能缺;
    参考tcp/ip协议详解卷一
      

  6.   

    自定义协议的核心有两个:
    1. 控制码
    2. 流程控制用Socket进行通信,发送的数据包一定是有结构的,类似于:数据头+数据长度+数据内容+校验码+数据尾。
    这个你定义一个Struct包装起来即可。控制码是协议的基础信息,主要用来解释数据包的基本信息,通信触发的动作等,以便告知收到数据包之后应该如何处理数据包。
    例如,你传输文件的时候,一般会经过“传输开始 - 传输中 - 传输结束”三个阶段,那么Sender针对不同的阶段就要定义不同的命令控制码,以便让Receiver知道传输处于什么过程,这样Receiver收到数据包之后便可以知道下一步该做什么。
    具体实现上类似于:
    switch(iCmdType)
    {
    case CMD_BEGIN_TRANSFER:
        Begin();
        break;
    case CMD_TRANSFERRING:
        Transfer();
        break;
    case CMD_FINISH_TRANSFER:
        Finish();
        break;
    ......
    }而流程控制是协议的核心所在。以TCP/IP为例,Client和Server如何知道双方已经正确建立了连接?答案就是“三次握手”。三次握手就是流程控制。这个就需要对应用程序的通信流程把握的非常熟悉。以你的问题为例,“把数据从工控机(wince)系统 发送到服务器中(xp)中”,XP如何判断已经完整而且无误地收到了一个来自于wince的数据包?答案就是靠自定义的协议控制码(数据长度)。收到的数据如果是正确的,回应什么给wince?是错误的,又该回什么给wince?这就要靠协议所定义的流程控制。你把控制码定义完备了,把双方的通信流程也定义OK了,这就基本是一个应用层协议了。
      

  7.   

    “这是帧格式,是协议的一部分;
    还要考虑对不同帧的处理,比如数据帧、控制帧、应答帧等的处理;两者要合起来,不能缺;
    参考tcp/ip协议详解卷一”你老师的邮件的重点就是我上面说的那两个东西。帧格式的重点在于控制码,而对不同帧的处理则对应流程控制。
      

  8.   

    typedef struct message
    {
    char car[7];
    char driver[7];
    char oiler[5];
    char guner[4];
    char oil[6];
    char timer[15];
    }msg;就这么说吧,我要发送这么个结构体,但是我不知道具体如何定义协议 如何定义协议?~我同学说我的思维已经陷了socket的死胡同。   查了好多资料了   不知道怎么搞。
      

  9.   


    那具体该怎么定义的呢?是不是与socket没关系?
      

  10.   

    老师说自定义应用层协议和socket无关。。尴尬。这下彻底不知道怎么搞了。。
      

  11.   

    你老师说的是对的啊!应用层协议就该和socket无关啊!
    也就是说,socket只管将数据从一个地方传递到另外一个地方,至于数据是什么,做什么用途的,socket不需要知道。这样的话,你就需要在应用层自己定一些协议,用来解析你自己的数据。
    例如可以定一个协议头
    typedef struct Header
    {
       BYTE protocal;   // 协议号
       
       
    }DataHeader, *LPDataHeader;
    这样只要你的数据传到了应用层,直接取出这个结构体,确定里面的协议号,就可以知道你的是什么数据了。
    以便处理数据!
    不知道说的明白不明白!
      

  12.   


    请注意,如果一个自定义的应用层协议还和socket相关的话,那就不能称呼为“协议”了。
    协议是设计上的高层抽象,举个例子,我们用的计算机有可能硬件不同,软件不同,但是只要遵循TCP/IP协议,那么各台计算机之间便可以通信。协议的本质是定义各个实体对象之间的交互规则。这个你拿到现实之中也是一样的,开个玩笑,像什么《中苏XXX同盟友好互助协议》之类的(你认为和Socket有关系吗?哈哈~~~)我觉得你是卡在怎么实现一个协议上了,事实上你只要能编写传统的 C/S 通信程序,那么定义一个应用层协议真的不是很难的事,只不过差别在于协议定义的水平(经验丰富的人定义的协议移植性、可靠性、可扩充性等会好很多,而经验不是很丰富的人定义出来可能只能在某些机器上Work,在另外一些机器上就Bug了...不过这还好,因为水平是可以积累提高的)给你个链接:http://download.csdn.net/source/2174418这是我实现的一个精简的不能再精简的ftp协议(内网传输,一对一),我甚至连什么封包拆包的操作都简化到最低了。你看了就知道定义一个协议并不是你想的那么难。当然了,我这个协议定义的很烂,哈哈,因为我写这个程序的目的就是替代QQ在内网传大文件的功能(QQ在内网传几个G的文件经常是开始10M/S,很快,但逐渐逐渐的就慢下来,最后干脆卡在那不动,这让我们这些经常分享不良资源的童鞋情何以堪啊~~)。够用就好,所以没有加太多无谓的功能。我觉得你应该把注意力转移到如何让程序Work起来,你一边做一边想 C 和 S 之间如何才能正确、可靠、高效地通信,这样等你把程序写完了,你也基本就知道协议应该怎么定义了。(虽然这样按软件工程来看有点本末倒置呵,不过实际就是这样,设计往往是和实现迭代进行的)
      

  13.   

    呵呵,你的QQ号我找不到了!如果感觉能帮上你,加我QQ吧!314074772
      

  14.   

    第一次结贴。。不知道分子们给乱给了 不好意思啊。。    我想知道 编程用socket实现的话  还要定那么多协议干什么啊不明白。
      

  15.   

    yao050421103 回答很精彩!我想知道 编程用socket实现的话  还要定那么多协议干什么啊不明白。
    其实socket只是数据管道,定数据和解析数据它不管!