关于socket编程问题,100分急求
作业让我们编写一个客户端程序,一个服务器端程序,使用TCP。客户端要在30秒内尽快发送大量包到服务器端,服务器端需要收到所有包裹并且记录收所有包裹所用的时间。问题如下:1...
作业让我们编写一个客户端程序,一个服务器端程序,使用TCP。
客户端要在30秒内尽快发送大量包到服务器端,服务器端需要收到所有包裹并且记录收所有包裹所用的时间。
问题如下:
1、如何让服务器端知道包裹已经收完?我的设想是客户端发一个EOF flag给服务器,但具体如何实现?
2、如果客户端发的包大于服务器端程序里设定的缓冲区,怎么计算何时【收到一个完整的包】?,就是说,包1000B,缓冲区250B,我需要收四次吗? 展开
客户端要在30秒内尽快发送大量包到服务器端,服务器端需要收到所有包裹并且记录收所有包裹所用的时间。
问题如下:
1、如何让服务器端知道包裹已经收完?我的设想是客户端发一个EOF flag给服务器,但具体如何实现?
2、如果客户端发的包大于服务器端程序里设定的缓冲区,怎么计算何时【收到一个完整的包】?,就是说,包1000B,缓冲区250B,我需要收四次吗? 展开
展开全部
1、首先若大量包裹是一起发的,完全不用操心这个问题,客户端发完包时会close链接,此时会发一个FIN信息表示已经发送完毕,这时服务器会自动收到FIN信息知道客户端完成发包完成了。而这些操作都是在socket api级别完成的,不用额外发一个EOF标志。
2、客户端包大于服务器缓冲区,这也不是你操心的,api级别会自动处理客户和服务器之间缓冲区的情况。若发包1000B而服务区缓冲区是250B,服务器收到250B造成缓冲区已满时,会通知客户端等下再发第二个250B(仅做个举例,这里面有个滑动窗口概念比较复杂。),所以客户收到等待通知时会隔上几个毫秒重发第二个250B就这样反复,直到服务器收到所有包为止。
所以说上面两个问题在编程时不需要考虑,但是需要编程人员理解里面的原理。另外我觉得题目中服务器记录所有包裹所用时间既是客户和服务器断开的时间。
2、客户端包大于服务器缓冲区,这也不是你操心的,api级别会自动处理客户和服务器之间缓冲区的情况。若发包1000B而服务区缓冲区是250B,服务器收到250B造成缓冲区已满时,会通知客户端等下再发第二个250B(仅做个举例,这里面有个滑动窗口概念比较复杂。),所以客户收到等待通知时会隔上几个毫秒重发第二个250B就这样反复,直到服务器收到所有包为止。
所以说上面两个问题在编程时不需要考虑,但是需要编程人员理解里面的原理。另外我觉得题目中服务器记录所有包裹所用时间既是客户和服务器断开的时间。
展开全部
假设是linux环境:
1. 你只要不断地调用read(socket, rev_buf, MAX_REV_BUF_SIZE-1), 并在while循环里检查read的返回值是不是为0,只要不是0,就把它rev_buf加到一个string中。所以不需要用EOF flag,只要client端不发送了,服务器端read的时候就会返回0.
2. 缓冲区只会对TCP/IP的协议栈的读取有影响,它的设置是为了协调应用层读取速度比网络层慢的问题,它对服务器的读取是透明的,所以不影响服务端的读取。只是对client端有影响,因为如果服务端没有及时从缓冲区中读取内容,client就会wait.
1. 你只要不断地调用read(socket, rev_buf, MAX_REV_BUF_SIZE-1), 并在while循环里检查read的返回值是不是为0,只要不是0,就把它rev_buf加到一个string中。所以不需要用EOF flag,只要client端不发送了,服务器端read的时候就会返回0.
2. 缓冲区只会对TCP/IP的协议栈的读取有影响,它的设置是为了协调应用层读取速度比网络层慢的问题,它对服务器的读取是透明的,所以不影响服务端的读取。只是对client端有影响,因为如果服务端没有及时从缓冲区中读取内容,client就会wait.
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个不懂 期待内行的同学回答
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询