TCP 组播 广播

来源:互联网 发布:诱导交友app源码 编辑:程序博客网 时间:2024/05/17 18:18

在TCP/IP中传输信息主要方式有两种,UDP和TCP,UDP是不可靠通信,在传输信息之前并没有和服务器建立连接,客户端采用sendto函数(可通过man命令查看sendto函数的原型),服务器端主要采用recvfrom函数接受来自客户端的信息。
TCP采用可靠连接,主要是连接采用三次握手,断开时采用四次挥手,具体过程可以参考wireshark抓包进行查看其具体过程,在具体建立连接的过程主要是
1、建立socket套接字sockfd
2、listen监听
3、accept接收来自客户端的连接,建立新的套接字connfd
4、recv函数接收来自客户端的信息,客户端采用send函数进行传送数据。
接下来po出组播的代码
最主要的是这部分代码:通过设置组播的IP和本机的IP来接收发送到组播IP的信息,
同时通过setsockopt函数来设置函数的属性

struct ip_mreqn addr;    addr.imr_address.s_addr = inet_addr("192.168.4.69");//需要同时绑定本机IP和组播的IP    addr.imr_multiaddr.s_addr = inet_addr("224.0.1.1");    addr.imr_ifindex = 0;    setsockopt(udp_socket,IPPROTO_IP,IP_ADD_MEMBERSHIP,&addr,sizeof(addr));//设置socket的属性
int main(int argc, const char *argv[]){    int udp_socket;    char buf[64];    struct sockaddr_in myaddr,peeraddr;    int peer_len;    if((udp_socket = socket(PF_INET,SOCK_DGRAM,0)) == -1)    {        perror("socket");        exit(1);    }#if 1    memset(&myaddr,0,sizeof(myaddr));//  bzero(&myaddr,sizeof(myaddr));    myaddr.sin_family = PF_INET;    myaddr.sin_port = htons(50001);    myaddr.sin_addr.s_addr = inet_addr("224.0.1.1");    if(bind(udp_socket,(struct sockaddr *)&myaddr,sizeof(myaddr)) == -1)    {        perror("bind");        exit(1);    }#endif #if 1    memset(&peeraddr,0,sizeof(peeraddr));    peer_len = sizeof(peeraddr);    struct ip_mreqn addr;    addr.imr_address.s_addr = inet_addr("192.168.4.69");//需要同时绑定本机IP和组播的IP    addr.imr_multiaddr.s_addr = inet_addr("224.0.1.1");    addr.imr_ifindex = 0;    setsockopt(udp_socket,IPPROTO_IP,IP_ADD_MEMBERSHIP,&addr,sizeof(addr));//设置socket的属性    while(1)    {        if(recvfrom(udp_socket,buf,sizeof(buf),0,(struct sockaddr *)&peeraddr,                &peer_len) == -1)        {            perror("recvfrom");            exit(1);        }        printf("from %s : %d : %s",inet_ntoa(peeraddr.sin_addr),                ntohs(peeraddr.sin_port),buf);    }#endif     return 0;}
0 0
原创粉丝点击