要写一个文件传输程序,要求传输层采用TCP协议,网络层用IP协议,我看了几本书,仿照着写了个简单的程序
基本过程就是
发送端:加载套接字->创建监听的套接字->绑定套接字->监听套接字->接收数据包。
接收端:先加载套接字,然后创建套接字,直接连接服务器,发送数据包。
程序运行结果正确,但是我有很多问题不懂:1 我在定义套接字的时候用socket(AF_INET,SOCK_STREAM,0),表明这是采用TCP连接,那在哪里定义采用IP协议呢?
2 我看到论坛里有个帖子说tcp有时会“粘包”,所以要自己定义包头,tcp不是可靠连接吗,怎么会粘包?
3 同样在论坛中看到要把tcp包拆包到ip层,我是不是也要这样做?
4 tcp协议或ip协议的数据包都有固定格式,我定义每次通过套接字传送文件中大小为1k字节的片断,是不是说事实上真正传送的不仅是1k,而是包含了协议头部等辅助信息的大于1k的信息。
4 我目前的程序是在广域网上测试,通过ip地址访问其他机器,如果换到小型局域网上(我老师说是只有几台机器的千兆网),程序需要改什么地方?
5 如果发送端采用多线程发送文件,接收端是不是必须要采用多线程来接收?问题较多,望高手指点
上网比较困难,回帖有时不及时,望谅解

解决方案 »

  1.   

    1 我在定义套接字的时候用socket(AF_INET,SOCK_STREAM,0),表明这是采用TCP连接,那在哪里定义采用IP协议呢?
    TCP协议是基于IP协议构建的,不需要指定IP协议。2 我看到论坛里有个帖子说tcp有时会“粘包”,所以要自己定义包头,tcp不是可靠连接吗,怎么会粘包?
    “粘包”的意思是连续多次发送的数据在接收端可能一次接收到,此外,一次发送的数据也可能会需要连续多次才能接收全。可靠连接是保证数据完整有序,但每次发送和接收不是一一对应的。3 同样在论坛中看到要把tcp包拆包到ip层,我是不是也要这样做?
    不需要自己处理。4 tcp协议或ip协议的数据包都有固定格式,我定义每次通过套接字传送文件中大小为1k字节的片断,是不是说事实上真正传送的不仅是1k,而是包含了协议头部等辅助信息的大于1k的信息。
    对。4 我目前的程序是在广域网上测试,通过ip地址访问其他机器,如果换到小型局域网上(我老师说是只有几台机器的千兆网),程序需要改什么地方?
    简单的程序不需要改,复杂程序要根据具体情况来分析。5 如果发送端采用多线程发送文件,接收端是不是必须要采用多线程来接收? 
    接收一般不用多线程。
      

  2.   

    在windows下一般基于winsock,里面有些windows下的事件驱动的机制可以使用,
    你使用什么做的,如果是VC++可以考虑用MFC的CAsyncSocket或者CSocket啊,更为简单一些
      

  3.   

    TCP/IP已经是封装好的协议
    我们只要用就可以了
    防止粘包最好做到一接一发,一一对应
    接收端开一个线程来收就好了,多个线程没办法收同一个套接字的数据吧
      

  4.   


    很清晰在传输文件中,粘包一般不会有影响,只管发送接收就行了,因为tcp保证了它的顺序,但如果对于一些数据消息,发送端连续发送两个,那接收端可能就无法区分具体里面数据了,因为它有可能一次接收,所以要自定义包头,通过包头来区分数据消息。多线程发送文件是为了有多个客户端同时请求文件,所以需要多线程,而客户端接收时,一般来说只向服务器来请求文件,所以可以不需要多线程,但如果考虑到界面响应的话,还是需要通过开个接收文件线程
      

  5.   

    IP是TCP/UDP的更低一层协议,如果你是开发TCP/UDP等应用,那么IP就不需要你自己处理,底层系统会帮你处理IP层的包,你只需要处理TCP的包,由于粘包等可能,就需要自己在收到包后,能够知道如何组织数据
      

  6.   

    还有个问题,如果发送端不是用winsock发送,接收端还是:加载套接字、创建套接字、直接连接服务器、发送数据包  这样的流程可以么?
    还是要配合发送端发送方式来重写程序。
    除了采用套接字来实现传输,还有什么其他的方式?
      

  7.   

    1 可以考虑直接使用TransmitFile 进行文件传输
    2 你是否考虑过大文件传输问题,如果文件超过2G或者4G,你的程序是否支持。
    3 是否有断点续传的支持。
    4 在恶劣的网络环境下,文件传输是否会中断,是否接收会乱码
    文件传输想做好,还是的好好考虑的。
      

  8.   

    cnzdgs,已回答的很好了。看来网络编程的初学者比较多,理论基础知识不牢,建议楼主看《TCP/IP详解》卷一。
    我晚上写个网络编程学习的贴。
      

  9.   

    socket都源自Unix的风格。
    流程就是你说的那样。不同的平台,例如Windows xp, Linux之间的API有一些API上的差别。socket是网络程序的API, socket的底层是TCP/IP协议栈,而TCP/IP协议是当今Internet上的主流协议。
    其它方式?还可以用DHL全球特快专递,嘿嘿。