如何在Android手机中使用ipv6地址?

时间:2016-11-07 14:51:30

标签: android sockets ipv6

开启手机流量

adb shell connect with phone

我无法使用IPv6地址与我的服务器建立套接字连接。

当我使用IPv4时,它可以工作!但是当我使用IPv6时,它不起作用。

这是我的客户代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#define PORT 1234
#define MAXDATASIZE 100


int main(int argc,char* argv[])
{
    int socketfd;
    ssize_t send_num,recv_num;
    char send_buf[MAXDATASIZE],recv_buf[MAXDATASIZE],wel[MAXDATASIZE];
    struct sockaddr_in6 server;
    struct hostent* remote_host;

    if(argc!=2)
    {
        printf("Usage:%s <IP address>\n",argv[0]);
        exit(1);
    }

    if((socketfd=socket(AF_INET6,SOCK_STREAM,0))==-1)
    {
        perror("socket() error.");
        exit(1);
    }

    bzero(&server,sizeof(server));
    server.sin6_family=AF_INET6;
    server.sin6_port=htons(PORT);
    if (inet_pton(AF_INET6, argv[1], &server.sin6_addr) < 0 ) {
        perror(argv[1]);
        exit(1) ;
    }

    if((connect(socketfd,(struct sockaddr*)&server,sizeof(server)))==-1)
    {
        perror("connect() error.");
        exit(1);
    }

    if ((recv(socketfd,wel,MAXDATASIZE,0))==-1)
    {
        perror("[!] Receive welcome message fail.");
        exit(1);
    }
    wel[sizeof(wel)-1]='\0';
    printf("%s\n", wel);

    while(1)
    {
        printf("[*] Input string:");
        scanf("%s",&send_buf);
        send_buf[strlen(send_buf)]='\0';

        if((strlen(send_buf))>100)
        {
            printf("[!] Only supports sending fewer than 100 characters.");
            exit(1);
        }

        if((send_num=send(socketfd,send_buf,MAXDATASIZE,0))==-1)
        {
        perror("send() error.");
        exit(1);
        }

        if((recv_num=recv(socketfd,recv_buf,MAXDATASIZE,0))==-1)
        {
            perror("recv() error.");
            exit(1);
        }

        printf("[>] Received reverse string:%s\n",recv_buf);
        if(!strcmp(recv_buf,"tiuq"))
        {
            close(socketfd);
            break;
        }
    }
    close(socketfd);
    return 0;
}

这是我的服务器代码:

if((socketfd=socket(AF_INET6,SOCK_STREAM,0))==-1)
{
    perror("socket() error.");
    exit(1);
}

setsockopt(socketfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));

bzero(&server,sizeof(server));
server.sin6_family=AF_INET6;
server.sin6_port=htons(PORT);
server.sin6_addr=in6addr_any;

if((bindfd=bind(socketfd,(struct sockaddr *)&server,sizeof(server)))==-1)
{
    perror("bind() error.");
    exit(1);
}

if((listenfd=listen(socketfd,MAXNUMCLINET))==-1)
{
    perror("listen() error.");
    exit(1);
}

if((connectfd=accept(socketfd,(struct sockaddr *)&client,&addrlen))==-1)
{
    perror("accept() error.");
    exit(1);
}

image

0 个答案:

没有答案