struct sockaddr_in saddr;
saddr.sin_family = AF_INET;
saddr.sin_port = htons(atoi(argv[1]));
saddr.sin_addr.s_addr = htonl(INADDR_ANY); //htonl(INADDR_ANY) 代表 主机所有的地址
bind(socketfd,(struct sockaddr *)&saddr,sizeof(saddr));
6、接收数据
recvfrom(......)
发送端
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
/*
*发送端
*/
#define GROUP_IP "224.0.0.10"
#define GROUP_PORT 60002
int main()
{
//建立套接字
int socket_fd;
socket_fd = socket(AF_INET,SOCK_DGRAM,0);
if(socket_fd < 0)
{
perror("socket fail");
return -1;
}
//往组播地址发送数据
struct sockaddr_in send_addr;
send_addr.sin_family = AF_INET;
send_addr.sin_port = htons(GROUP_PORT);
send_addr.sin_addr.s_addr = inet_addr(GROUP_IP);
bind(socket_fd,(struct sockaddr *)&send_addr,sizeof(send_addr));
//往组播地址发送数据
char buf[1024] = {0};
int ret;
while(1)
{
bzero(buf,sizeof(buf));
scanf("%s",buf);
sendto(socket_fd,buf,strlen(buf),0,(struct sockaddr *)&send_addr,sizeof(send_addr));
}
//关闭套接字
close(socket_fd);
}
接收端
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
/*
* 接收端
*/
#define GROUP_IP "224.0.0.10"
#define GROUP_PORT 60002
int main()
{
//建立套接字
int socket_fd;
socket_fd = socket(AF_INET,SOCK_DGRAM,0);
if(socket_fd < 0)
{
perror("socket fail");
return -1;
}
//定义组播结构体
struct ip_mreq vmreq;
//添加组播地址
inet_pton(AF_INET,"224.0.0.10",&vmreq.imr_multiaddr);
//将自己的ip添加到到组播地址中
inet_pton(AF_INET,"192.168.11.2",&vmreq.imr_interface);
//设置组播属性到套接字中
setsockopt(socket_fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&vmreq,sizeof(vmreq));
//绑定本机任意地址
struct sockaddr_in saddr;
saddr.sin_family = AF_INET;
saddr.sin_port = htons(60002);
saddr.sin_addr.s_addr = htonl(INADDR_ANY); //htonl(INADDR_ANY) 代表 主机所有的地址
bind(socket_fd,(struct sockaddr *)&saddr,sizeof(saddr));
//接收数据
struct sockaddr_in recv_addr;
socklen_t addrlen = sizeof(recv_addr);
char buf[1024] = {0};
int ret;
while(1)
{
memset(buf,0,sizeof(buf));
ret = recvfrom(socket_fd,buf,sizeof(buf),0,(struct sockaddr *)&recv_addr,&addrlen);
char *ip = inet_ntoa(recv_addr.sin_addr);
int port = ntohs(recv_addr.sin_port);
printf("[ip:%s port:%d] buf:%s ret:%d\n",ip,port,buf,ret);
}
//关闭套接字
close(socket_fd);
}