如何反回本机的IP地址?

feel8 2007-02-05 11:42:00
怎么样可以编写一个C程序,功能如下:
运行本程序后每隔十分钟向指定的网页页面提交一个简单的表单,来报告自己的IP地址?

目的就是为了得到运行此程序的电脑的IP地址,有什么办法可以方便些得到?用C语言写的东西。 接收IP地址的机器IP不固定

谢谢大家,这个功能做起来简单不?能给个例子么。。。谢谢~
...全文
354 点赞 收藏 9
写回复
9 条回复
xvbn_2003 2007年02月06日
学习
回复 点赞
atiansk2006 2007年02月06日
我的VC没有这个头文件atlstr.h, 是怎么回事?
回复 点赞
doubhor 2007年02月06日
下面是我使用过的一个参考函数,在类中间的,关于变量自己修改一下,仅供参考:

void readIp()
{
int res = 0;
char ipName[20];

res = gethostname(m_hostName, sizeof(m_hostName));
if (res != 0)
{
TRACE(_T("\n[!!]Get hostname Error: %u\n"), WSAGetLastError());
fprintf(m_debugFp, "\n[!!]Get hostname Error: %u\n", WSAGetLastError());

CString errStr;
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
WSAGetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
// Process any inserts in lpMsgBuf.
// ...
// Display the string.
errStr.Format(_T("Gethostname Error[%d,%d]: "), WSAGetLastError(), GetLastError());
AfxMessageBox(errStr + (LPCTSTR)lpMsgBuf, MB_OK | MB_ICONERROR);
// Free the buffer.
LocalFree( lpMsgBuf );
}
else
{
hostent* pHostent = gethostbyname(m_hostName);
if (pHostent==NULL)
{
TRACE(_T("\n[!!]gethostbyname Error: %u\n"), WSAGetLastError());
fprintf(m_debugFp, "\n[!!]gethostbyname Error: %u\n", WSAGetLastError());
}
else
{
for (m_ipNum = 0; m_ipNum < MAX_IPNUM && pHostent->h_addr_list[m_ipNum] != NULL; m_ipNum++)
{
m_ip[m_ipNum] = ntohl(*(int *)pHostent->h_addr_list[m_ipNum]);
getIpString(m_ipNum, ipName, sizeof(ipName));
fprintf(m_debugFp, "\n[i]Ip-host:%s[0x%08x]-%s", ipName, m_ip[m_ipNum], m_hostName);
}
}
}
}

回复 点赞
yanran_hill 2007年02月06日
gethostbyname函数,得到的hostinfo->h_addr_list是一个数组,数组的最后一个成员是0
表示的含义是,从本机找到的和指定的名称相对应的IP地址,有时候,一个机器名可能对应
多个IP
回复 点赞
goodluckyxl 2007年02月06日
gethostbyname
回复 点赞
xyxfly 2007年02月06日
呵呵,只会c++的
#include <winsock2.h>
#include <atlstr.h> // For CString
#include <iostream>

using std::cout;
using std::endl;

#pragma comment(lib, "Wsock32.lib")

void main(void)
{
char name[255];
WORD wVersionRequested;
CString ip;
WSADATA wsaData;
PHOSTENT hostinfo;

wVersionRequested = MAKEWORD( 2, 0 );
if ( WSAStartup( wVersionRequested, &wsaData ) == 0 )
{
if ( gethostname ( name, sizeof(name)) == 0)
{
cout << name << "\n";
if ((hostinfo = gethostbyname(name)) != NULL)
{
ip = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list);
cout << ip << endl;
}
}
WSACleanup( );
}
}
回复 点赞
jixingzhong 2007年02月06日
恩,其实应当查询浏览页面的机器的IP,
一个简单的ping就可以获得这个IP了 ......
回复 点赞
jixingzhong 2007年02月06日
用C语言得到本机的IP地址(Linux)

#include <stdio.h>
#include <sys/types.h>
#include <sys/param.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <net/if.h>
#include <netinet/in.h>
#include <net/if_arp.h>

#define MAXINTERFACES 16

main (argc, argv)
register int argc;
register char *argv[];
{
register int fd, intrface, retn = 0;
struct ifreq buf[MAXINTERFACES];
struct arpreq arp;
struct ifconf ifc;

if ((fd = socket (AF_INET, SOCK_DGRAM, 0)) >= 0) {
ifc.ifc_len = sizeof buf;
ifc.ifc_buf = (caddr_t) buf;
if (!ioctl (fd, SIOCGIFCONF, (char *) &ifc)) {
intrface = ifc.ifc_len / sizeof (struct ifreq);
printf("interface num is intrface=%d\n\n\n",intrface);
while (intrface-- > 0)
{
printf ("net device %s\n", buf[intrface].ifr_name);

/*Jugde whether the net card status is promisc*/
if (!(ioctl (fd, SIOCGIFFLAGS, (char *) &buf[intrface]))) {
if (buf[intrface].ifr_flags & IFF_PROMISC) {
puts ("the interface is PROMISC");
retn++;
}
} else {
char str[256];

sprintf (str, "cpm: ioctl device %s", buf[intrface].ifr_name);
perror (str);
}

/*Jugde whether the net card status is up*/
if (buf[intrface].ifr_flags & IFF_UP) {
puts("the interface status is UP");
}
else {
puts("the interface status is DOWN");
}

/*Get IP of the net card */
if (!(ioctl (fd, SIOCGIFADDR, (char *) &buf[intrface])))
{
puts ("IP address is:");
puts(inet_ntoa(((struct sockaddr_in*)(&buf[intrface].ifr_addr))->sin_addr));
puts("");
//puts (buf[intrface].ifr_addr.sa_data);
}
else {
char str[256];

sprintf (str, "cpm: ioctl device %s", buf[intrface].ifr_name);
perror (str);
}

/*Get HW ADDRESS of the net card */
if (!(ioctl (fd, SIOCGIFHWADDR, (char *) &buf[intrface])))
{
puts ("HW address is:");

printf("%02x:%02x:%02x:%02x:%02x:%02x\n",
(unsigned char)buf[intrface].ifr_hwaddr.sa_data[0],
(unsigned char)buf[intrface].ifr_hwaddr.sa_data[1],
(unsigned char)buf[intrface].ifr_hwaddr.sa_data[2],
(unsigned char)buf[intrface].ifr_hwaddr.sa_data[3],
(unsigned char)buf[intrface].ifr_hwaddr.sa_data[4],
(unsigned char)buf[intrface].ifr_hwaddr.sa_data[5]);

puts("");
puts("");
}

else {
char str[256];

sprintf (str, "cpm: ioctl device %s", buf[intrface].ifr_name);
perror (str);
}
}
} else
perror ("cpm: ioctl");

} else
perror ("cpm: socket");

close (fd);
return retn;
}

全文出自 : chinaunix.net
回复 点赞
feel8 2007年02月06日
我没描述清楚。。。
是这样的。
服务器一台,IP地址不固定,安装WEB服务器,使用3322.org域名,例如ex.3322.org

客户机IP不固定,服务器想得到客户机的IP。
能否在客户机中用C写一个小程序,运行后,向服务器提交IP。使用表单提交是不是省事点?
有没有别的方法提交?
回复 点赞
发动态
发帖子
C语言
创建于2007-09-28

3.2w+

社区成员

24.0w+

社区内容

C语言相关问题讨论
社区公告
暂无公告