广播服务器到客户端 C

时间:2021-03-16 19:20:45

标签: c broadcastreceiver client-server communication

我正在尝试从服务器向客户端广播 UDP 消息。我希望服务器将广播发送给客户端,然后让客户端确认广播。他们都编译没有错误,但服务器不会发送广播。服务器说绑定成功。任何提示都会有所帮助。

客户端.c

    #include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <arpa/inet.h>

#define PORT 8081

int main (int argc, char* argv[]){

int clientsocket;
int reuse = 1;
int reuseaddr;
int bind_sock;
int rec_broad;
int send_ack;
char dgram[512];
char client_message[2000];
struct sockaddr_in serv_address;
struct sockaddr_in group;


if (argc != 3) {
   printf("Command line args should be multicast group and port\n");
   printf("(e.g. for SSDP, `listener 239.255.255.250 1900`)\n");
   return 1;
}

clientsocket = socket(AF_INET, SOCK_DGRAM, 0);
if(clientsocket < 0){
    printf("\n\tSocket not created.\n");
    exit(1);
}
else printf("\n\tSocket created successfully.\n");

reuseaddr = setsockopt(clientsocket, SOL_SOCKET, SO_REUSEADDR, (char*)&reuse, sizeof(reuse));
if(reuseaddr < 0){
    printf("\n\tSetting REUSEADDR error.\n");
    exit(1);
}
else printf("\n\tREUSEADDR Successful.\n");

serv_address.sin_family = AF_INET;
serv_address.sin_port = htons(PORT);
serv_address.sin_addr.s_addr = inet_addr(argv[1]);

/*bind_sock = bind(clientsocket, (struct sockaddr*) &serv_address, sizeof(serv_address));
if(bind_sock < 0){
    printf("\n\tBind unsuccessful.\n");
    exit(1);
}
else printf("\n\tBind Successful.\n");*/

strcpy(client_message, "Acknowledged.\n");

for(;;){

    printf("\nListening........\n");

    rec_broad = recvfrom(clientsocket, dgram, sizeof(dgram), 0, (struct sockaddr*) &serv_address, sizeof(serv_address));
    if(rec_broad < 0){
        printf("\n\tBroadcast not received.\n");
        exit(1);
    }
    else printf("\n\tBroadcast received successfully.\n");

    send_ack = sendto(clientsocket, client_message, sizeof(client_message), 0, (struct sockaddr*)&serv_address, sizeof(serv_address));
    if (send_ack < 0){
        printf("\n\tAck not sent.\n");
    }
    else printf("\n\tAcknowledge sent successfully.\n");

}

return 0;
}

Server.c

      #include <stdio.h>
  #include <unistd.h>
  #include <stdlib.h>
  #include <errno.h>
  #include <string.h>
  #include <time.h>
  #include <sys/types.h>
  #include <sys/socket.h>
  #include <netinet/in.h>
  #include <arpa/inet.h>

#define PORT 8081
#ifndef TRUE
#define TRUE 1
#define FALSE 0
#endif

int main (int argc, char *argv[]){
    int serv_socket;
    struct sockaddr_in broadcast_addr;
    struct sockaddr_in client_addr;
    int b_addr_len;
    int ret;
    int bind_sock;
    int yes = 1;
    char buffer[2000];
    int send_broad;
    int z;


//Create socket
serv_socket = socket(AF_INET, SOCK_DGRAM, 0);
if(serv_socket < 0){
    printf("\n\tProblem1.\n");
    exit(1);
}
else printf("\n\tSocket made successful.\n");

//Setsockopt
ret = setsockopt(serv_socket, SOL_SOCKET, SO_BROADCAST, (char*)&yes, sizeof(yes));
if(ret < 0){
    printf("\n\tSetsockopt error.\n");
    return -1;
}
else printf("\n\tSetsockopt successful.\n");

b_addr_len = sizeof(broadcast_addr);

//Broadcast Address
memset((void*)&broadcast_addr, 0, b_addr_len);
broadcast_addr.sin_family = AF_INET;
broadcast_addr.sin_addr.s_addr = inet_addr(argv[1]);
broadcast_addr.sin_port = htons(atoi(argv[2]));

//Bind socket with client
bind_sock = bind(serv_socket, (struct sockaddr*) &client_addr, b_addr_len);
if (ret < 0){
    printf("\n\tBind unsuccessful.\n");
    exit(1);
}
else printf("\n\tBind successful.\n");

memset(buffer, '\0', 2000);
strcpy(buffer, "This is the broadcast!\n");

//Send broadcast
send_broad = sendto(serv_socket, buffer, sizeof(buffer), 0, (struct sockaddr*)&broadcast_addr, b_addr_len);
if(send_broad < 0){
    printf("\n\tBroadcast not sent.\n");
    exit(1);
}
else printf("\n\tBroadcast sent OK.\n");

return 0;

}

0 个答案:

没有答案