在虚拟机上面实现了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;
}

树莓派和荔枝派,局域网socket 通信的更多相关文章

  1. c#使用Socket实现局域网内通信

    服务器端代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Da ...

  2. 【.NET 与树莓派】i2c(IIC)通信

    i2c(或IIC)协议使用两根线进行通信(不包括电源正负极),它们分别为: 1.SDA:数据线,IIC 协议允许在单根数据线上进行双向通信--这条线既可以发送数据,也可以接收数据. 2.SCL:时钟线 ...

  3. 简单的Socket通信

    Socket简介 Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求. 服务端步骤: • socket:创建服务器socket ...

  4. 界面编程之QT的Socket通信20180730

    /*******************************************************************************************/ 一.linu ...

  5. Android基于UDP的局域网聊天通信

    代码地址如下:http://www.demodashi.com/demo/12057.html 记得把这几点描述好咯:代码实现过程 + 项目文件结构截图 + 演示效果 1. 开发环境 1.1 开发工具 ...

  6. 利用Socket通信

    网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. 建立网络通信连接至少要一对端口号(socket).socket本质是编程接口(API),对TCP/IP的封装 ...

  7. 我看不下去鸟。。。。Java和C#的socket通信真的简单吗?

    这几天在博客园上看到好几个写Java和C#的socket通信的帖子.但是都为指出其中关键点. C# socket通信组件有很多,在vs 使用nuget搜索socket组件有很多类似的.本人使用的是自己 ...

  8. php简单实现socket通信

    socket通信的原理在这里就不说了,它的用途还是比较广泛的,我们可以使用socket来做一个API接口出来,也可以使用socket来实现两个程序之间的通信,我们来研究一下在php里面如何实现sock ...

  9. Socket通信类

    package com.imooc; import java.io.BufferedReader; import java.io.IOException; import java.io.InputSt ...

随机推荐

  1. epoll 使用详解

    epoll - I/O event notification facility在linux的网络编程中,很长的时间都在使用select来做事件触发.在linux新的内核中,有了一种替换它的机制,就是e ...

  2. [BUUCTF]PWN——0ctf_2017_babyheap

    0ctf_2017_babyheap 附件 步骤: 例行检查,64位程序,保护全开 本地试运行一下,看看大概的情况,经典的堆题的菜单 main函数 add() edit() delete() show ...

  3. 摘要任务工期计算(Project)

    <Project2016 企业项目管理实践>张会斌 董方好 编著 先说一个好消息:摘要工期是可以自动计算的. 比如A1.A2.A3.A4四个任务,工期如下图安排: 而他们的摘要任务,就不再 ...

  4. 第二周Python笔记 数据类型 列表 字典

    列表,拉锁式儿合并. [ [a,b] for a,b in zip(list1,list2)] #最笨的 a=[1,2,3,4,5] b=[2,3,4,5,6] d=[] for i in range ...

  5. .net 程序通过 crontab 无法启动,手动执行脚本可以启动

    一.问题描述 .net 网关程序需要设置定时重启,按照日常操作先把正在运行的 PID kill 掉后,再执行启动服务. 把脚本放到 crontab 计划任务上,可以把服务 PID kill 掉,但无法 ...

  6. IDEA中SpringBoot启动报错Error:(11, 39) java: 找不到符号

    确保不是依赖没有导入或者编码不对问题后 如果还是不行 可以试试以下方式 解决办法 将图片框中Delegate IDE build 勾选 然后重新启动即可

  7. NULL在oracle和mysql索引上的区别

    一.问题 oracle的btree索引不存储NULL值,所以用is null或is not null都不会用到索引范围扫描,但是在mysql中也是这样吗? 二.实验 先看看NULL在oracle(11 ...

  8. 【LeetCode】47. Permutations II 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:递归 方法二:回溯法 日期 题目地址:htt ...

  9. 【剑指Offer】二进制中1的个数 解题报告(Python)

    题目地址:https://www.nowcoder.com/ta/coding-interviews 题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 解题方法 这个题如果使 ...

  10. 【LeetCode】888. Fair Candy Swap 公平的糖果棒交换(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人公众号: 每日算法题 本文关键词:力扣,LeetCode,算法题,算法,Python 目录 题目描述 题目大意 解题方法 代码 刷题心得 关于作 ...