linux 下 IPV6 socket 通讯的程序

在执行程序前,要先对两台机器上的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;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值