未编译的

  1. #include <sys/time.h>
  2. #include <signal.h>
  3. #include <stdlib.h>
  4. #include <sys/types.h>
  5. #include <sys/socket.h>
  6. #include <string.h>
  7. #include <netinet/in.h>
  8. #include <arpa/inet.h>
  9. #include <unistd.h>
  10. #include <stdio.h>
  11. #include <errno.h>
  12. #include <netdb.h>
  13. #define VERSION "2.2"
  14. #define TIMEOUT 300
  15. #define max(a,b) (a)>(b)?(a):(b)
  16. #define MAXSIZE 10240
  17. #define HOSTLEN 40
  18. #define CONNECT_NUMBER 5
  19. void usage(char *s);
  20. void transdata(int fd1,int fd2);
  21. void closeallfd();
  22. void makelog(char *buffer,int length);
  23. int testifisvalue(char *str);
  24. int bind2conn(int port1,char *host,int port2);
  25. int bind2bind(int port1,int port2);
  26. int conn2conn(char *host1,int port1,char *host2,int port2);
  27. int create_socket();
  28. int create_serv(int sockfd,int port);
  29. int client_connect(int sockfd,char* server,int port);
  30. extern int errno;
  31. FILE *fp;
  32. main(int argc,char **argv)
  33. {
  34. char **p;
  35. char host1[HOSTLEN],host2[HOSTLEN];
  36. int port1=0,port2=0,method=0;
  37. int length;
  38. char *logfile=NULL;
  39. p=argv;
  40. memset(host1,0,HOSTLEN);
  41. memset(host2,0,HOSTLEN);
  42. while(*p)
  43. {
  44. if(strcmp(*p,"-v")==0)
  45. {
  46. printf("Socket data transport tool.\r\nVersion:%s\r\n",VERSION);
  47. p++;
  48. continue;
  49. }
  50. if(strcmp(*p,"-h1")==0)
  51. {
  52. if(testifisvalue(*(p+1))==1)
  53. {
  54. length=(strlen(*(p+1))>HOSTLEN-1)?HOSTLEN-1:strlen(*(p+1));
  55. strncpy(host1,*(++p),length);
  56. }
  57. p++;
  58. continue;
  59. }
  60. if(strcmp(*p,"-h2")==0)
  61. {
  62. if(testifisvalue(*(p+1))==1)
  63. {
  64. length=(strlen(*(p+1))>HOSTLEN-1)?HOSTLEN-1:strlen(*(p+1));
  65. strncpy(host2,*(++p),length);
  66. }
  67. p++;
  68. continue;
  69. }
  70. if(strcmp(*p,"-p1")==0)
  71. {
  72. if(testifisvalue(*(p+1))==1)
  73. port1=atoi(*(++p));
  74. p++;
  75. continue;
  76. }
  77. if(strcmp(*p,"-p2")==0)
  78. {
  79. if(testifisvalue(*(p+1))==1)
  80. port2=atoi(*(++p));
  81. p++;
  82. continue;
  83. }
  84. if(strcmp(*p,"-m")==0)
  85. {
  86. if(testifisvalue(*(p+1))==1)
  87. method=atoi(*(++p));
  88. p++;
  89. continue;
  90. }
  91. if(strcmp(*p,"-log")==0)
  92. {
  93. if(testifisvalue(*(p+1))==1)
  94. logfile=*(++p);
  95. else
  96. {
  97. printf("[ERROR]:must supply logfile name\r\n");
  98. exit(0);
  99. }
  100. p++;
  101. continue;
  102. }
  103. p++;
  104. }
  105. signal(SIGCLD,SIG_IGN);
  106. signal(SIGINT,&closeallfd);
  107. if(logfile !=NULL)
  108. {
  109. fp=fopen(logfile,"a");
  110. if(fp == NULL )
  111. {
  112. perror("open logfile");
  113. exit(0);
  114. }
  115. }
  116. makelog("######################## start ################\r\n",49);
  117. switch(method)
  118. {
  119. case 0:
  120. usage(argv[0]);
  121. break;
  122. case 1:
  123. if((port1==0) || (port2==0))
  124. {
  125. printf("[ERROR]:must supply PORT1 and PORT2.\r\n");
  126. break;
  127. }
  128. if(strlen(host2)==0)
  129. {
  130. printf("[ERROR]:must supply HOST2.\r\n");
  131. break;
  132. }
  133. bind2conn(port1,host2,port2);
  134. break;
  135. case 2:
  136. if((port1==0) || (port2==0))
  137. {
  138. printf("[ERROR]:must supply PORT1 and PORT2.\r\n");
  139. break;
  140. }
  141. bind2bind(port1,port2);
  142. break;
  143. case 3:
  144. if((port1==0) || (port2==0))
  145. {
  146. printf("[ERROR]:must supply PORT1 and PORT2.\r\n");
  147. break;
  148. }
  149. if(strlen(host1)==0)
  150. {
  151. printf("[ERROR]:must supply HOST1.\r\n");
  152. break;
  153. }
  154. if(strlen(host2)==0)
  155. {
  156. printf("[ERROR]:must supply HOST2.\r\n");
  157. break;
  158. }
  159. conn2conn(host1,port1,host2,port2);
  160. break;
  161. default:
  162. usage(argv[0]);
  163. }
  164. closeallfd();
  165. }
  166. int testifisvalue(char *str)
  167. {
  168. if(str == NULL ) return(0);
  169. if(str[0]=='-') return(0);
  170. return(1);
  171. }
  172. void usage(char *s)
  173. {
  174. printf("Socket data transport tool\r\n");
  175. printf("by bkbll(bkbll@cnhonker.net)\r\n\r\n");
  176. printf("Usage:%s -m method [-h1 host1] -p1 port1 [-h2 host2] -p2 port2 [-v] [-log filename]\r\n",s);
  177. printf(" -v: version\r\n");
  178. printf(" -h1: host1\r\n");
  179. printf(" -h2: host2\r\n");
  180. printf(" -p1: port1\r\n");
  181. printf(" -p2: port2\r\n");
  182. printf(" -log: log the data\r\n");
  183. printf(" -m: the action method for this tool\r\n");
  184. printf(" 1: listen on PORT1 and connect to HOST2:PORT2\r\n");
  185. printf(" 2: listen on PORT1 and PORT2\r\n");
  186. printf(" 3: connect to HOST1:PORT1 and HOST2:PORT2\r\n");
  187. closeallfd();
  188. }
  189. int bind2conn(int port1,char *host,int port2)
  190. {
  191. int sockfd,sockfd1,sockfd2;
  192. struct sockaddr_in remote;
  193. int size;
  194. int pid;
  195. char buffer[1024];
  196. memset(buffer,0,1024);
  197. if((sockfd=create_socket())==0) exit(0);
  198. if(create_serv(sockfd,port1)==0)
  199. {
  200. close(sockfd1);
  201. exit(0);
  202. }
  203. size=sizeof(struct sockaddr);
  204. while(1)
  205. {
  206. printf("waiting for response.........\n");
  207. if((sockfd1=accept(sockfd,(struct sockaddr *)&remote,&size))<0){perror("accept error\n");continue;}
  208. printf("accept a client from %s:%d\n",inet_ntoa(remote.sin_addr),ntohs(remote.sin_port));
  209. if((sockfd2=create_socket())==0)
  210. {
  211. close(sockfd1);
  212. continue;
  213. }
  214. printf("make a connection to %s:%d....",host,port2);
  215. fflush(stdout);
  216. if(client_connect(sockfd2,host,port2)==0)
  217. {
  218. close(sockfd2);
  219. sprintf(buffer,"[SERVER]connection to %s:%d error\r\n",host,port2);
  220. write(sockfd1,buffer,strlen(buffer));
  221. memset(buffer,0,1024);
  222. close(sockfd1);
  223. continue;
  224. }
  225. printf("ok\r\n");
  226. pid=fork();
  227. if(pid==0) transdata(sockfd1,sockfd2);
  228. // sleep(2);
  229. close(sockfd1);
  230. close(sockfd2);
  231. }
  232. }
  233. int bind2bind(int port1,int port2)
  234. {
  235. int fd1,fd2,sockfd1,sockfd2;
  236. struct sockaddr_in client1,client2;
  237. int size1,size2;
  238. int pid;
  239. if((fd1=create_socket())==0) exit(0);
  240. if((fd2=create_socket())==0) exit(0);
  241. printf("binding port %d......",port1);
  242. fflush(stdout);
  243. if(create_serv(fd1,port1)==0)
  244. {
  245. close(fd1);
  246. exit(0);
  247. }
  248. printf("ok\r\n");
  249. printf("binding port %d......",port2);
  250. fflush(stdout);
  251. if(create_serv(fd2,port2)==0)
  252. {
  253. close(fd2);
  254. exit(0);
  255. }
  256. printf("ok\r\n");
  257. size1=size2=sizeof(struct sockaddr);
  258. while(1)
  259. {
  260. printf("waiting for response on port %d.........\n",port1);
  261. if((sockfd1=accept(fd1,(struct sockaddr *)&client1,&size1))<0)
  262. {
  263. perror("accept1 error");
  264. continue;
  265. }
  266. printf("accept a client on port %d from %s,waiting another on port %d....\n",port1,inet_ntoa(client1.sin_addr),port2);
  267. if((sockfd2=accept(fd2,(struct sockaddr *)&client2,&size2))<0)
  268. {
  269. perror("accept2 error");
  270. close(sockfd1);
  271. continue;
  272. }
  273. printf("accept a client on port %d from %s\n",port2,inet_ntoa(client2.sin_addr));
  274. pid=fork();
  275. if(pid==0) transdata(sockfd1,sockfd2);
  276. //sleep(2);
  277. close(sockfd1);
  278. close(sockfd2);
  279. }
  280. }
  281. int conn2conn(char *host1,int port1,char *host2,int port2)
  282. {
  283. int sockfd1,sockfd2;
  284. int pid;
  285. while(1)
  286. {
  287. if((sockfd1=create_socket())==0) exit(0);
  288. if((sockfd2=create_socket())==0) exit(0);
  289. printf("make a connection to %s:%d....",host1,port1);
  290. fflush(stdout);
  291. if(client_connect(sockfd1,host1,port1)==0)
  292. {
  293. close(sockfd1);
  294. close(sockfd2);
  295. break;
  296. }
  297. printf("ok\r\n");
  298. printf("make a connection to %s:%d....",host2,port2);
  299. fflush(stdout);
  300. if(client_connect(sockfd2,host2,port2)==0)
  301. {
  302. close(sockfd1);
  303. close(sockfd2);
  304. break;
  305. }
  306. printf("ok\r\n");
  307. pid=fork();
  308. if(pid==0) transdata(sockfd1,sockfd2);
  309. //sleep(2);
  310. close(sockfd1);
  311. close(sockfd2);
  312. }
  313. }
  314. void transdata(int fd1,int fd2)
  315. {
  316. struct timeval timeset;
  317. fd_set readfd,writefd;
  318. int result,i=0;
  319. char read_in1[MAXSIZE],send_out1[MAXSIZE];
  320. char read_in2[MAXSIZE],send_out2[MAXSIZE];
  321. int read1=0,totalread1=0,send1=0;
  322. int read2=0,totalread2=0,send2=0;
  323. int sendcount1,sendcount2;
  324. int maxfd;
  325. struct sockaddr_in client1,client2;
  326. int structsize1,structsize2;
  327. char host1[20],host2[20];
  328. int port1=0,port2=0;
  329. char tmpbuf1[100],tmpbuf2[100];
  330. memset(host1,0,20);
  331. memset(host2,0,20);
  332. memset(tmpbuf1,0,100);
  333. memset(tmpbuf2,0,100);
  334. if(fp!=NULL)
  335. {
  336. structsize1=sizeof(struct sockaddr);
  337. structsize2=sizeof(struct sockaddr);
  338. if(getpeername(fd1,(struct sockaddr *)&client1,&structsize1)<0)
  339. {
  340. strcpy(host1,"fd1");
  341. }
  342. else
  343. {
  344. printf("got,ip:%s,port:%d\r\n",inet_ntoa(client1.sin_addr),ntohs(client1.sin_port));
  345. strcpy(host1,inet_ntoa(client1.sin_addr));
  346. port1=ntohs(client1.sin_port);
  347. }
  348. if(getpeername(fd2,(struct sockaddr *)&client2,&structsize2)<0)
  349. {
  350. strcpy(host2,"fd2");
  351. }
  352. else
  353. {
  354. printf("got,ip:%s,port:%d\r\n",inet_ntoa(client2.sin_addr),ntohs(client2.sin_port));
  355. strcpy(host2,inet_ntoa(client2.sin_addr));
  356. port2=ntohs(client2.sin_port);
  357. }
  358. sprintf(tmpbuf1,"\r\n########### read from %s:%d ####################\r\n",host1,port1);
  359. sprintf(tmpbuf2,"\r\n########### reply from %s:%d ####################\r\n",host2,port2);
  360. }
  361. maxfd=max(fd1,fd2)+1;
  362. memset(read_in1,0,MAXSIZE);
  363. memset(read_in2,0,MAXSIZE);
  364. memset(send_out1,0,MAXSIZE);
  365. memset(send_out2,0,MAXSIZE);
  366. timeset.tv_sec=TIMEOUT;
  367. timeset.tv_usec=0;
  368. while(1)
  369. {
  370. FD_ZERO(&am -
  371. FD_ZERO(&writefd);
  372. FD_SET(fd1,&readfd);
  373. FD_SET(fd1,&writefd);
  374. FD_SET(fd2,&writefd);
  375. FD_SET(fd2,&readfd);
  376. result=select(maxfd,&readfd,&writefd,NULL,&timeset);
  377. if((result<0) && (errno!=EINTR))
  378. {
  379. perror("select error");
  380. break;
  381. }
  382. else if(result==0)
  383. {
  384. printf("time out\n");
  385. break;
  386. }
  387. if(FD_ISSET(fd1,&readfd))
  388. {
  389. if(totalread1<MAXSIZE)
  390. {
  391. read1=read(fd1,read_in1,MAXSIZE-totalread1);
  392. if(read1==0) break;
  393. if((read1<0) && (errno!=EINTR))
  394. {
  395. perror("read data error");
  396. break;
  397. }
  398. memcpy(send_out1+totalread1,read_in1,read1);
  399. makelog(tmpbuf1,strlen(tmpbuf1));
  400. makelog(read_in1,read1);
  401. totalread1+=read1;
  402. memset(read_in1,0,MAXSIZE);
  403. }
  404. }
  405. if(FD_ISSET(fd2,&writefd))
  406. {
  407. int err=0;
  408. sendcount1=0;
  409. while(totalread1>0)
  410. {
  411. send1=write(fd2,send_out1+sendcount1,totalread1);
  412. if(send1==0)break;
  413. if((send1<0) && (errno!=EINTR))
  414. {
  415. perror("unknow error");
  416. err=1;
  417. break;
  418. }
  419. if((send1<0) && (errno==ENOSPC)) break;
  420. sendcount1+=send1;
  421. totalread1-=send1;
  422. }
  423. if(err==1) break;
  424. if((totalread1>0) && (sendcount1>0))
  425. {
  426. memcpy(send_out1,send_out1+sendcount1,totalread1);
  427. memset(send_out1+totalread1,0,MAXSIZE-totalread1);
  428. }
  429. else
  430. memset(send_out1,0,MAXSIZE);
  431. }
  432. if(FD_ISSET(fd2,&readfd))
  433. {
  434. if(totalread2<MAXSIZE)
  435. {
  436. read2=read(fd2,read_in2,MAXSIZE-totalread2);
  437. if(read2==0)break;
  438. if((read2<0) && (errno!=EINTR))
  439. {
  440. perror("read data error");
  441. break;
  442. }
  443. memcpy(send_out2+totalread2,read_in2,read2);
  444. makelog(tmpbuf2,strlen(tmpbuf2));
  445. makelog(read_in2,read2);
  446. totalread2+=read2;
  447. memset(read_in2,0,MAXSIZE);
  448. }
  449. }
  450. if(FD_ISSET(fd1,&writefd))
  451. {
  452. int err2=0;
  453. sendcount2=0;
  454. while(totalread2>0)
  455. {
  456. send2=write(fd1,send_out2+sendcount2,totalread2);
  457. if(send2==0)break;
  458. if((send2<0) && (errno!=EINTR))
  459. {
  460. perror("unknow error");
  461. err2=1;
  462. break;
  463. }
  464. if((send2<0) && (errno==ENOSPC)) break;
  465. sendcount2+=send2;
  466. totalread2-=send2;
  467. }
  468. if(err2==1) break;
  469. if((totalread2>0) && (sendcount2 > 0))
  470. {
  471. memcpy(send_out2,send_out2+sendcount2,totalread2);
  472. memset(send_out2+totalread2,0,MAXSIZE-totalread2);
  473. }
  474. else
  475. memset(send_out2,0,MAXSIZE);
  476. }
  477. }
  478. close(fd1);
  479. close(fd2);
  480. printf("ok,I closed the two fd\r\n");
  481. exit(0);
  482. }
  483. void closeallfd()
  484. {
  485. int i;
  486. printf("Let me exit...");
  487. fflush(stdout);
  488. for(i=3;i<256;i++)
  489. {
  490. close(i);
  491. }
  492. if(fp != NULL)
  493. {
  494. fprintf(fp,"exited\r\n");
  495. fclose(fp);
  496. }
  497. printf("all overd\r\n");
  498. exit(0);
  499. }
  500. void makelog(char *buffer,int length)
  501. {
  502. if(fp !=NULL)
  503. {
  504. //fprintf(fp,"%s",buffer);
  505. write(fileno(fp),buffer,length);
  506. fflush(fp);
  507. }
  508. }
  509. int create_socket()
  510. {
  511. int sockfd;
  512. sockfd=socket(AF_INET,SOCK_STREAM,0);
  513. if(sockfd<0)
  514. {
  515. perror("create socket error");
  516. return(0);
  517. }
  518. return(sockfd);
  519. }
  520. int create_serv(int sockfd,int port)
  521. {
  522. struct sockaddr_in srvaddr;
  523. int on=1;
  524. bzero(&srvaddr,sizeof(struct sockaddr));
  525. srvaddr.sin_port=htons(port);
  526. srvaddr.sin_family=AF_INET;
  527. srvaddr.sin_addr.s_addr=htonl(INADDR_ANY);
  528. setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)); //so I can rebind the port
  529. if(bind(sockfd,(struct sockaddr *)&srvaddr,sizeof(struct sockaddr))<0){perror("error");return(0);}
  530. if(listen(sockfd,CONNECT_NUMBER)<0){perror("listen error\n");return(0);}
  531. return(1);
  532. }
  533. int client_connect(int sockfd,char* server,int port)
  534. {
  535. struct sockaddr_in cliaddr;
  536. struct hostent *host;
  537. if(!(host=gethostbyname(server))){printf("gethostbyname(%s) error:%s\n",server,strerror(errno));return(0);}
  538. bzero(&cliaddr,sizeof(struct sockaddr));
  539. cliaddr.sin_family=AF_INET;
  540. cliaddr.sin_port=htons(port);
  541. cliaddr.sin_addr=*((struct in_addr *)host->h_addr);
  542. if(connect(sockfd,(struct sockaddr *)&cliaddr,sizeof(struct sockaddr))<0){perror("error");return(0);}
  543. return(1);
  544. }

转载于:https://blog.51cto.com/n3tl04d/428515

linux版的lcx相关推荐

  1. Ubuntu 14.04安装搜狗拼音linux版应该注意的问题

    Ubuntu 14.04终于在万千期盼中来了,我也像其它的linux爱好者一样,删除了旧的12.04,开始体验下一个到来的LTS版本. 我不想安装Ubuntu 麒麟版,我只想原汁原味的Ubuntu,并 ...

  2. 新款Linux版Skype迎来首次更新:提升稳定性,UX微调

    7月25日消息,此前IT之家曾报道过微软为Linux系统用户推出了新款Skype应用,不到两周后的今天Linux版Skype迎来首次更新,带来一系列新的提升,包括提升长时间聊天的稳定性,允许用户应用内 ...

  3. 华为linux笔记本开售,华为 MateBook D Linux 版明天开售 一种价格两种版本

    [CNMO 新闻]在 11 月 25 日举办的华为新品发布会上,华为为我们带来了全新的笔记本电脑产品--华为 MateBook D 15 和华为 MateBook D 14.该系列笔记本电脑分为 Wi ...

  4. linux下运行gnuplot,Gnuplot Linux版下载

    Gnuplot Linux版是款可以在Linux系统上运行的绘图软件.它可以根据用户输入的命令行精准的绘制出各种图形,操作简单,非常实用,有喜欢的用户不要错过了. [主要功能] 1.坐标: xyz轴的 ...

  5. dpkg安装软件流程_ubuntu安装搜狗输入法linux版

    搜狗输入法Linux版主页:https://pinyin.sogou.com/linux/?r=pinyin 当然,我们不能这么容易的从下载链接直接下,我们要做的是复制下载链接地址 http://cd ...

  6. debian 开发版 移植_迅雷X Linux版(Debian系通用)

    近年来,随着美帝的不断打压,对我们的科技发展造成了很大的冲击,华为甚至因此不能制造芯片了,所以国产替代的概念就快速兴起,Linux作为排在Windows.MacOS之后的第三大操作系统,因为它开源.免 ...

  7. linux 下的图片处理软件下载,美图秀秀Linux版

    美图秀秀linux版是一款图片处理软件,可以帮助用户对图片进行美化处理,支持批量处理图片,能够方便用户直接在Linux系统上修改图像,有需要可以下载. 美图秀秀linux版是一款图片处理软件,可以帮助 ...

  8. MySQL第3天:MySQL的架构介绍之linux版安装

    MySQL的架构介绍之linux版安装 #编写时间:2017.3.5 #编写地点:广州 mysql linux版安装 1.源码安装(本节不提) 2.rpm安装 (1)下载地址:https://dev. ...

  9. 深度linux腾讯视频,在UOS/Deepin 20/Ubuntu 18.04下安装腾讯视频Linux版的方法

    要想在UOS.Deepin 20.Ubuntu 18.04操作系统下安装腾讯视频Linux版,必须先去下载Tenvideo_universal_1.0.10_amd64.deb包,然后使用dpkg命令 ...

最新文章

  1. 谷歌I/O大会3月对开发者开放
  2. MySQL调优(七):滴滴一面二面题,服务器参数设置,redolog两阶段提交
  3. 神经网络optimizer的发展历史整理
  4. DotNetty 实现 Modbus TCP 系列 (一) 报文类
  5. Java 内部类 和 匿名内部类
  6. spark学习-62-Spark:Yarn-cluster和Yarn-client区别与联系
  7. UI实用素材|统计界面模板
  8. 【图像融合】基于小波变换的图像融合
  9. Spark 集群安装
  10. Android真武剑之PopupWindow之三国杀
  11. 一个asp.net聊天是源码
  12. 主席树入门+博客推荐
  13. html5接收表单,HTML5表单的新功能
  14. popwindow的显示层面
  15. 点云配准1-ICP算法 原理代码实现
  16. 北京理工大学计算机面试题,北京理工大学自主招生面试试题综合素质答案技巧.doc...
  17. HTML与CSS学习
  18. 符号表工具addr2line
  19. android11 源码内置第三方输入法并默认选择
  20. GEE|.updateMask()用法示例

热门文章

  1. 在IIS(64位)上部署WCF服务访问Oracle数据库
  2. BroadcastReceiver 接收系统短信广播
  3. Docker 容器技术 — Dockerfile
  4. OpenStack Skyline 现代化的管理界面
  5. EdgeGallery — MEP — 系统架构
  6. Linux Kernel TCP/IP Stack — L2 Layer — Traffic Control(流量控制)的基本操作
  7. Executor框架的详解(转载)
  8. QT笔记:数据库总结(三)之SQL模型类-QSqlTableModel模型
  9. 明年就翻身系列:AMD 2017统治PC、服务器市场?
  10. python迭代器和生成器(3元运算,列表生成式,生成器表达式,生成器函数)