网络超时检测,广播和组播,本地套接字

本文探讨了网络通信中的超时检测,通过设置SO_RCVTIMEO和使用select进行检测。还介绍了广播和组播的概念,广播用于向局域网所有主机发送数据,而组播则是多播的一种形式,只向特定多播组内的主机发送。最后提到了本地套接字在进程间通信中的应用。
摘要由CSDN通过智能技术生成

1.网络超时:

在网络通信中,很多操作会使得进程阻塞,TCP套接字中的recv/accept/connect,UDP套接字中的recvfrom。

超时检测的必要性:避免进程在没有数据时无限制的阻塞,当设定的时间到时,进程从原操作返回继续运行。

int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);
网络超时检测1:设置socket的属性SO_RCVTIMEO

参考代码:struct timeval tv;

tv.tv_sec = 5; // 设置5秒时间

tv.tv_usec = 0;

setsockopt(sockfd,SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));//设置接收超时

recv()/ recvfrom()//从socket读取数据

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <errno.h>
int main()
{
        //监听套接字文件描述符
        int listenFd = -1;
        //连接套接字的文件描述符
        int connFd = -1;
        //服务器的地址结构
        struct sockaddr_in servAddr = {0};
        struct sockaddr_in cliAddr = {0};
        socklen_t len = sizeof(cliAddr);
        struct timeval tv = {5, 0};//设置5秒时间 {5s, 0um}
        int ret;
        char buf[100] = {0};
        //1.创建套接字
        listenFd = socket(PF_INET, SOCK_STREAM, 0);
        if(listenFd < 0)
        {
                perror("socket error!");
                return -1;
        }
        printf("socket ok\n");
        //2.绑定ip地址和端口号
        servAddr.sin_family = PF_INET;
        servAddr.sin_port = htons(10086);
        servAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
        ret = bind(listenFd, (struct sockaddr *)&servAddr, sizeof(servAddr));

        if(ret < 0)
        {
                perror("bind error!");
                close(listenFd);
                return -1;
        }
        printf("bind ok!\n");
        //3.创建监听队列(使得主动的套接字变成可以被连接的被动套接字)  
        ret = listen(listenFd, 1);
        if(ret < 0)
        {
                perror("listen error\r\n");
                close(listenFd);
                return -1;
        }
        printf("listening.....\n");
        //设置socket的属性为RECVTIMO
        setsockopt(listenFd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
        //4.等待并建立连接
        while(1)
        {
                connFd = accept(listenFd, (struct sockaddr *)&cliAddr, &len);
                printf("errno = %d\n", errno);

                if(connFd < 0 && EAGAIN == errno)
                {
                        printf("no client connect!\n");
                        continue;
                }
                else if(connFd < 0 && EAGAIN != errno)
                {
                        perror("accept error!");
                        close(listenFd);
                        return -1;
                }
                break;
        }
        printf("IP:%s, PORT:%d accept 
ok!\n",inet_ntoa(cliAddr.sin_
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值