SFTP客户端代码示例
参考链接:SFTP客户端代码示例
操作系统:Windows7/8,VS2013
环境:libssh2 1.4.3、zlib-1.2.8、openssl-1.0.1g
原文:
“从http://www.libssh2.org/下载libssh2-1.4.3.tar.gz文件,解压后打开libssh2.dsw文件升级项目到VisualStudio 2013,里面有两个项目,只要编译libssh2项目就可以了。编译前需要添加zlib和openssl的头文件和库文件链接位置,如果编译libssh2提示找不到msvcrt.lib,为链接库添加下面的路径
C:\Program Files (x86)\Microsoft VisualStudio 12.0\VC\lib
提示找不到ws2_32.lib或odbc32.lib,添加下面的链接路径
C:\Program Files (x86)\MicrosoftSDKs\Windows\v7.1A\Lib
编译通过后文件输出到\libssh2-1.4.3\win32\Release_lib路径下”
更新:
http://www.libssh2.org/网址访问不通,故换个方式下载了libssh2-1.4.3.tar.gz文件,下载地址:百度网盘(密码:2hwo)
libssh2.dsw文件位置:\libssh2-1.4.3\libssh2-1.4.3\win32
zlib的头文件是zlib.h,库文件是:zlib.lib
openssl的头文件是:opensslconf.h,库文件是:libeay32.lib,ssleay32.lib
zlib的头文件(zlib.h)位置:\libssh2-1.4.3\zte\zlib-1.2.5,库文件(zlib.lib)位置:\libssh2-1.4.3\zte\openssl-1.0.0b staticlib\Debug
openssl头文件(opensslconf.h)位置:\libssh2-1.4.3\zte\openssl-1.0.1l\include\openssl,库文件(libeay32.lib,ssleay32.lib)位置:\libssh2-1.4.3\zte\openssl-1.0.0b staticlib\Debug
分两个步骤:
1.先编译输出libssh2.lib
(1)配置好zlib和openssl的头文件和库文件链接位置后,编译libssh2项目即可,这时可以把tests项目卸载,反正用不到嘛;
编译成功后,输出libssh2.lib到\libssh2-1.4.3\win32\Release_lib路径下,(ps:我这里生成的是libssh2d.lib,我把文件名改为libssh2.lib后可以正常使用)
2.执行客户端,进行下载图片;
新建个项目,把下文三个文件拷贝到项目中,配置libssh2.h,libssh2.lib链接位置后,即可执行成功;
注意:路径及文件名不能含有中文,否则会报错;
下面是SFTP客户端示例代码:
三个文件的下载地址:百度网盘(密码:1qhf)
main.cpp
1 #include "SFTP_Libssh2.h" 2 #include <iostream> 3 4 int main(int argc, char* argv[]) 5 { 6 //下面的代码只要在进程初始化的时候执行 7 kagula::network::SFTP_Init(); 8 9 //测试SFTP链接 10 kagula::network::SFTP_Libssh2* client = kagula::network::SFTP_Libssh2::Inst(); 11 std::string ip = "192.168.19.130"; 12 uint16_t port = 22; 13 std::string usr = "kagula"; 14 std::string pwd = "123456"; 15 if (false == client->IsAbilityConn(ip, port, usr, pwd)) 16 { 17 std::cout << client->strLastError << std::endl; 18 return -1; 19 } 20 21 //测试文件上传,d:\\temp\\a.html 22 if (0 != client->upload(ip, 22, usr, pwd, "d:\\temp\\a.html", "/home/kagula/a.html")) 23 { 24 std::cout << "Error:" << client->strLastError << std::endl; 25 } else 26 { 27 std::cout << client->strLastError << std::endl; 28 } 29 30 31 //测试文件下载 32 if (0 != client->download(ip, 22, usr, pwd, "/home/kagula/a.html","d:\\temp\\b.html" )) 33 { 34 std::cout << "Error:" << client->strLastError << std::endl; 35 } 36 else 37 { 38 std::cout << client->strLastError << std::endl; 39 } 40 41 //进程准备结束,释放资源的时候,运行下面的代码 42 kagula::network::SFTP_Exit(); 43 return 0; 44 }
SFTP_Libssh2.h
1 #pragma once 2 3 #include <string> 4 #include <atomic> 5 6 /* 7 功能:SFTP协议的文件传输功能 8 最后更新日期:2014-5-17 9 简介:借助Libssh2库很容易实现sftp,ssh2客户端,这里给出 10 如何实现Sftp客户端的代码 11 测试环境:Windows 8.1 64bit、Visual Studio 2013 Professional SP1 12 OpenSSL 1.0.1g、zlib-1.2.8、libssh2 1.4.3 13 Win32控制台项目 14 注意:动态链接需要把“libssh2.dll”文件复制到当前项目路径下 15 说明:原来的代码支持多线程,从应用程序抽出来的时候简化了, 16 你可以修改代码使它同时支持上传或下载多个文件。 17 建议:[1]第三方库直接下载源代码自己编译免得库由于编译器版本的 18 不同或设置的不同链接的时候一大堆麻烦。 19 [2]读懂代码根据项目需求作相应修改 20 补充阅读资料: 21 《使用libssh2库实现支持密码参数的ssh2客户端》 22 http://blog.chinaunix.net/uid-24382173-id-229823.html 23 */ 24 namespace kagula { 25 namespace network { 26 int SFTP_Init(); 27 void SFTP_Exit(); 28 29 class SFTP_BKCall 30 { 31 public: 32 /* progress返回值范围[0.0,1.0] */ 33 virtual void OnProgress(float progress) = 0; 34 }; 35 36 class SFTP_Libssh2 37 { 38 public: 39 static SFTP_Libssh2* Inst() 40 { 41 static SFTP_Libssh2 inst; 42 43 return &inst; 44 } 45 46 /* 47 入口参数使用说明 48 ip: 就填一个IP地址就好了,例如“127.0.0.1”。 49 port: 端口,SFTP服务器默认端口为22。 50 username: 51 password: 52 sftppath: 远程路径“/”开头 ,例如“/a.jpg” 53 localpath: 本地路径,例如“d:\\temp\\test.jpg” 54 strLastError: 错误信息 55 出口参数 56 返回不等于零,代表失败! 57 */ 58 int upload(std::string ip, unsigned short port, std::string username, 59 std::string password, std::string localpath, std::string remotepath); 60 int download(std::string ip, unsigned short port, std::string username, 61 std::string password, std::string sftppath, std::string localpath); 62 63 //测试SFTP服务器是否可以链接 64 bool IsAbilityConn(std::string ip, unsigned short port, std::string username, 65 std::string password); 66 67 //设置回掉函数 68 void SetBKCall(SFTP_BKCall *bkCall) { m_bkCall = bkCall; } 69 70 //存放最近的错误信息 71 std::string strLastError; 72 73 //用于停止当前上传或下载线程 74 void stop() { m_isBreak.store(true); } 75 private: 76 SFTP_Libssh2() :m_bkCall(NULL) { m_isBreak.store(false); };//防止直接初始化 77 SFTP_Libssh2(const SFTP_Libssh2&); //防止拷贝复制 78 SFTP_Libssh2& operator=(const SFTP_Libssh2&); //防止分配(运算符函数的调用) 79 80 SFTP_BKCall *m_bkCall; 81 std::atomic_bool m_isBreak; //带读写保护的bool值 82 }; 83 } 84 }
SFTP_Libssh2.cpp
1 //SFTP_Libssh2.cpp文件清单 2 #include "SFTP_Libssh2.h" 3 4 #include <libssh2.h> 5 #include <libssh2_sftp.h> 6 7 #ifdef HAVE_WINSOCK2_H 8 #include <winsock2.h> 9 #endif 10 #ifdef HAVE_SYS_SOCKET_H 11 #include <sys/socket.h> 12 #endif 13 #ifdef HAVE_NETINET_IN_H 14 #include <netinet/in.h> 15 #endif 16 #ifdef HAVE_UNISTD_H 17 #include <unistd.h> 18 #endif 19 #ifdef HAVE_ARPA_INET_H 20 #include <arpa/inet.h> 21 #endif 22 #ifdef HAVE_SYS_TIME_H 23 #include <sys/time.h> 24 #endif 25 26 #include <sys/types.h> 27 #include <fcntl.h> 28 #include <errno.h> 29 #include <stdio.h> 30 #include <ctype.h> 31 32 #include <sstream> 33 #include <iomanip> 34 35 #pragma comment(lib, "ws2_32.lib") 36 37 #pragma comment(lib, "libeay32.lib") 38 #pragma comment(lib, "libssh2.lib") 39 40 namespace kagula { 41 namespace network 42 { 43 //初始化进程的时候调用 44 //如果非0表示初始化失败! 45 int SFTP_Init() 46 { 47 WSADATA wsadata; 48 int rc = WSAStartup(MAKEWORD(2, 0), &wsadata); 49 if (rc != 0) { 50 return rc; 51 } 52 53 rc = libssh2_init(0); 54 55 return rc; 56 } 57 58 //进程结束的时候调用 59 void SFTP_Exit() 60 { 61 libssh2_exit(); 62 63 WSACleanup(); 64 } 65 66 bool SFTP_Libssh2::IsAbilityConn(std::string ip, unsigned short port, std::string username, 67 std::string password) 68 { 69 unsigned long hostaddr; 70 struct sockaddr_in sin; 71 const char *fingerprint; 72 LIBSSH2_SESSION *session; 73 int rc; 74 bool bR = false; 75 FILE *local; 76 LIBSSH2_SFTP *sftp_session; 77 LIBSSH2_SFTP_HANDLE *sftp_handle; 78 79 hostaddr = inet_addr(ip.c_str());//hostaddr = htonl(0x7F000001); 80 81 82 //新建连接 83 int sock = socket(AF_INET, SOCK_STREAM, 0); 84 85 sin.sin_family = AF_INET; 86 sin.sin_port = htons(port); 87 sin.sin_addr.s_addr = hostaddr; 88 if (connect(sock, (struct sockaddr*)(&sin), 89 sizeof(struct sockaddr_in)) != 0) { 90 std::ostringstream ostr; 91 ostr << "[" << __FILE__ << "][" << __LINE__ << "]failed to connect" << ip << "!" << std::endl; 92 strLastError = ostr.str(); 93 94 return bR; 95 } 96 97 //新建对话实例 98 session = libssh2_session_init(); 99 if (!session) 100 { 101 closesocket(sock); 102 return bR; 103 } 104 105 //设置调用阻塞 106 libssh2_session_set_blocking(session, 1); 107 108 //进行握手 109 rc = libssh2_session_handshake(session, sock); 110 if (rc) { 111 std::ostringstream ostr; 112 ostr << "[" << __FILE__ << "][" << __LINE__ << "]Failure establishing SSH session: " << rc << std::endl; 113 strLastError = ostr.str(); 114 115 libssh2_session_free(session); closesocket(sock); 116 return bR; 117 } 118 119 //检查主机指纹 120 std::ostringstream ostr; 121 fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1); 122 ostr << "Fingerprint: "; 123 for (int i = 0; i < 20; i++) { 124 unsigned char c = fingerprint[i]; 125 int nT = c; 126 ostr << std::hex << std::setw(2) << std::setfill('0') << nT; 127 } 128 strLastError = ostr.str(); 129 130 //通过密码验证登陆用户身份 131 if (libssh2_userauth_password(session, username.c_str(), password.c_str())) { 132 std::ostringstream ostr; 133 ostr << "[" << __FILE__ << "][" << __LINE__ << "]Authentication by password failed." << std::endl; 134 strLastError = ostr.str(); 135 goto shutdown; 136 } 137 138 sftp_session = libssh2_sftp_init(session); 139 140 if (!sftp_session) { 141 std::ostringstream ostr; 142 ostr << "[" << __FILE__ << "][" << __LINE__ << "]Unable to init SFTP session " << std::endl; 143 strLastError = ostr.str(); 144 145 goto shutdown; 146 } 147 148 bR = true; 149 150 151 libssh2_sftp_shutdown(sftp_session); 152 153 shutdown: 154 libssh2_session_disconnect(session, 155 "Normal Shutdown, Thank you for playing"); 156 libssh2_session_free(session); 157 closesocket(sock); 158 return bR; 159 } 160 161 /* 162 源码参考地址 163 http://www.libssh2.org/examples/sftp_write.html 164 */ 165 int SFTP_Libssh2::upload(std::string ip, unsigned short port, std::string username, std::string password, 166 std::string localpath, std::string remotepath) 167 { 168 if (ip.length()<1 || username.length()<1 || password.length()<1 || localpath.length()<1 || remotepath.length()<1) 169 { 170 return -1; 171 } 172 173 int nR = 0; 174 unsigned long hostaddr; 175 struct sockaddr_in sin; 176 const char *fingerprint; 177 LIBSSH2_SESSION *session; 178 int rc = -1; 179 FILE *local = NULL; 180 LIBSSH2_SFTP *sftp_session; 181 LIBSSH2_SFTP_HANDLE *sftp_handle; 182 183 hostaddr = inet_addr(ip.c_str());//hostaddr = htonl(0x7F000001); 184 185 if (fopen_s(&local, localpath.c_str(), "rb") != 0) { 186 std::ostringstream ostr; 187 ostr << "[" << __FILE__ << "][" << __LINE__ << "]Can't open local file " << localpath << std::endl; 188 strLastError = ostr.str(); 189 190 return -2; 191 } 192 193 //取待上传文件整个size. 194 fseek(local, 0, SEEK_END); 195 size_t filesize = ftell(local);//local file大小,在readFromDisk中被引用 196 fseek(local, 0, SEEK_SET);//文件指针重置到文件头 197 198 //新建连接 199 int sock = socket(AF_INET, SOCK_STREAM, 0); 200 201 sin.sin_family = AF_INET; 202 sin.sin_port = htons(port); 203 sin.sin_addr.s_addr = hostaddr; 204 if (connect(sock, (struct sockaddr*)(&sin), 205 sizeof(struct sockaddr_in)) != 0) { 206 std::ostringstream ostr; 207 ostr << "[" << __FILE__ << "][" << __LINE__ << "] failed to connect " << ip << std::endl; 208 strLastError = ostr.str(); 209 210 fclose(local); 211 return -3; 212 } 213 214 215 //创建会话实例 216 session = libssh2_session_init(); 217 if (!session) 218 { 219 fclose(local); closesocket(sock); 220 return -4; 221 } 222 223 //阻塞方式调用libssh2 224 libssh2_session_set_blocking(session, 1); 225 226 //进行握手 227 rc = libssh2_session_handshake(session, sock); 228 if (rc) { 229 std::ostringstream ostr; 230 ostr << "[" << __FILE__ << "][" << __LINE__ << "] Failure establishing SSH session:" << rc << std::endl; 231 strLastError = ostr.str(); 232 233 fclose(local); libssh2_session_free(session); closesocket(sock); 234 return -5; 235 } 236 237 //获取主机指纹 238 std::ostringstream ostr; 239 fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1); 240 ostr << "Fingerprint: "; 241 for (int i = 0; i < 20; i++) { 242 unsigned char c = fingerprint[i]; 243 int nT = c;//这样转是为了防止符号位扩展 244 ostr << std::hex << std::setw(2) << std::setfill('0') << nT; 245 } 246 strLastError = ostr.str(); 247 248 //通过密码验证 249 if (libssh2_userauth_password(session, username.c_str(), password.c_str())) { 250 std::ostringstream ostr; 251 ostr << "[" << __FILE__ << "][" << __LINE__ << "] Authentication by password failed [" 252 << username << "][" << password << "]" << rc << std::endl; 253 strLastError = ostr.str(); 254 255 goto shutdown; 256 } 257 258 sftp_session = libssh2_sftp_init(session); 259 260 if (!sftp_session) { 261 std::ostringstream ostr; 262 ostr << "[" << __FILE__ << "][" << __LINE__ << "] Unable to init SFTP session" << std::endl; 263 strLastError = ostr.str(); 264 265 goto shutdown; 266 } 267 268 //向SFTP服务器发出新建文件请求 269 sftp_handle = 270 libssh2_sftp_open(sftp_session, remotepath.c_str(), 271 LIBSSH2_FXF_WRITE | LIBSSH2_FXF_CREAT | LIBSSH2_FXF_TRUNC, 272 LIBSSH2_SFTP_S_IRUSR | LIBSSH2_SFTP_S_IWUSR | 273 LIBSSH2_SFTP_S_IRGRP | LIBSSH2_SFTP_S_IROTH); 274 275 if (!sftp_handle) { 276 std::ostringstream ostr; 277 ostr << "[" << __FILE__ << "][" << __LINE__ << "] Unable to open file with SFTP. ip=" 278 << ip <<"] remotepath=[" << remotepath << "]" << std::endl; 279 strLastError = ostr.str(); 280 281 nR = -1; 282 283 goto shutdown; 284 } 285 286 287 char mem[1024 * 16]; 288 size_t nread; 289 char *ptr; 290 size_t count = 0; 291 292 do { 293 nread = fread(mem, 1, sizeof(mem), local); 294 if (nread <= 0) { 295 //到达文件尾部 296 break; 297 } 298 ptr = mem; 299 do { 300 // 向服务器写数据,直到数据写完毕 301 rc = libssh2_sftp_write(sftp_handle, ptr, nread); 302 if (rc < 0) 303 break; 304 ptr += rc; count += nread; 305 nread -= rc; 306 307 //如果设置了回调,进行回调 308 if (m_bkCall) 309 { 310 float p = count / (float)filesize; 311 m_bkCall->OnProgress(p); 312 } 313 //callback.end 314 } while (nread); 315 316 if ( m_isBreak.load() == true ) 317 { 318 std::ostringstream ostr; 319 ostr << "[" << __FILE__ << "][" << __LINE__ << "] 上传文件任务被用户break!" << std::endl; 320 strLastError = ostr.str(); 321 322 nR = -6; 323 break; 324 } 325 } while (rc > 0); 326 327 libssh2_sftp_close(sftp_handle); 328 libssh2_sftp_shutdown(sftp_session); 329 330 shutdown: 331 libssh2_session_disconnect(session, 332 "Normal Shutdown, Thank you for playing"); 333 libssh2_session_free(session); 334 335 closesocket(sock); 336 337 fclose(local); 338 339 return nR;//返回“0”表示成功 340 } 341 342 /* 343 源码参考地址 344 http://www.oschina.net/code/snippet_12_10717 345 */ 346 int SFTP_Libssh2::download(std::string ip, unsigned short port, std::string username, std::string password, 347 std::string sftppath, std::string localpath) 348 { 349 unsigned long hostaddr; 350 int sock, i, auth_pw = 0; 351 struct sockaddr_in sin; 352 const char *fingerprint; 353 char *userauthlist; 354 LIBSSH2_SESSION *session; 355 int rc; 356 LIBSSH2_SFTP *sftp_session; 357 LIBSSH2_SFTP_HANDLE *sftp_handle; 358 359 hostaddr = inet_addr(ip.c_str()); //hostaddr = htonl(0x7F000001); 360 361 /* 362 * The application code is responsible for creating the socket 363 * and establishing the connection 364 */ 365 sock = socket(AF_INET, SOCK_STREAM, 0); 366 367 sin.sin_family = AF_INET; 368 sin.sin_port = htons(port); 369 sin.sin_addr.s_addr = hostaddr; 370 if (connect(sock, (struct sockaddr*)(&sin), 371 sizeof(struct sockaddr_in)) != 0) { 372 std::ostringstream ostr; 373 ostr << "[" << __FILE__ << "][" << __LINE__ << "] 连接失败!" << std::endl; 374 strLastError = ostr.str(); 375 return -1; 376 } 377 378 /* Create a session instance 379 */ 380 session = libssh2_session_init(); 381 382 if (!session) 383 return -1; 384 385 /* Since we have set non-blocking, tell libssh2 we are blocking */ 386 libssh2_session_set_blocking(session, 1); 387 388 389 /* ... start it up. This will trade welcome banners, exchange keys, 390 * and setup crypto, compression, and MAC layers 391 */ 392 rc = libssh2_session_handshake(session, sock); 393 394 if (rc) { 395 std::ostringstream ostr; 396 ostr << "[" << __FILE__ << "][" << __LINE__ << "] 建立SSH会话失败" << rc << std::endl; 397 strLastError = ostr.str(); 398 399 return -1; 400 } 401 402 /* At this point we havn't yet authenticated. The first thing to do 403 * is check the hostkey's fingerprint against our known hosts Your app 404 * may have it hard coded, may go to a file, may present it to the 405 * user, that's your call 406 */ 407 fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1); 408 409 std::ostringstream ostr; 410 fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1); 411 ostr << "Fingerprint: "; 412 for (int i = 0; i < 20; i++) { 413 unsigned char c = fingerprint[i]; 414 int nT = c; 415 ostr << std::hex << std::setw(2) << std::setfill('0') << nT; 416 } 417 strLastError = ostr.str(); 418 419 /* check what authentication methods are available */ 420 userauthlist = libssh2_userauth_list(session, username.c_str(), username.length()); 421 if (strstr(userauthlist, "password") == NULL) 422 { 423 std::ostringstream ostr; 424 ostr << "[" << __FILE__ << "][" << __LINE__ << "] 服务器不支持输入password方式验证!" << std::endl; 425 strLastError = ostr.str(); 426 goto shutdown; 427 } 428 429 /* We could authenticate via password */ 430 if (libssh2_userauth_password(session, username.c_str(), password.c_str())) { 431 432 std::ostringstream ostr; 433 ostr << "[" << __FILE__ << "][" << __LINE__ << "] 密码错误!" << std::endl; 434 strLastError = ostr.str(); 435 goto shutdown; 436 } 437 438 sftp_session = libssh2_sftp_init(session); 439 if (!sftp_session) { 440 std::ostringstream ostr; 441 ostr << "[" << __FILE__ << "][" << __LINE__ << "] 初始化FTL对话失败!" << std::endl; 442 strLastError = ostr.str(); 443 goto shutdown; 444 } 445 446 /* Request a file via SFTP */ 447 sftp_handle = 448 libssh2_sftp_open(sftp_session, sftppath.c_str(), LIBSSH2_FXF_READ, 0); 449 450 451 if (!sftp_handle) { 452 std::ostringstream ostr; 453 ostr << "[" << __FILE__ << "][" << __LINE__ << "] 打开文件失败! " << libssh2_sftp_last_error(sftp_session) << std::endl; 454 strLastError = ostr.str(); 455 456 goto shutdown; 457 } 458 459 FILE *stream; 460 if (fopen_s(&stream, localpath.c_str(), "wb") == 0) 461 { 462 do { 463 char mem[1024]; 464 465 /* loop until we fail */ 466 rc = libssh2_sftp_read(sftp_handle, mem, sizeof(mem)); 467 468 if (rc > 0) { 469 //从内存到磁盘 470 fwrite(mem, 1, rc, stream); 471 } 472 else { 473 break; 474 } 475 } while (1); 476 477 fclose(stream); 478 } 479 else { 480 std::ostringstream ostr; 481 ostr << "[" << __FILE__ << "][" << __LINE__ << "] 新建本地文件失败 " << localpath << std::endl; 482 strLastError = ostr.str(); 483 } 484 485 libssh2_sftp_close(sftp_handle); 486 487 libssh2_sftp_shutdown(sftp_session); 488 489 shutdown: 490 491 libssh2_session_disconnect(session, "Normal Shutdown, Thank you for playing"); 492 libssh2_session_free(session); 493 494 closesocket(sock);//INVALID_SOCKET 495 496 return 0; 497 } 498 } 499 }
根据上述环境编译成功的libssh2.lib,csdn下载地址:https://download.csdn.net/download/zkfopen/10606098
转载于:https://www.cnblogs.com/zkfopen/p/9482423.html
SFTP客户端代码示例相关推荐
- Kafka JAVA客户端代码示例--高级应用
2019独角兽企业重金招聘Python工程师标准>>> 什么时间使用高级应用? 针对一个消息读取多次 在一个process中,仅仅处理一个topic中的一组partitions 使用 ...
- 【Java 网络编程】TCP 服务器端 客户端 简单示例
文章目录 I IntelliJ IDEA 创建 Java 项目 II 客户端 Socket 创建 III Socket 客户端连接服务器端 IV Socket 两个端点信息获取 V 控制台人机交互 V ...
- mqtt linux 编译,MQTT客户端代码X64位Ubuntu环境编译+测试实践小结
https://cloud.baidu.com/doc/IOT/IoTdownload.html#.E4.B8.8B.E8.BD.BDMQTT.E7.9B.B8.E5.85.B3 下载MQTT相关: ...
- 完整mes代码(含客户端和server端_Ice简介+Qt代码示例
一.ICE是什么? ICE是ZEROC的开源通讯协议产品,它的全称是:The Internet Communications Engine,翻译为中文是互联网通讯引擎,是一个面向对象的中间件,它封装并 ...
- HDFS的API调用,创建Maven工程,创建一个非Maven工程,HDFS客户端操作数据代码示例,文件方式操作和流式操作
1. HDFS的java操作 hdfs在生产应用中主要是客户端的开发,其核心步骤是从hdfs提供的api中构造一个HDFS的访问客户端对象,然后通过该客户端对象操作(增删改查)HDFS上的文件 1.1 ...
- c#a服务器上传文件b服务器,C#_c#批量上传图片到服务器示例分享,客户端代码:
复制代码 代码 - phpStudy...
c#批量上传图片到服务器示例分享 客户端代码: /// /// 批量上传图片 /// /// 服务器路径 /// 图片文件夹路径 /// 图片名称 public void UpLoadFile(str ...
- 猿创征文|工具百宝箱-代码编辑器-版本控制工具-终端神器-项目与事务跟踪工具-SFTP客户端
工具没有绝对意义上的好坏之分,只有需求适合与否,这些需求可能包括:功能.价格.安全.服务.技术等诸多方面. 技术在更新迭代,开发者工具也在更新迭代.一个高效趁手的工具在工作上锦上添花.给大家推荐一下我 ...
- Linux时间校准(ntpdate及NTP客户端代码校准示例)
背景 机器每次机启后时间就会出现异常,因为机器无法访问外网,只能访问局域网的ntp服务,所以需要保证局域网内部有ntp服务,如何安装ntp服务,参考Ubuntu20.04 Ntp服务安装及验证. 网络 ...
- Windows下TCP编程——服务器客户端代码以及爬虫示例
1 TCP服务器和客户端代码 前面的TCP详解已经详细的介绍了TCP服务器和客户端的工作流程,接下来就直接上代码: server.cpp #include <stdio.h> #inclu ...
最新文章
- 深度学习之单目深度估计:无监督学习篇
- 【错误记录】jar 执行错误 ( java.lang.UnsupportedClassVersionError: Unsupported major.minor version 52.0 )
- session对象不创建会有吗_相亲对象突然不联系了,你知道原因吗?
- 当我给小姐姐讲述为何黑客要挟制路由器DNS 该怎样实时发觉和防备的方法后,小姐姐那崇拜的眼神令我无法忘却
- 图片显示时加水印(不改变原图片)
- 高大上的介绍实时流式计算!
- mysql数据优化--数据库结构的优化
- Marketing Cloud的notification的OData实现
- HDOJ 1394 Minimum Inversion Number(线段树求逆序数对)
- php pdo oci8,PHP516 用phpize增加扩展PDO_OCI和OCI8
- 安装matlab 2016a win10 64bit系统
- 第一章 SQL命令 ALTER TABLE(一)
- 批量网刻安装操作系统之PXE网络克隆图文教程
- python dlib caffe人脸相似度_人脸检测学习笔记(数据集-DLIB人脸检测原理-DLIBOpenCV人脸检测方法及对比)...
- 元旦贺卡html,元旦贺卡祝福语
- 双系统时间不一致解决方案
- 三步为你的 Mac 设置黑客帝国矩阵屏保
- html5页面 学生作品,最完整长页面H5制作教程来啦!
- SDI相机实时采集处理DSP系统 目标跟踪
- WIN10设置自启动脚本
热门文章
- 一屋不扫,何以扫天下=====记JAVA基础之解惑篇
- html loader使用方法,webpack中loader的使用方法,以及几个常用loader的应用小实例
- 飞豹游乐设备:投资儿童游乐园的必备“武器”
- 操作系统的进程调度算法
- 2020.9.28京东云测试开发一面面经(电话面)
- Hadoop-Maven打包项目<artifactId>maven-assembly-plugin</artifactId>标红报错
- 如何使社交产品更快发展
- 联发科MT6755/P10平台技术开发资料集锦(datasheet,参考设计,PCB,原理图,MMD,GPIO)
- APP开发,如何选择靠谱的外包公司?
- Java程序员必备英文,你确定不看看?