首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

getsockname函数使用的有关问题

2012-02-20 
getsockname函数使用的问题Linux系统的server,有多个IP地址。写了个程序,想使用getsockname函数得到本地接

getsockname函数使用的问题
Linux系统的server,有多个IP地址。写了个程序,想使用getsockname函数得到本地接收信息的IP地址(事先不绑定socket的IP地址)。程序运行后,得到的IP总是:0.0.0.0而不是实际的接收信息的IP地址。这是怎么回事呢?怎样才能得到实际的接收信息的ip地址呢?程序如下:
---------------------
这是服务器端的程序,另外还有一个客户端定时向server发送信息。
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
int   main()
{
                int   sock;
                char   buff[100];
                socklen_t     i;
                char   *p;
                int   pport;
                struct   sockaddr_in   address,ad;
                address.sin_family=AF_INET;
                address.sin_port=htons(5678);
                address.sin_addr.s_addr=htonl(INADDR_ANY);
                sock=socket(AF_INET,SOCK_DGRAM,0);
                source.sin_family=AF_INET;
                ad.sin_family=AF_INET;
                ad.sin_addr.s_addr=htonl(INADDR_ANY);
                bind(sock,(struct   sockaddr   *)&address,sizeof(address));
                memset(buff,0,100);
                i   =   sizeof(struct   sockaddr_in);
                recvfrom(sock,buff,100,0,(struct   sockaddr   *)&source,&i);
                printf( "Data   recieved   is:%s\n ",buff);
                i   =   sizeof(struct   sockaddr_in);
                if(getsockname(sock,(struct   sockaddr   *)&ad,&i))
                {
                                puts( "Error! ");
                }
                p=inet_ntoa(ad.sin_addr.s_addr);
                printf( "Ip   is:%s\n ",p);
                close(sock);
}


[解决办法]
recvfrom(sock,buff,100,0,(struct sockaddr *)&source,&i);
在這個後面輸入
perror( "recvfrom ");

printf( "Data recieved is:%s\n ",buff);

能收到數據碼?

如果能把
p=inet_ntoa(ad.sin_addr.s_addr);==>
p=inet_ntoa(*((in_addr *)&(ad.sin_addr.s_addr)));


[解决办法]
得到0.0.0.0是很正常的.
如果想知道信息是从哪个IP收到的,需要对每一个IP建一个socket, 并bind到对应的IP.

热点排行