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日

悬赏问题

  • ¥15 PointNet++的onnx模型只能使用一次
  • ¥20 西南科技大学数字信号处理
  • ¥15 有两个非常“自以为是”烦人的问题急期待大家解决!
  • ¥30 STM32 INMP441无法读取数据
  • ¥15 R语言绘制密度图,一个密度曲线内fill不同颜色如何实现
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧,别用大模型回答,大模型的答案没啥用
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。