C - 服务器为客户端广播IP

时间:2013-11-07 21:53:43

标签: c

我需要我的服务器来广播消息(不是重要但它包含其IP /端口信息)。我目前所拥有的是工作服务器广播,代码如下。我不确定是否设置了客户端,因为通常我会使用客户端没有的服务器的IP /端口,直到它收到广播。客户从未收到任何东西。有人能告诉我出了什么问题。

服务器:

struct sockaddr_in server, bcast;
int sockfd;
int blen = sizeof(bcast);
int svrlen = sizeof(server);
char buf[BUFLEN];
if((sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1){
    printf("Socket error.\n"); 
    exit(1);
}

int broadcastPermission = 1;
if (setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, (void *)&broadcastPermission,sizeof(broadcastPermission)) < 0){
        printf("Error setting socket options.");
}

memset(&bcast, 0, sizeof(bcast)); 
bcast.sin_family = AF_INET;
bcast.sin_port = htons(PORT);
bcast.sin_addr.s_addr = htonl(INADDR_ANY);

string bcastIP = BCASTIP;
if(inet_aton("255.255.255.255", &bcast.sin_addr) == 0){
    printf("Broadcast Address error.");
    exit(1);
}

if (bind(sockfd, (struct sockaddr*)&server, sizeof(server)) == -1){
    printf("Port error.\n");
    exit(1);
}

fflush(stdout);
if(int bytes = sendto(sockfd, ipinfo, sizeof(ipinfo), 0, (struct sockaddr*)&bcast, blen) == -1){
    printf("Broadcast send error.");
}
else{
    printf("Sent"):
}

客户端:

struct sockaddr_in server;
int sockfd;
int bytes;
int svrlen = sizeof(server);
char buf[BUFLEN]
if((sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1){
        printf("Socket error.\n"); 
        exit(1);
}

memset((char *)&server, 0, sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(BPORT);
server.sin_addr.s_addr = htonl(INADDR_ANY);

while(1){
    printf("Waiting for broadcast...\n\n");
    fflush(stdout);
    memset(buf,0,BUFLEN);
    bytes = recvfrom(sockfd, buf, BUFLEN, 0, (struct sockaddr*)&server, (socklen_t*)&svrlen);
    printf("Received");
}

2 个答案:

答案 0 :(得分:1)

在尝试接收数据之前,您的客户端没有在套接字上调用bind()。

http://cs.baylor.edu/~donahoo/practical/CSockets/code/BroadcastReceiver.c显示以下示例,您可能会发现它有用:

void DieWithError(char *errorMessage);  /* External error handling function */

int main(int argc, char *argv[])
{
    int sock;                         /* Socket */
    struct sockaddr_in broadcastAddr; /* Broadcast Address */
    unsigned short broadcastPort;     /* Port */
    char recvString[MAXRECVSTRING+1]; /* Buffer for received string */
    int recvStringLen;                /* Length of received string */

    if (argc != 2)    /* Test for correct number of arguments */
    {
        fprintf(stderr,"Usage: %s <Broadcast Port>\n", argv[0]);
        exit(1);
    }

    broadcastPort = atoi(argv[1]);   /* First arg: broadcast port */

    /* Create a best-effort datagram socket using UDP */
    if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
        DieWithError("socket() failed");

    /* Construct bind structure */
    memset(&broadcastAddr, 0, sizeof(broadcastAddr));   /* Zero out structure */
    broadcastAddr.sin_family = AF_INET;                 /* Internet address family */
    broadcastAddr.sin_addr.s_addr = htonl(INADDR_ANY);  /* Any incoming interface */
    broadcastAddr.sin_port = htons(broadcastPort);      /* Broadcast port */

    /* Bind to the broadcast port */
    if (bind(sock, (struct sockaddr *) &broadcastAddr, sizeof(broadcastAddr)) < 0)
        DieWithError("bind() failed");

    /* Receive a single datagram from the server */
    if ((recvStringLen = recvfrom(sock, recvString, MAXRECVSTRING, 0, NULL, 0)) < 0)
        DieWithError("recvfrom() failed");

    recvString[recvStringLen] = '\0';
    printf("Received: %s\n", recvString);    /* Print the received string */

    close(sock);
    exit(0);
}

答案 1 :(得分:0)

  

我需要我的服务器来广播一条消息(并不重要,但它包含了它的IP /端口信息)。

这听起来很像服务发现。你应该真的使用标准的mDNS / Zeroconf协议。您可以使用Avahi库(或使用Linux上的Avahi服务或MacOS X上的Zeroconf)。

相关问题