【SylixOS之ipv6收发测试代码】

1、设备ipv6地址通过ifconfig查看

2、SylixOS自带ping6命令测试ipv6网络通断状态

注意:需要使用-I选项指定收发端口

3、ipv6的tcp收发测试代码

注意:client端需要使用SO_BINDTODEVICE指定数据收发端口

server:

#include <sylixOS.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>

#define MAXBUF 1024
#define LOCALPORT 8888

int main(int argc, char **argv)
{
    int                   i;
    int                   sockfd, new_fd;
    socklen_t             len;
    struct sockaddr_in6   my_addr, their_addr;
    char buf[MAXBUF + 1];


    if ((sockfd = socket(PF_INET6, SOCK_STREAM, 0)) == -1) {
        perror("socket");
        exit(1);
    } else {
        printf("socket created\n");
    }
    bzero(&my_addr, sizeof(my_addr));
    my_addr.sin6_family         = AF_INET6;
    my_addr.sin6_port           = htons(LOCALPORT);
    my_addr.sin6_addr           = in6addr_any;

    if (bind(sockfd, (struct sockaddr *) &my_addr, sizeof(struct sockaddr_in6)) == -1) {
        perror("bind");
        exit(1);
    } else {
        printf("binded\n");
    }

    if (listen(sockfd, 10) == -1) {
        perror("listen");
        exit(1);
    } else {
        printf("begin listen\n");
    }

    len = sizeof(struct sockaddr);
    if ((new_fd = accept(sockfd, (struct sockaddr *) &their_addr, &len)) == -1) {
        perror("accept");
        exit(errno);
    }

    i = 0;
    while (1) {
        bzero(buf, sizeof(buf));
        len = recv(new_fd, buf, MAXBUF, 0);
        if (len <= 0) {
            perror("recv");
            exit(-1);
        }
        printf("recv:%d\n", i++);

        len = send(new_fd, buf, MAXBUF, 0);
        if (len <= 0) {
            perror("send");
            exit(-1);
        }
    }

    close(sockfd);
    return 0;
}

client:

#include <sylixOS.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <net/if.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>


#define MAXBUF 1024

#define REMOTEPORT 8888
//#define REMOTEIP "::1"
//#define REMOTEIP "fe80::204:9fff:fea0:45"
//#define REMOTEIP "fe80::20c:29ff:fe31:674c"
//#define REMOTEIP "fe80::2e0:cff:fe07:9b8a"
#define REMOTEIP "fe80::204:9fff:fea0:45"

int main(int argc, char **argv)
{
    int                  sockfd, len, i;
    struct sockaddr_in6  dest;
    char                 buffer[MAXBUF];
    char                 recvBuf[MAXBUF + 1];
    struct ifreq         ifreq;

    if ((sockfd = socket(AF_INET6, SOCK_STREAM, 0)) < 0) {
        perror("Socket");
        exit(errno);
    }
    printf("socket created\n");

    strlcpy(ifreq.ifr_name, "en2", 16);                                /*  绑定指定的设备              */
    setsockopt(sockfd, SOL_SOCKET, SO_BINDTODEVICE, &ifreq, sizeof(ifreq));

    bzero(&dest, sizeof(dest));
    dest.sin6_family   = AF_INET6;
    dest.sin6_port     = htons(REMOTEPORT);
    inet_pton(AF_INET6, REMOTEIP, &dest.sin6_addr);
    printf("address created\n");

    if (connect(sockfd, (struct sockaddr *)&dest, sizeof(dest)) != 0) {
        perror("Connect ");
        exit(errno);
    }
    printf("server connected\n");


    for (i = 0; i < MAXBUF; i++) {
        buffer[i] = '0' + i % 10;
    }

    i = 0;
    while (1) {
        len = send(sockfd, buffer, MAXBUF, 0);
        if (len < 0) {
            perror("send");
        }

        bzero(recvBuf, sizeof(recvBuf));
        len = recv(sockfd, recvBuf, MAXBUF, 0);
        if (len < 0) {
            perror("send");
        }
        printf("recv %d:", i);
        printf("%s", recvBuf);
        printf("\n");

        sleep(1);
    }

    close(sockfd);
    return 0;
}

4、ipv6的udp收发测试代码

注意:client端需要使用SO_BINDTODEVICE指定数据收发端口

server:

#include <SylixOS.h>
#include <unistd.h>
#include <stdio.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <string.h>

#define LOCALPORT 8888

int main(int argc,char *argv[])
{
    int                    mysocket,len;
    int                    i               = 0;
    struct sockaddr_in6    addr;
    int                    addr_len;
    char                   msg[1024];
    char                   buf[300];

    if ((mysocket = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) {
        perror("error:");
        return(1);
    } else {
        printf("socket created ...\n");
        printf("socket id :%d \n",mysocket);
    }

    addr_len                 = sizeof(struct sockaddr_in6);
    bzero(&addr,sizeof(addr));
    addr.sin6_family         = AF_INET6;
    addr.sin6_port           = htons(LOCALPORT);
    addr.sin6_addr           = in6addr_any;

    if (bind(mysocket, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
        perror("connect");
        return(1);
    } else {
        printf("bink ok .\n");
        printf("local port : %d\n", LOCALPORT);
    }
    i = 0;
    while(1) {
        bzero(msg,sizeof(msg));
        len = recvfrom(mysocket, msg, sizeof(msg), 0, (struct sockaddr *)&addr, (socklen_t*)&addr_len);
        inet_ntop(AF_INET6, &addr.sin6_addr, buf, sizeof(buf));
        printf("%d:message from ip %s\n", i++, buf);
        if (sendto(mysocket, msg, len, 0, (struct sockaddr *)&addr, addr_len) < 0) {
            printf("error");
            return(1);
        }
    }
}

client:

#include <SylixOS.h>
#include <stdio.h>
#include <net/if.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/socket.h>
#include <string.h>


#define REMOTEPORT 8888
//#define REMOTEIP "::1"
//#define REMOTEIP "fe80::204:9fff:fea0:45"
//#define REMOTEIP "fe80::20c:29ff:fe31:674c"
//#define REMOTEIP "fe80::2e0:cff:fe07:9b8a"
#define REMOTEIP "fe80::56b2:3ff:fe09:5fc3"


int main(int argc,char *argv[])
{
    int                    mysocket, len;
    int                    i                = 0;
    struct sockaddr_in6    addr;
    int                    addr_len;
    char                   msg[1024];
    char                   msgr[1024];
    struct ifreq           ifreq;

    if ((mysocket = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) {
        perror("error:");
        return(1);
    } else {
        printf("socket created ...\n");
        printf("socket id :%d \n",mysocket);
        printf("rmote ip : %s\n",REMOTEIP);
        printf("remote port :%d \n",REMOTEPORT);
    }

    strlcpy(ifreq.ifr_name, "en1", 16);                                /*  绑定指定的设备              */
    setsockopt(mysocket, SOL_SOCKET, SO_BINDTODEVICE, &ifreq, sizeof(ifreq));

    addr_len           = sizeof(struct sockaddr_in6);
    bzero(&addr, sizeof(addr));
    addr.sin6_family   = AF_INET6;
    addr.sin6_port     = htons(REMOTEPORT);
    inet_pton(AF_INET6, REMOTEIP, &addr.sin6_addr);


    for (i = 0; i < 1024; i++) {
        msg[i] = '0' + i % 10;
    }

    i = 0;
    while(1) {
        if (sendto(mysocket, msg, sizeof(msg), 0, (struct sockaddr *)&addr, addr_len) < 0) {
            printf("error\n");
            return(1);
        }

        bzero(msgr, sizeof(msgr));
        len = recvfrom(mysocket, msgr, sizeof(msgr), 0, (struct sockaddr *)&addr, (socklen_t*)&addr_len);
        printf("%d: Received message\n", i++);

        sleep(1);
    }
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

stone8761

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

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

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

打赏作者

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

抵扣说明:

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

余额充值