TCP传输文件的问题?疑惑比较多

zhangweijlc 2009-09-22 12:31:19
要写一个文件传输程序,要求传输层采用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 如果发送端采用多线程发送文件,接收端是不是必须要采用多线程来接收?

问题较多,望高手指点
上网比较困难,回帖有时不及时,望谅解
...全文
249 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Hotthing 2009-09-23
  • 打赏
  • 举报
回复
文件传送最好用FTP
Wenxy1 2009-09-23
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zhangweijlc 的回复:]
还有个问题,如果发送端不是用winsock发送,接收端还是:加载套接字、创建套接字、直接连接服务器、发送数据包 这样的流程可以么?
还是要配合发送端发送方式来重写程序。
除了采用套接字来实现传输,还有什么其他的方式?


[/Quote]
socket都源自Unix的风格。
流程就是你说的那样。不同的平台,例如Windows xp, Linux之间的API有一些API上的差别。

socket是网络程序的API, socket的底层是TCP/IP协议栈,而TCP/IP协议是当今Internet上的主流协议。
其它方式?还可以用DHL全球特快专递,嘿嘿。
Wenxy1 2009-09-23
  • 打赏
  • 举报
回复
cnzdgs,已回答的很好了。

看来网络编程的初学者比较多,理论基础知识不牢,建议楼主看《TCP/IP详解》卷一。
我晚上写个网络编程学习的贴。
zhangweijlc 2009-09-22
  • 打赏
  • 举报
回复
还有个问题,如果发送端不是用winsock发送,接收端还是:加载套接字、创建套接字、直接连接服务器、发送数据包 这样的流程可以么?
还是要配合发送端发送方式来重写程序。
除了采用套接字来实现传输,还有什么其他的方式?

zhangweijlc 2009-09-22
  • 打赏
  • 举报
回复
错了,是清楚
zhangweijlc 2009-09-22
  • 打赏
  • 举报
回复
谢谢各位
以上问题基本清除了
oyljerry 2009-09-22
  • 打赏
  • 举报
回复
IP是TCP/UDP的更低一层协议,如果你是开发TCP/UDP等应用,那么IP就不需要你自己处理,底层系统会帮你处理IP层的包,你只需要处理TCP的包,由于粘包等可能,就需要自己在收到包后,能够知道如何组织数据
blingpro 2009-09-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cnzdgs 的回复:]
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 如果发送端采用多线程发送文件,接收端是不是必须要采用多线程来接收?
接收一般不用多线程。
[/Quote]

很清晰

在传输文件中,粘包一般不会有影响,只管发送接收就行了,因为tcp保证了它的顺序,但如果对于一些数据消息,发送端连续发送两个,那接收端可能就无法区分具体里面数据了,因为它有可能一次接收,所以要自定义包头,通过包头来区分数据消息。

多线程发送文件是为了有多个客户端同时请求文件,所以需要多线程,而客户端接收时,一般来说只向服务器来请求文件,所以可以不需要多线程,但如果考虑到界面响应的话,还是需要通过开个接收文件线程
bragi523 2009-09-22
  • 打赏
  • 举报
回复
TCP/IP已经是封装好的协议
我们只要用就可以了
防止粘包最好做到一接一发,一一对应
接收端开一个线程来收就好了,多个线程没办法收同一个套接字的数据吧
飞天赤狐 2009-09-22
  • 打赏
  • 举报
回复
在windows下一般基于winsock,里面有些windows下的事件驱动的机制可以使用,
你使用什么做的,如果是VC++可以考虑用MFC的CAsyncSocket或者CSocket啊,更为简单一些
udknight 2009-09-22
  • 打赏
  • 举报
回复
1 可以考虑直接使用TransmitFile 进行文件传输
2 你是否考虑过大文件传输问题,如果文件超过2G或者4G,你的程序是否支持。
3 是否有断点续传的支持。
4 在恶劣的网络环境下,文件传输是否会中断,是否接收会乱码
文件传输想做好,还是的好好考虑的。
zhangweijlc 2009-09-22
  • 打赏
  • 举报
回复
除了socket,还可以用什么?
不动如岳 2009-09-22
  • 打赏
  • 举报
回复
只要是socket就行
cnzdgs 2009-09-22
  • 打赏
  • 举报
回复
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 如果发送端采用多线程发送文件,接收端是不是必须要采用多线程来接收?
接收一般不用多线程。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧