(1)无连接的socket通信相对于有连接的socket通信较为简单,因为在传输过程中不保证能否到达,常用于对数据要求不高的地方。由于省去了很多开销,它的传输速度比有连接的socket通信要快,使用UDP传输数据。数据通信示意图如下:
如上,服务端在绑定socket到指定的IP和端口后,并没有使用listen()来监听连接,也没有使用accept对新的请求建立连接,因为没有连接的概念。
无连接的socket套接字通信,发送和接收数据的函数跟面向连接的套接字通信不同,使用recvfrom()函数和sendto()函数,定义如下:
int recvfrom(int s,void *buf,size_t len,int flags,struct sockaddr *from,socklen_t *fromlen);//用来从指定的IP和端口接收数据
int sendto(int s,const void *msg,size_t len,int flags,const struct sockaddr *to,socklen_t *tolen); //用来向指定的端口发送数据
无连接的套接字可以在同一个socket与不同的IP和端口收发数据,可以在服务器端管理不同的连接。
(2) 由于网络通信中存在很多不确定的因素,因此数据的传输不可能每次都正确,需要对数据发送和接收做超时处理。如果超过这个时间没有得到反馈,认为数据传输失败,socket提供了setsockopt()和getsockopt()用来设置套接字和得到套接字参数。
原型分别是:
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);
int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);
参数s是套接字句柄;level指定不同的协议,目前仅有SOL_SOCKET和IPPROTO_TCP两个协议;optname是套接字参数名称;optval是一个指向timeval结构的指针,可以用这个表示超时等待的时间长度。
一个实例如下:
struct timeval time_out; time_out.tv_sec = 5; time_out.tv_usec = 0; //设置超时时间5秒 setsockopt(s,IPPROTO_TCP,SO_RCVTIMEO,&time_out,sizeof(time_out)); //设置接收数据超时 setsockopt(s,IPPROTO_TCP,SO_SNDTIMEO,&time_out,sizeof(time_out)); //设置发送数据超时