问题描述
我正在尝试从服务器向客户端广播 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 (将#修改为@)