关于socket编程问题,100分急求
1、首先若大量包裹是一起发的,完全不用操心这个问题,客户端发完包时会close链接,此时会发一个FIN信息表示已经发送完毕,这时服务器会自动收到FIN信息知道客户端完成发包完成了。而这些操作都是在socket api级别完成的,不用额外发一个EOF标志。
2、客户端包大于服务器缓冲区,这也不是你操心的,api级别会自动处理客户和服务器之间缓冲区的情况。若发包1000B而服务区缓冲区是250B,服务器收到250B造成缓冲区已满时,会通知客户端等下再发第二个250B(仅做个举例,这里面有个滑动窗口概念比较复杂。),所以客户收到等待通知时会隔上几个毫秒重发第二个250B就这样反复,直到服务器收到所有包为止。
所以说上面两个问题在编程时不需要考虑,但是需要编程人员理解里面的原理。另外我觉得题目中服务器记录所有包裹所用时间既是客户和服务器断开的时间。
socket的send和recv是同时支持TCP和UDP的。从这两个函数的设计可以看出,协议简单来说就是读写数据。
socket的选项是 SOCK_STREAM 。
send的返回值>0时,表示实际发送了多少字节。 注意: 只是copy到系统缓存里,系统决定什么时候会发送这些数据。
send的返回值==0时,这个在send空串时会发生,是正常的。
send的返回值<0时(只会等于-1吧),需要检查errno,当 errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN 时,连接正常,可以稍后再试。其他的就是连接异常了。
recv的返回值>0时,表示实际接受到多少字节。
recv的返回值==0时, 表示连接断开 ,也就是收到了FIN或者RST。
recv的返回值<0时,检查errno,和send类似。
socket的选项是 SOCK_DGRAM 。
send的返回值>0时, 返回值应该等于发送的数据长度 。如果send的数据大于MTU,会在IP层分片,到达目标机器后IP层重组。
send的返回值==0时,这个只在发送空串时出现。 注意: 真的会发送空数据的。
send的返回值<0时,检查errno,确定连接是否还正常。一般不会发生吧,UDP的send是直接发送出去的。
recv的返回值>0时, 收到一个完整的数据包 。这个完整性是有IP层保证的。
recv的返回值==0时, 收到空包,这和TCP有很大不同 。
recv的返回值<0时,检查errno,确定socket是否正常。
PS: UDP还有两个函数 sendto 和 recvfrom 。客户端在调用connect后,才能用 send 和 recv , 服务器端只能用 sendto 和 recvfrom 。
UDP无连接,无顺序,自然不能代替TCP。
TCP是流式协议,需要应用层确认数据是否接受完整,也不能代替UDP。
应用要同时支持两种协议,得在上层做包装。有个KCP,使用UDP模拟TCP。
可以用WINDOWS完成端口(等同于Linux下的epoll模型)来实现你的需求,以下是简介:
Win32重叠I/O(Overlapped I/O)机制允许发起一个操作,然后在操作完成之后接受到信息。对于那种需要很长时间才能完成的操作来说,重叠IO机制尤其有用,因为发起重叠操作的线程 在重叠请求发出后就可以自由的做别的事情了。在WinNT和Win2000上,提供的真正的可扩展的I/O模型就是使用完成端口(Completion Port)的重叠I/O完成端口---是一种WINDOWS内核对象。完成端口用于异步方式的重叠I/0情况下,当然重叠I/O不一定非使用完成端口不 可,还有设备内核对象、事件对象、告警I/0等。但是完成端口内部提供了线程池的管理,可以避免反复创建线程的开销,同时可以根据CPU的个数灵活的决定 线程个数,而且可以让减少线程调度的次数从而提高性能其实类似于WSAAsyncSelect和select函数的机制更容易兼容Unix,但是难以实现 我们想要的“扩展性”。而且windows的完成端口机制在操作系统内部已经作了优化,提供了更高的效率。所以,我们选择完成端口开始我们的服务器程序的 开发。
搭建外网访问,首先你要有一台外网可访问的服务器,有以下几种方法可以实现。
一、购买外网服务器。由于服务器端使用JAVA语言开发,所以外网服务器操作系统可以是Linux或Windows,这个需要你花钱购买。如果只是测试,你可以选择购买阿里云的云服务器,非常便宜。
二、还有一种方法就是你通过花生壳之类的软件进行映射你的网络,但花生壳对长城宽带之类的网络支持不是特别好,如果需要很好的支持,那也需要花钱购买。
三、如果你是通过路由器上网,并且可以操作路由器权限且使用的是电信或者是联通的网络,那可以直接在路由器里面做端口映射,这个你可以百度一下,有很多文章讲的非常清楚,这里篇幅限制,就不贴了。
四、如果你是直接通过猫上网且使用电信或联通宽带,那可以直接使用本机外网IP访问你的程序。
以上四种方法中,最稳定的还是购买外网服务器,其它都会有各种问题,你可以选择其中适合你的一种方法。希望能帮助到你
众所周知TCP(Transmission Control Protocol )是一种面向连接的、可靠的、基于字节流的通信协议。而开发TCP socket应用程序是一件比较简单的事情。下面就用一个比较简单的demo 讲解开发的过程。
该程序分为客户端和服务器端,客户端主要是向服务器端发送数据,服务器端主要是对于接收的数据进行显示。
TCP服务器端和客户端的主要流程:
服务器端:1 创建套接字 2 绑定 3 监听 4 接受连接 5 收发数据 6 关闭
客户端: 1 创建套接字 2 连接 3 收发数据 4 关闭
实现中用到的主要函数及
服务器: 1 WSAStartup() 2 socket() 3 bind() 4 listen() 5 accept() 6 recv() 7 closesocket() 8 WSACleanup()
客户端: 1 WSAStartup() 2 socket() 3 connect() 4 send() 5 closesocket() 6 WSACleanup()
下面是server 和 client 的实现代码,运行的时候首先启动server,然后再启动client, 则在server部分打印出“hello world” 。
0条评论