记录一下Linux 网络通信编程示例,主要用内网穿透和网络调试助手进行调试。
1、源文件:
#include <stdlib.h>
#include <sys/types.h>
#include <stdio.h>
#include <netinet/in.h>
#incldue <string.h> //bzero
#include <arpa/inet.h> //inet_addr
#define MSG printf
int main()
{
int recbytes;
int sin_size;
char buffer[1024] = {0};
struct sockaddr_in s_add,c_add;
MSG("INFO: socket thread...\r\n");
sock_id = socket(AF_INET,SOCK_STREAM,0);
if(-1 == sock_id){
MSG("INFO: socket fail !\r\n");
return -1;
}
MSG("INFO: socket success !\r\n");
bzero(&s_add,sizeof(struct sockaddr_in));
s_add.sin_family = AF_INET;
s_add.sin_addr.s_addr = inet_addr("94.191.70.63");
//上述IP地址是我的服务器IP,可以用花生壳,NAT123等内网穿透软件
s_add.sin_port = htons(18677);
//设置的服务器端口
//connect to serv with block mode
if(-1 == connect(sock_id,(struct sockaddr*)(&s_add),sizeof(struct sockaddr)))
{
MSG("INFO: connect to serv fail !\r\n");
return -1;
}
MSG("INFO: connect to serv success \r\n");
while (1) {
if(-1 != (recbytes = read(sock_id,buffer,1024))){
buffer[recbytes] = '\0';
MSG("INFO:Rx serv data:%s\r\n",buffer);
memset(buffer,0,1024);
}
if(fgets( buffer, 1024, stdin ) != NULL){
write( sock_id, buffer, strlen(buffer));
}
}
}
2、编译运行
gcc socket_linux.c -o main
服务器接收和发送:
linux发送和接收:
3、内网穿透是怎么一回事?
linux编写的socket网络通信程序需要访问IP和端口,这个IP和端口一定是公网、外网,不是局域网的192.168.1.X这种,因此在调试网络通信代码,测试数据发送时需要有公网IP作为服务器,接收我们程序发起的连接。
简单来说有两种方式构建服务器,1:购买阿里云、腾讯云、华为云等服务器,自己开服务,开端口和防火墙设置,并运行相应服务器代码,接收开发的socket连接并执行相应响应。2:内网穿透,不用搭建服务器,自己电脑安装一个内网穿透软件,由该软件提供一个外部公网IP,然后自己电脑再创建一个服务器,用普通的网络调试软件即可。
内网穿透怎么配置:首先在电脑打开网络调试助手,创建一个服务器,设置服务器端口为PORT1;接着打开内网穿透软件,创建一个公网服务(具有公网网址和公网端口PORT2),并绑定电脑的IP地址(用ADDR1表示,可以上网的地址)和PORT1端口;然后将内网穿透软件的外网服务网址找出来,转换成IP地址(用ADDR2表示);最后在程序中用ADDR2和PORT2这个IP和端口来对接,所有收发数据都可以传输到电脑的网络调试助手中。