1. 程式人生 > >SOCKET 程式設計 獲取本機IP 地址

SOCKET 程式設計 獲取本機IP 地址

源程式:

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

#define PORT 7778
#define MAXDATASIZE 1024

int main()
{
  struct sockaddr_in user_addr,my_addr;
  char my_ip[13];
  int socket_fd;
  int so_broadcast=1;
  char buf[MAXDATASIZE];
    
   socklen_t size;
  
    my_addr.sin_family=AF_INET;
    my_addr.sin_port=htons(PORT);
    my_addr.sin_addr.s_addr=inet_addr("255.255.255.255");
    

    user_addr.sin_family=AF_INET;
    user_addr.sin_port=htons(PORT);
    user_addr.sin_addr.s_addr=htonl(INADDR_ANY);
    

   if((socket_fd=(socket(AF_INET,SOCK_DGRAM,0)))==-1) {
        perror("socket");
        exit(1);
    }
   setsockopt(socket_fd,SOL_SOCKET,SO_BROADCAST,&so_broadcast,sizeof(so_broadcast));//??socket傳送的資料具有廣播特性

   if((bind(socket_fd,(struct sockaddr *)&user_addr, sizeof(struct sockaddr)))==-1) {
        perror("bind");
        exit(1);
    }

    strcpy(buf,"broadcast test");
    sendto(socket_fd,buf,strlen(buf),0,(struct sockaddr *)&my_addr,sizeof(my_addr));
    size=sizeof(user_addr);
    recvfrom(socket_fd,buf,MAXDATASIZE,0,(struct sockaddr *)&user_addr,&size);

    strcpy(my_ip,inet_ntoa(user_addr.sin_addr));
    printf("my_ip:%s\n",inet_ntoa(user_addr.sin_addr));
}