求助:socket连接问题咨询

ymynotg 2009-06-21 12:18:32
【描述】:刚刚接触socket编程,看了一下基本原理,借鉴了一下实例代码,但还有几个问题请教。先谢各位答疑了。

1.客户端A发命令给B,A如何确认B已经成功接收到命令了(异步模式下)?【好像TCP协议本身有确认机制,但程序根据什么进行判断】

2.客户端A如何确认B的一条命令结束:如果B分N次才把命令发送完毕?【借鉴了一写代码,是读取字符流中的信息,以\r
\N作为判断条件.是否都得令写代码自己判断?】

3.当客户端A连续发送N个命令给B,后收到N个返回,A如何判断那个相应于请求的对应关系?【咨询了一下朋友,基本都是按照默认顺序处理了;但如果先发的响应后返回了怎么办?】

4.于服务端建立建立的时候,一般系统会默认分配一个端口号,是否可以自己制定端口号与服务器端进行通信。
...全文
80 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ysysbaobei 2009-06-22
  • 打赏
  • 举报
回复
顶下
  • 打赏
  • 举报
回复
【描述】:刚刚接触socket编程,看了一下基本原理,借鉴了一下实例代码,但还有几个问题请教。先谢各位答疑了。

1.客户端A发命令给B,A如何确认B已经成功接收到命令了(异步模式下)?【好像TCP协议本身有确认机制,但程序根据什么进行判断】

2.客户端A如何确认B的一条命令结束:如果B分N次才把命令发送完毕?【借鉴了一写代码,是读取字符流中的信息,以\r
\N作为判断条件.是否都得令写代码自己判断?】

3.当客户端A连续发送N个命令给B,后收到N个返回,A如何判断那个相应于请求的对应关系?【咨询了一下朋友,基本都是按照默认顺序处理了;但如果先发的响应后返回了怎么办?】

4.于服务端建立建立的时候,一般系统会默认分配一个端口号,是否可以自己制定端口号与服务器端进行通信。


1.TCP连接的话,B会发送一个确认包回去。而udp的话,没有机制可以保证成功送到。你可以自己在应用层增加确认包功能。
2.数据段的内容,跟协议无关,怎么确认你的指令结束,那是你自己数据段制定规则的问题。
http://blog.csdn.net/hairetz/archive/2009/05/29/4223234.aspx
3.TCP啊,seq,序列号啊,你以为tcp3次握手是白忙活的啊。
4.服务器监听了某个端口,那你就必须连接该端口啊,你要制定,要自己修改服务器监听的端口。


「已注销」 2009-06-21
  • 打赏
  • 举报
回复
建议楼主找本网络编程(socket)的书看看
zhangzhongke007 2009-06-21
  • 打赏
  • 举报
回复
帮顶~
ymynotg 2009-06-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hairetz 的回复:]
1.TCP连接的话,B会发送一个确认包回去。而udp的话,没有机制可以保证成功送到。你可以自己在应用层增加确认包功能。
2.数据段的内容,跟协议无关,怎么确认你的指令结束,那是你自己数据段制定规则的问题。
http://blog.csdn.net/hairetz/archive/2009/05/29/4223234.aspx
3.TCP啊,seq,序列号啊,你以为tcp3次握手是白忙活的啊。
4.服务器监听了某个端口,那你就必须连接该端口啊,你要制定,要自己修改服务器监听的端口。
[/Quote]

[Quote=引用 3 楼 fantcy 的回复:]
2.
兄弟你说这麽多就一个我碰到过
是这样的
先用一个函数计算出要发送的命令的长度
先把这个长度发送给接收端。
然后记下rece函数的返回值(也就是发送出去的字节数)
当rece函数返回值与长度相符时接受完毕关闭连接。
再就是你可以加上识别字符这样每个数据对应一个字符就不会错了。

多谢!!
从各位大侠的回复中好像得到了一些答案,后续再实践一下。

目前的理解
1、send函数:阻塞模式下,会一直等命令执行完毕后再返回结果,可以根据返回值确定本端是否发送成功,对端是否接受成功;非阻塞模式下,发送后立即返回,根据返回值只能判断发送的数据是否完全成功的放在传输队列中,但无法确认对端是否成功接收。
总结:要想确认对端是否成功收到命令,必须使用阻塞模式。
2、UDP 是面向消息的协议,它保留发送者和接收者之间的消息边界,可以由协议本身保证发送消息的完整性;TCP是面向字节流的协议,不提供帧同步,只能自行写代码进行判断。
3、在网络上是会出现数据发送与接受先后顺序不同的问题,但TCP协议会根据报文的序列号重新排序(UDP应该也会吧,还未找到确切的资料)。总结:数据的顺序问题不需要考虑,由协议本身保证。
4、还不太确认:服务器端创建一个socket时,会绑定使用一个可定制的端口号,但客户端与服务器端进行连接时,系统会再客户端默认分配一个端口号进行通信,我的意思是想在客户端本机也同样制定端口号与服务器端进行通信。

不知道理解的是否正确,请帮忙给看一下,多谢!!
ymynotg 2009-06-21
  • 打赏
  • 举报
回复
应该的。只是目前市面上的一些socket编程的书只写了一些基本原理,细节方面没有介绍,决定去翻一下TCP/IP协议介绍,但被偌大的大部头吓住了。 壮壮胆,改天还得去翻翻。
fantcy 2009-06-21
  • 打赏
  • 举报
回复
2.
兄弟你说这麽多就一个我碰到过
是这样的
先用一个函数计算出要发送的命令的长度
先把这个长度发送给接收端。
然后记下rece函数的返回值(也就是发送出去的字节数)
当rece函数返回值与长度相符时接受完毕关闭连接。
再就是你可以加上识别字符这样每个数据对应一个字符就不会错了。

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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