m0_46617459 2021-09-10 14:44 采纳率: 20%
浏览 32
已结题

为什么我看到服务端可以不进行listen()和accept(),客户端不进行connect,两端就可以直接使用sendto()和recvfrom

环境:

3.16.0-4-amd64
gcc version 4.8.4
Debian GNU/Linux 8

描述:
在阅读一段程序源码时(程序是没有问题的),看到一段的 socket 的使用:

  1. 服务端只是进行了套接字的绑定,没有 listen() 和 accept() 的过程:
if((serv_sockfd = socket(AF_INET,SOCK_DGRAM,0))<0)
    {
             exit(-1);
    }

    bzero(&servadd,sizeof(servadd));

    servadd.sin_family = AF_INET;
    servadd.sin_addr.s_addr = htonl(INADDR_ANY);
    servadd.sin_port = htons(SERV_PORT);

  1. 客户端只是进行了 socket() 的初始化,没有 connect 的过程:
    cli_sockfd = socket(AF_INET,SOCK_DGRAM,0);

    if(cli_sockfd < 0)
    {

     return -1;   
    

    }

  2. 代码中却直接写了从服务端接收数据:

 clilen = sizeof(cliaddr);
 memset(recvbuf,0,sizeof(recvbuf));
 msglen = recvfrom(serv_sockfd,recvbuf,sizeof(recvbuf),0,(struct sockaddr *)&cliaddr,&clilen);

  1. 同样的可以直接向客户端的 socket 发送数据:
sendto(cli_sockfd,buf,strlen(buf),0,(struct sockaddr *)&servaddr,sizeof(servaddr)); 

问题:
1.为什么可以这种操作(一个没有 listen,一个没有 connect,却可以互相通信)?
2.如果 1 的操作成立,什么情况下会这样使用?
3.如果 1 的操作不成立,是丢掉了什么吗(我全局搜索确实没有搜到 listen 和 connect 关键字)?

  • 写回答

1条回答 默认 最新

报告相同问题?

问题事件

  • 系统已结题 9月18日
  • 已采纳回答 9月10日
  • 创建了问题 9月10日

悬赏问题

  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度