环境:
3.16.0-4-amd64
gcc version 4.8.4
Debian GNU/Linux 8
描述:
在阅读一段程序源码时(程序是没有问题的),看到一段的 socket 的使用:
- 服务端只是进行了套接字的绑定,没有 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);
客户端只是进行了 socket() 的初始化,没有 connect 的过程:
cli_sockfd = socket(AF_INET,SOCK_DGRAM,0);if(cli_sockfd < 0)
{return -1;
}
代码中却直接写了从服务端接收数据:
clilen = sizeof(cliaddr);
memset(recvbuf,0,sizeof(recvbuf));
msglen = recvfrom(serv_sockfd,recvbuf,sizeof(recvbuf),0,(struct sockaddr *)&cliaddr,&clilen);
- 同样的可以直接向客户端的 socket 发送数据:
sendto(cli_sockfd,buf,strlen(buf),0,(struct sockaddr *)&servaddr,sizeof(servaddr));
问题:
1.为什么可以这种操作(一个没有 listen,一个没有 connect,却可以互相通信)?
2.如果 1 的操作成立,什么情况下会这样使用?
3.如果 1 的操作不成立,是丢掉了什么吗(我全局搜索确实没有搜到 listen 和 connect 关键字)?