准备工作
- wsl 或者 有linux 系统(购买阿里云或者其他云服务器)
- cmake, gcc, git 等一些必要的软件安装
环境
windows 下 的 wsl
wsl 安装下载
例子
拿 Unix网络编程 举例, 作者对原生接口进行了封装, 我们需要编译使用在自己的工程
1. 创建空文件
cd E:\github\test
2. 拉下unpbook的代码
git clone https://github.com/unpbook/unpv13e.git
3. 用vscode 打开此文件
vscode 必要的配置
如果是vscode连自己服务器, 需要生成ssh密钥, 公钥复制到服务器, vscode通过ssh连接到服务器
生成ssh密钥
vscode 通过ssh连接服务器
4. 根据README, 找到需要的库
命令/目录 | 解析 |
---|---|
./configure | 安装的第一步, 对即将安装的软件进行配置,检查当前的环境是否满足要安装软件的依赖关系 |
lib | 这个目录是基础库, 所有程序都要用 |
libfree | 基础库的附加库 |
libroute | 不是linux系统的话, 其他系统需要的库 |
问题:
直接./configure, 发现报错, 因为git clone 到windows, 把文件结尾设置为CRLF格式, 这里也可以对git进行设置Git中的core.autocrlf选项, windows回车是/r/n, wsl环境是linux, 需要把文件结尾设置为LF格式
用dos2unix解决跨操作系统换行符问题
安装dos2unix 不同系统安装dos2unix的命令
yum -y install dos2unix
find . -type f -exec dos2unix {} \;
继续进行./configure
配置成功, 新生成了3个文件
5. 设置自己工程
把目录lib, 新生成的config.h移到自己的工程
创建空文件 CMakeLists.txt 和 main.cpp
6. 编写CMakeLists.txt
cmake_minimum_required(VERSION 3.15)
project(TestNet C CXX) # C 和 CXX 可以都不写, 但不能只写其中一个, 写一个就限制只能用C或者CXX编译
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -std=c++11")
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/../)
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/../lib)
AUX_SOURCE_DIRECTORY(.. SOURCE)
AUX_SOURCE_DIRECTORY(../lib UDPSOURCE)
ADD_LIBRARY(unp_lib STATIC ${UDPSOURCE})
add_executable(TestNet ${SOURCE})
target_link_libraries(TestNet unp_lib)
编写 main.cpp
socket 连接服务端, 获得服务端时间, 对 /intro/daytimetcpcli.c 做一些改动
#include <iostream>
extern "C" {
#include "unp.h"
}
int main(int argc, char **argv)
{
int sockfd, n, npend;
char recvline[MAXLINE + 1];
socklen_t len;
struct sockaddr_storage ss;
if (argc != 3)
err_quit("usage: a.out <hostname or IPaddress> <service or port#>");
sockfd = Tcp_connect(argv[1], argv[2]);
len = sizeof(ss);
Getpeername(sockfd, (SA *)&ss, &len);
printf("connected to %s\n", Sock_ntop_host((SA *)&ss, len));
for ( ; ; ) {
if ( (n = Recv(sockfd, recvline, MAXLINE, MSG_PEEK)) == 0)
break; /* server closed connection */
Ioctl(sockfd, FIONREAD, &npend); /* check FIONREAD support */
printf("%d bytes from PEEK, %d bytes pending\n", n, npend);
n = Read(sockfd, recvline, MAXLINE);
recvline[n] = 0; /* null terminate */
Fputs(recvline, stdout);
}
std::cout << "Hello world" << std::endl;
return 0;
}
重启vscode
选择CMakeLists.txt 所在的位置
选择gcc 版本
构建
出现cmake 报这个错误, 可以通过下载老版本的cmake, 或者下载libarchive, 操作完成后重启vscode
cmake: symbol lookup error: cmake: undefined symbol: archive_write_add_filter_zstd 两种解决方法
点击build按钮, 构建完成
现在运行TestNet, 会报错, 因为没有开启服务端
本地开启服务端
vscode wsl 打开 e:/github/unpv13e
构建静态库 libunp.a
cd ./lib
make
cd ../intro
make
生成 服务端 执行文件
运行daytimetcpsrc,他开通的是13号端口
测试
运行自己工程生成的TestNet, 返回本机时间, 则成功