在执行程序前,要先对两台机器上的ipv6地址进行配置, 否则, 你会发现在一台机器的两个终端间用本机的ipv6可以进行通讯,但到两台机器上就不可以通讯了.
IPV6配置如下:
(1),以超级用户身份执行命令来加载ipv6模组
modprobe ipv6
(2)执行下列两行命令
ifconfig eth1 add 2001:250:1800:1::11/64
route -A inet6 add default gw 2001:250:1800:1::1
或者将这两行命令写入/etc/rc.local,可以保证重启后还有效.
IPV6程序代码如下
1.服务期端程序:
/******************************
*
* server.c
*开发人,船长,执行编译 gcc server.c -o serv -lpthread
*
******************************/
#include<stdio.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<errno.h>
#include<string.h>
#include<netinet/in.h>
#include<sys/wait.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<pthread.h>
#define MAXBUF 1024
#define LISNUM 10
#define DEFULT_PORT 8787
void *connect_to_client(void *data);
struct sockaddr_in6 serv_addr,client_addr;
/**************************/
int main(int argc,char *argv[])
{
int sockfd,new_fd;
unsigned int serv_port;
unsigned int lisnum;
char buf[MAXBUF+1];
//------------------------
printf("the command is %s [port] [listen_num]/n",argv[0]);
//----------port-----------
if(argv[1]!=NULL)
serv_port=atoi(argv[1]);
else
serv_port=DEFULT_PORT;
//-----------lisnum-----------
if(argv[2]!=NULL)
lisnum=atoi(argv[2]);
else
lisnum=LISNUM;
//------------creat socket--------
if((sockfd=socket(AF_INET6,SOCK_STREAM,0))<0){
perror("creat socket");
exit(1);
}
//------------set serveraddr ipv6---------------void connect_to_client(void *data);
bzero(&serv_addr,sizeof(serv_addr));
serv_addr.sin6_family=AF_INET6;
serv_addr.sin6_port=htons(serv_port);
serv_addr.sin6_addr=in6addr_any;
//--------------bind--------------------------
if(bind(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr))<0){
perror("bind");
exit(1);
}
//-------------listen----------------------
if(listen(sockfd,lisnum)<0){
perror("listen");
exit(1);
}
//-------------acceept------------------
while(1){
int len=sizeof(struct sockaddr_in6);
if((new_fd=accept(sockfd,(struct sockaddr *)&client_addr,&len))<0){
perror("accept");
exit(errno);
}
printf("receive the request form %s/n",inet_ntop(AF_INET6,&client_addr,buf,sizeof(buf)));
//---------------------creat the pthread--------------------------------
pthread_t child_thread;
if(pthread_create(&child_thread,NULL,connect_to_client,(void *)new_fd)<0){
perror("create thread");
continue;
}
//-------------------------
}
//close(sockfd);
return(0);
}//end main();
/************************************
*
* 子程序:用于处理一个与客户端的连接,由一个线程来执行
*
************************************/
void *connect_to_client(void *data)
{
int i;
int client_fd=(int)data;
char recv_buf[MAXBUF+1];
char send_buf[MAXBUF+1];
char buf[MAXBUF+1];
while(1){
sprintf(send_buf,">>");
if(send(client_fd,send_buf,strlen(send_buf),0)<0){
perror("send");
continue;//break;
}
//----------receive---------
//bzero(&recv_buf,sizeof(recv_buf));
while(i<MAXBUF-1){
if(recv(client_fd,&recv_buf[i],1,0)<0){
perror("recv");
break;
}
if(recv_buf[i]=='/n')
break;
i++;
}
recv_buf[i]='/0';
i=0;
printf("receive message from '%s':%s/n",inet_ntop(AF_INET6,&client_addr.sin6_addr,buf,sizeof(buf)),recv_buf);
//-----------send------------
}
}//end sub_function
2.客户机端程序:
/***********************************
*
*client.h
*
**********************************/
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<sys/wait.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<resolv.h>
#define MAXSIZE 1024
//**************main()**************
int main(int argc,char *argv[])
{
int sockfd;
int n;
struct sockaddr_in6 serv_addr;
char recv_buf[MAXSIZE+1];
char send_buf[MAXSIZE+1];
struct timeval tv;
fd_set readfd;
//----------------------------------------
if(argc!=3)
{
printf("%s [serv_address][serv_port]/n",argv[0]);
exit(1);
}
//------------------creat socket-----------
if((sockfd=socket(AF_INET6,SOCK_STREAM,0))<0)
{
perror("socket");
exit(1);
}
//------------------set ip address-------------
bzero(&serv_addr,sizeof(serv_addr));
serv_addr.sin6_family=AF_INET6;
serv_addr.sin6_port=htons(atoi(argv[2]));
if(inet_pton(AF_INET6,argv[1],&serv_addr.sin6_addr)<0)
{
perror(argv[1]);
exit(1);
}
//-----------------creat connetc--------------
if(connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr))<0)
{
perror("connect");
exit(1);
}
printf("Connected to server/n");
while(1)
{
//----------set last time---------
tv.tv_sec=600;
tv.tv_usec=0;
//----------
FD_ZERO(&readfd);
FD_SET(0,&readfd);
FD_SET(sockfd,&readfd);
//---------
if(select(sockfd+1,&readfd,NULL,NULL,&tv)<=0)
{
fprintf(stderr,"/n time out/n");
break;
}
//---------
if(FD_ISSET(0,&readfd))
{
if((n=read(0,send_buf,MAXSIZE-1))<=0)
break;
send_buf[n]='/n';
if(send(sockfd,send_buf,n,0)<=0)
{
perror("send");
break;
}
}
if(FD_ISSET(sockfd,&readfd))
{
if((n=recv(sockfd,recv_buf,MAXSIZE-1,0))<=0)
{
fprintf(stderr,"connection closed./n");
exit(1);
}
recv_buf[n]='/0';
printf("recved:%s",recv_buf);
fflush(stdout);
}
}
close(sockfd);
return 0;
}