其他分享
首页 > 其他分享> > 树莓派和荔枝派,局域网socket 通信

树莓派和荔枝派,局域网socket 通信

作者:互联网

在虚拟机上面实现了socket 之间的通信之后,突发奇想,想要实现树莓派和 荔枝派zero之间的通信。

1.直接将虚拟机下面的程序复制过来,重新编译并且运行。发现是没有办法进行通信的。客户端一直报错:connect error: Connection refused 在网上查找了很多文档之后,也没有发现问题的所在。

2..在经历过各种魔改之后,终于发现了问题的所在,就是IP地址的问题。开始时,IP是 INADDR_ANY ,后来改成inet_addr();就报错bind error: Cannot assign requested address 。在网上查看之后,发现这个错误的缘由是IP地址不能随意填写。需要使服务器端的主机IP地址,然后改成服务器端的主机IP地址之后,就能够正常通信了。

 

#include <arpa/inet.h>
#include <unistd.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <pthread.h>

#define SERVER_PORT 9527

void *server_handle(void *argc)
{
    int con_fd =*((int*)argc);
    ssize_t len;
    char buf[100];
    while(1)
    {
        len  = read(con_fd,buf,100);
        if(len <0)
        {
            perror("read error");
            exit(1);
        }
        else if(len ==0)
        {
           break;
        }
        len = write(con_fd,buf,len);
        if(len <0)
        {
            perror("write error");
            exit(1);
        }
    }
    close(con_fd);
    pthread_exit(NULL);
}
int main(void)
{
    int sock_fd,acc_fd;
    int ret;
    socklen_t sock_len;
    pthread_t thread_id;
    struct sockaddr_in bind_addr, acc_addr;
    sock_fd =socket(AF_INET,SOCK_STREAM,0);
    if(sock_fd <0)
    {
        perror("socket error");
        exit(1);
    }

    bind_addr.sin_port =htons(SERVER_PORT);
    bind_addr.sin_family = AF_INET;
    bind_addr.sin_addr.s_addr = inet_addr("192.168.2.102");
    ret = bind(sock_fd,(struct sockaddr*)&bind_addr,sizeof(bind_addr));
    if(ret <0)
    {
        perror("bind error");
        exit(1);
    }
    ret = listen(sock_fd,20);
    if(ret < 0)
    {
        perror("listen error");
        exit(1);
    }
    while(1)
    {
        acc_fd = accept(sock_fd,(struct sockaddr *)&acc_addr,&sock_len);
        if(acc_fd < 0)
        {
            perror("accpet error");
            exit(1);
        }
        pthread_create(&thread_id,NULL,server_handle,(void *)&acc_fd);
        pthread_detach(thread_id);
    }
    close(sock_fd);
    return 0;
}
#include <arpa/inet.h>
#include <unistd.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <pthread.h>

#define SERVER_PORT 9527

void *server_handle(void *argc)
{
    int con_fd =*((int*)argc);
    ssize_t len;
    char buf[100];
    while(1)
    {
        len  = read(con_fd,buf,100);
        if(len <0)
        {
            perror("read error");
            exit(1);
        }
        else if(len ==0)
        {
           break;
        }
        len = write(con_fd,buf,len);
        if(len <0)
        {
            perror("write error");
            exit(1);
        }
    }
    close(con_fd);
    pthread_exit(NULL);
}
int main(void)
{
    int sock_fd,acc_fd;
    int ret;
    socklen_t sock_len;
    pthread_t thread_id;
    struct sockaddr_in bind_addr, acc_addr;
    sock_fd =socket(AF_INET,SOCK_STREAM,0);
    if(sock_fd <0)
    {
        perror("socket error");
        exit(1);
    }

    bind_addr.sin_port =htons(SERVER_PORT);
    bind_addr.sin_family = AF_INET;
    bind_addr.sin_addr.s_addr = inet_addr("192.168.2.102");
    ret = bind(sock_fd,(struct sockaddr*)&bind_addr,sizeof(bind_addr));
    if(ret <0)
    {
        perror("bind error");
        exit(1);
    }
    ret = listen(sock_fd,20);
    if(ret < 0)
    {
        perror("listen error");
        exit(1);
    }
    while(1)
    {
        acc_fd = accept(sock_fd,(struct sockaddr *)&acc_addr,&sock_len);
        if(acc_fd < 0)
        {
            perror("accpet error");
            exit(1);
        }
        pthread_create(&thread_id,NULL,server_handle,(void *)&acc_fd);
        pthread_detach(thread_id);
    }
    close(sock_fd);
    return 0;
}

 

标签:树莓,argc,socket,void,len,局域网,IP地址,100,include
来源: https://www.cnblogs.com/Spin-jump/p/15801313.html