Linux socket之三:面向无连接的socket通信&&sokcet超时处理

(1)无连接的socket通信相对于有连接的socket通信较为简单,因为在传输过程中不保证能否到达,常用于对数据要求不高的地方。由于省去了很多开销,它的传输速度比有连接的socket通信要快,使用UDP传输数据。数据通信示意图如下:

                                                                       Linux socket之三:面向无连接的socket通信&&sokcet超时处理_第1张图片

如上,服务端在绑定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));	//设置发送数据超时

 

你可能感兴趣的:(linux,socket,struct,服务器)