UDP放送のsocket bad addressエラーが解決され、快適

6151 ワード

UDPブロードキャストプログラムの作成が完了すると、コンパイルすると、socket bad address.後で調べたところ、socketバッファを読み取ると、送信側sendtoの戻り値が正常で、受信側recvfromが情報を読めないのは、ポインタがアクセスできない空間を指しているからだということです.送信側コード:client.c
#include 
#include 
#include 
#include 
#include 
#include 
#include 

int main(void){
    int ret;
    int serverfd;

    serverfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(serverfd == -1){
        perror("socket fail
"
); close(serverfd); return -1; } struct sockaddr_in serveraddr, clientaddr; memset(&serveraddr, 0, sizeof(serveraddr)); memset(&clientaddr, 0, sizeof(clientaddr)); serveraddr.sin_family = AF_INET; serveraddr.sin_port = htons(8000); serveraddr.sin_addr.s_addr = INADDR_ANY; ret = bind(serverfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)); if(ret == -1){ perror("bind error
"
); close(serverfd); return -1; } char buf[128]; int sin_size = sizeof(clientaddr); while(1){ memset(buf, 128, 0); recvfrom(serverfd, buf, 128, 0, (struct sockaddr *)&clientaddr, &sin_size); printf("Recv msg from client: %s
"
, buf); } return 0; }

受信側コード:server.c
#include 
#include 
#include 
#include 
#include 
#include 
#include 

int main(void){
    int ret;
    int clientfd;

    clientfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(clientfd ==  -1){
        perror("socket fail
"
); close(clientfd); return -1; } struct sockaddr_in serveraddr; memset(&serveraddr, 0, sizeof(serveraddr)); serveraddr.sin_family = AF_INET; serveraddr.sin_port = htons(8000); serveraddr.sin_addr.s_addr = inet_addr("192.168.5.255"); int on = 1; ret = setsockopt(clientfd, SOL_SOCKET, SO_BROADCAST, (void *)&on, sizeof(on)); //ret = setsockopt(clientfd, SOL_SOCKET, SO_BROADCAST, (void *)on, sizeof(on)); // on &on, , //on 1( 1), if(ret == -1){ perror("setsockopt fail
"
); close(clientfd); return -1; } char buf[128]; while(1){ memset(buf, 0, 128); printf("Client send msg: "); fgets(buf, 128, stdin); sendto(clientfd, buf, strlen(buf), 0, (struct sockaddr *)&serveraddr, sizeof(serveraddr)); } close(clientfd); return 0; }

ポイントを強調するため(ポインタがアクセスできない空間を指している)他の注釈は省略しましたが、ご了承ください.