聊天工具 客户端

#include <sys/types.h>   
#include <sys/socket.h>   
#include <netinet/in.h>   
#include <arpa/inet.h>   
#include <time.h>   
#include <string.h>   
#include <stdio.h>   
#include <unistd.h>   
#include <stdlib.h>   
#define HELLO_PORT  12345   
#define HELLO_GROUP "225.0.0.37"   
#define MSGBUFSIZE 6000  
    unsigned char msgbuf[MSGBUFSIZE];  

int main(int argc, char *argv[])  
{  
    struct sockaddr_in addr;  
    int fd, nbytes,addrlen;  
    struct ip_mreq mreq;  
    u_int yes=1; /*** MODIFICATION TO ORIGINAL */  
    /* create what looks like an ordinary UDP socket */  
    if ((fd=socket(AF_INET,SOCK_DGRAM,0)) < 0)   
    {  
        perror("socket");  
        exit(1);  
    }  
    /**** MODIFICATION TO ORIGINAL */  
    /* allow multiple sockets to use the same PORT number */  
    if (setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(yes)) < 0)   
    {  
        perror("Reusing ADDR failed");  
        exit(1);  
    }  
    /*** END OF MODIFICATION TO ORIGINAL */  
    /* set up destination address */  
    memset(&addr,0,sizeof(addr));  
    addr.sin_family=AF_INET;  
    addr.sin_addr.s_addr=htonl(INADDR_ANY); /* N.B.: differs from sender */  
    addr.sin_port=htons(HELLO_PORT);  
    /* bind to receive address */  
    if (bind(fd,(struct sockaddr *) &addr,sizeof(addr)) < 0)  
    {  
        perror("bind");  
        exit(1);  
    }  
    /* use setsockopt() to request that the kernel join a multicast group */  
    mreq.imr_multiaddr.s_addr=inet_addr(HELLO_GROUP);  
    mreq.imr_interface.s_addr=htonl(INADDR_ANY);  
    if (setsockopt(fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq)) < 0)   
    {  
        perror("setsockopt");  
        exit(1);  
    }  
    /* now just enter a read-print loop */  
    while (1)   
    {  
        memset(msgbuf, 0, MSGBUFSIZE);
        //ssize_t recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen);   
        addrlen=sizeof(addr);  
        if ((nbytes=recvfrom(fd, msgbuf, MSGBUFSIZE, 0, (struct sockaddr *) &addr, (socklen_t *)&addrlen)) < 0)   
        {  
            perror("recvfrom");  
            exit(1);  
        }  
        printf(" %d  %d \n",nbytes,msgbuf[0]);
        //puts(msgbuf);  
    }  
    return 0;  
}  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值