广播服务器到客户端 C

问题描述

我正在尝试从服务器向客户端广播 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),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),(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,0);
if(serv_socket < 0){
    printf("\n\tProblem1.\n");
    exit(1);
}
else printf("\n\tSocket made successful.\n");

//Setsockopt
ret = setsockopt(serv_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,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),(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;

}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)