要写一个文件传输程序,要求传输层采用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 我在定义套接字的时候用socket(AF_INET,SOCK_STREAM,0),表明这是采用TCP连接,那在哪里定义采用IP协议呢?
2 我看到论坛里有个帖子说tcp有时会“粘包”,所以要自己定义包头,tcp不是可靠连接吗,怎么会粘包?
3 同样在论坛中看到要把tcp包拆包到ip层,我是不是也要这样做?
4 tcp协议或ip协议的数据包都有固定格式,我定义每次通过套接字传送文件中大小为1k字节的片断,是不是说事实上真正传送的不仅是1k,而是包含了协议头部等辅助信息的大于1k的信息。
4 我目前的程序是在广域网上测试,通过ip地址访问其他机器,如果换到小型局域网上(我老师说是只有几台机器的千兆网),程序需要改什么地方?
5 如果发送端采用多线程发送文件,接收端是不是必须要采用多线程来接收?问题较多,望高手指点
上网比较困难,回帖有时不及时,望谅解
解决方案 »
- 如何让程序早于系统登录界面启动
- 请问VC的dll工程可以重定向输出lib吗
- 我用MFC7.1作了一个ActiveX控件,其中一个方法的功能是弹出一个对话框,至此一切OK,但是在对话框上放了一个WebBrowser控件之后,对话框就
- 是否可以不打开任何浏览器的窗口,凭空得到IWebBrowser2的指针?
- ____SHFileOperation的一个操作台奇怪了,看能不能在你们电脑执行_____
- 我的机器在多级代理后面,请问我该如何知道我的公网IP?
- 怎样在VC中控制程序单步执行?
- 想用VC使用EXCEL模板作报表,给点思路??或相关文档??
- html模板加载时出现“invalid character”错误
- 被一个MFC问题困扰了,一直想不清楚
- 给位大侠,我远程线程注入,执行完毕之后,应用程序出错关闭。
- 怎么传递不了ip数据?
TCP协议是基于IP协议构建的,不需要指定IP协议。2 我看到论坛里有个帖子说tcp有时会“粘包”,所以要自己定义包头,tcp不是可靠连接吗,怎么会粘包?
“粘包”的意思是连续多次发送的数据在接收端可能一次接收到,此外,一次发送的数据也可能会需要连续多次才能接收全。可靠连接是保证数据完整有序,但每次发送和接收不是一一对应的。3 同样在论坛中看到要把tcp包拆包到ip层,我是不是也要这样做?
不需要自己处理。4 tcp协议或ip协议的数据包都有固定格式,我定义每次通过套接字传送文件中大小为1k字节的片断,是不是说事实上真正传送的不仅是1k,而是包含了协议头部等辅助信息的大于1k的信息。
对。4 我目前的程序是在广域网上测试,通过ip地址访问其他机器,如果换到小型局域网上(我老师说是只有几台机器的千兆网),程序需要改什么地方?
简单的程序不需要改,复杂程序要根据具体情况来分析。5 如果发送端采用多线程发送文件,接收端是不是必须要采用多线程来接收?
接收一般不用多线程。
你使用什么做的,如果是VC++可以考虑用MFC的CAsyncSocket或者CSocket啊,更为简单一些
我们只要用就可以了
防止粘包最好做到一接一发,一一对应
接收端开一个线程来收就好了,多个线程没办法收同一个套接字的数据吧
很清晰在传输文件中,粘包一般不会有影响,只管发送接收就行了,因为tcp保证了它的顺序,但如果对于一些数据消息,发送端连续发送两个,那接收端可能就无法区分具体里面数据了,因为它有可能一次接收,所以要自定义包头,通过包头来区分数据消息。多线程发送文件是为了有多个客户端同时请求文件,所以需要多线程,而客户端接收时,一般来说只向服务器来请求文件,所以可以不需要多线程,但如果考虑到界面响应的话,还是需要通过开个接收文件线程
还是要配合发送端发送方式来重写程序。
除了采用套接字来实现传输,还有什么其他的方式?
2 你是否考虑过大文件传输问题,如果文件超过2G或者4G,你的程序是否支持。
3 是否有断点续传的支持。
4 在恶劣的网络环境下,文件传输是否会中断,是否接收会乱码
文件传输想做好,还是的好好考虑的。
我晚上写个网络编程学习的贴。
流程就是你说的那样。不同的平台,例如Windows xp, Linux之间的API有一些API上的差别。socket是网络程序的API, socket的底层是TCP/IP协议栈,而TCP/IP协议是当今Internet上的主流协议。
其它方式?还可以用DHL全球特快专递,嘿嘿。