server代码
#include<stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "string.h"
#include "stdlib.h"
#include "unistd.h"
#define IP "169.254.151.41"
#define PORT 8084
int main()
{
int list_fb=0,Data_fb=0,ret=0,len=0;
char buf[512]={0};
struct sockaddr_in list_buf,Data_buf;
//建立监听套接字
list_fb=socket(AF_INET,SOCK_STREAM,0);
//绑定IP地址和端口号
list_buf.sin_family=AF_INET;
list_buf.sin_port=htons(PORT);
list_buf.sin_addr.s_addr=inet_addr(IP);
ret=bind(list_fb,(struct sockaddr *)&list_buf,sizeof(list_buf));
if(ret == -1)
{
perror("bind");
return -1;
}
printf("绑定成功!\n");
//开始监听
ret=listen(list_fb,2);
if(ret == -1)
{
perror("listen");
return -1;
}
printf("监听成功!\n");
//等待链接
len=sizeof(Data_buf);
Data_fb = accept(list_fb,(struct sockaddr *)&Data_buf,&len);
printf("与%s链接成功!\n",inet_ntoa(Data_buf.sin_addr));
while(1)
{
//接受数据
memset(buf,0,512);
recv(Data_fb,buf,512,0);
printf("收到的数据>>%s\n",buf);
//发送
memset(buf,0,512);
printf("要发送的数据>>\n");
fgets(buf,512,stdin);
send(Data_fb,buf,strlen(buf),0);
}
close(Data_fb);
close(list_fb);
}
client代码
#include<stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "string.h"
#include "stdlib.h"
#include "unistd.h"
#define IP "169.254.151.40"
#define PORT 8083
int main()
{
int list_fb=0,Data_fb=0,ret=0,len=0;
char buf[512]={0};
struct sockaddr_in MY_buf,Data_buf;
len=sizeof(Data_buf);
//建立监听套接字
Data_fb=socket(AF_INET,SOCK_STREAM,0);
//绑定IP地址和端口号
Data_buf.sin_family=AF_INET;
Data_buf.sin_port=htons(PORT);
Data_buf.sin_addr.s_addr=inet_addr(IP);
//建立链接
ret=connect(Data_fb,(struct sockaddr *)&Data_buf,len);
if(ret == -1)
{
perror("connect");
return -2;
}
printf("链接成功!\n");
while(1)
{
//发送
memset(buf,0,512);
printf("要发送的数据>>\n");
fgets(buf,512,stdin);
//send(Data_fb,buf,strlen(buf),0);
write(Data_fb,buf,strlen(buf));
//接受数据
memset(buf,0,512);
//recv(Data_fb,buf,512,0);
read(Data_fb,buf,512);
printf("收到的数据>>%s\n",buf);
}
close(Data_fb);
}
因为是第一次使用tcp,遇到的问题有点多
第一,没有eth0,只有ens33,主要是因为目前的主流网卡为使用以太网络协定所开发出来的以太网卡 (Ethernet),因此我们 Linux 就称呼这种网络接口为 ethN (N 为数字)。 举例来说,主机上面有一张以太网卡,因此主机的网络接口就是 eth0 (第一张为 0 号开始)。新的 CentOS 7 开始对于网卡的编号有另一套规则,网卡的界面代号与网卡的来源有关,网卡名称会是这样分类的:
eno1 :代表由主板 BIOS 内置的网卡
ens1 :代表由主板 BIOS 内置的 PCI-E 界面的网卡
enp2s0 :代表 PCI-E 界面的独立网卡,可能有多个插孔,因此会有 s0, s1… 的编号~
eth0 :如果上述的名称都不适用,就回到原本的默认网卡编号
所以会有ens33这种网卡表现形式。
但我发现好像问题不是很大,可以按以下链接去改名:
https://blog.csdn.net/weixin_42516922/article/details/118896611
第二,没有ip地址
首先输入
ifconfig eth0 192.168.52.134
,
点击enter键,输入ifconfig
,点击enter键,可查看IP地址。此命令可以顺便解决ens33的名字。
但此方法每次重启之后都需要输入一次IP地址,以下是永久的:
切换到/etc/network文件夹,找到interfaces文件。命令如下:
cd /etc/network //切换文件目录
vi interfaces//使用vi命令打开文件
2.2 文打开后,敲击键盘的“i“或”o”,文件进入插入状态
此时可对文件进行编辑,配置完成后按Esc键退出插入状态,后使用 :wq 命令保存并退出
2.3 配置完成后使用以下命令进行重启即可
/etc/init.d/networking restart //重启服务
第三、bind:Address already in use
用远程登陆软件时,可能会把操作窗口关闭,不支持Ctrl+C快捷键。此时可以执行如下命令:
lsof –i
然后删除进程,释放端口
kill -9 1326
即可再次使用。
第四、在使用我的工业派和电脑tcp通信时,误把板子中的IP地址设置的与电脑网口的地址一样,导致链接老是失败。
2.网络调试助手配置
3.网络通信的流程
①对方的IP地址
②应用程序的端口号
③数据传输协议(UDP)
④使用socket收发数据