开启手机流量
我无法使用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);
}