记录一下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 printfint 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 modeif(-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和端口来对接,所有收发数据都可以传输到电脑的网络调试助手中。