C 语言获取当前位置

本文介绍如何通过编程获取接口IP,处理来自IP查询服务的GBK编码数据,并进行UTF-8转换。涉及socket编程、IP获取和字符编码转换技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当前位置接口:

http://ip.ws.126.net/ipquery

代码:

#define GET_CITY_IP     "59.111.181.52"
#define GET_CITY_IP_REQUEST  "GET http://ip.ws.126.net/ipquery\r\n\r\n"

static int socketfd = -1;
static struct sockaddr_in server_addr;

int main(int argc, char **argv)
{
    int ret;
    int len;

    bzero(&server_addr, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(SERVER_HTTP_PORT);
    server_addr.sin_addr.s_addr = inet_addr(GET_CITY_IP);

    char json_buffer[2048];
    char request[1024] = {0};

    memset(json_buffer, 0, 2048);
    
    if ((socketfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
        fprintf(stderr, "sokcet error : %s\r\n", strerror(errno));
        exit(1);
    }
    if (connect(socketfd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) < 0)   //发起连接
    {
        fprintf(stderr, "connect failed : %s\r\n", strerror(errno));
        close(socketfd);
        exit(1);
    }
    sprintf(request, "%s", GET_CITY_IP_REQUEST);
    ret = send(socketfd, request, strlen(request), 0);
    if (ret < 0)
    {
        fprintf(stderr, "send errr %s\r", strerror(errno));
    }
    if (recv(socketfd, json_buffer, sizeof(json_buffer), 0) > 0)
    {
        char *pout;

        printf("%s\r\n", json_buffer);
   
        len = gbk2utf8(&pout, json_buffer, strlen(json_buffer));
        printf("out_buf=%s\n", pout);
        free(pout);
    }
    else
    {
        fprintf(stderr, "recv errr %s\r\n", strerror(errno));
    }
    close(socketfd);
}

获取位置接口的IP地址的方法:
打开cmd,ping 接口域名,从返回信息就可以看到接口的IP地址,也就是connect连接要用到的地址
在这里插入图片描述

获取到的原始数据应该是gbk编码的,所以在PC上显示是乱码。
在这里插入图片描述
需要做一个编码转换:

 len = gbk2utf8(&pout, json_buffer, strlen(json_buffer));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欲盖弥彰1314

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值