《网络安全编程底子》之Socket编程

打印 上一主题 下一主题

主题 858|帖子 858|积分 2574

我的代码

server.c

  1. // server.cpp : Defines the entry point for the console application.
  2. //
  3. #include "stdafx.h"
  4. #include <Winsock2.h>
  5. #pragma comment(lib,"ws2_32.lib") //添加静态链接库文件
  6. void main(int argc,char* argv[])
  7. {
  8.     WSADATA wsadata;
  9.     WSAStartup(MAKEWORD(1,1),&wsadata);
  10.     SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0); //socket()
  11.     /***地址结构体***/
  12.     SOCKADDR_IN addrSvr;
  13.     addrSvr.sin_family=AF_INET;
  14.     addrSvr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
  15.     addrSvr.sin_port=htons(6000);
  16.     /**************/
  17.     bind(sockSrv,(SOCKADDR*)&addrSvr, sizeof(SOCKADDR)); //bind()
  18.     listen(sockSrv,5); //listen()
  19.     SOCKADDR_IN addrClient;
  20.     int len= sizeof(SOCKADDR);
  21.     while(1) //加循环是为了应对多个客户端连接此服务器的情况
  22.     {
  23.             SOCKET socksend=accept(sockSrv,(SOCKADDR*)&addrClient,&len); //accept()
  24.                 char sendBuf[50]; //
  25.             sprintf(sendBuf,"你好,我是服务器"); //使用sprintf给字符串赋值、连接字符串比较方便
  26.             send(socksend,sendBuf,strlen(sendBuf)+1,0); //send(),+1是因为字符串以'\0'结尾
  27.             char recvBuf[50];
  28.             recv(socksend,recvBuf,50,0); //recv()
  29.             printf("%s\n",recvBuf);
  30.             closesocket(socksend);
  31.     }
  32.     /*closesocket(sockSrv);
  33.     WSACleanup();*/ //while(1)后的死代码
  34. }
复制代码
client.c

  1. // Client.cpp : Defines the entry point for the console application.
  2. //
  3. #include "stdafx.h"
  4. #include <Winsock2.h>
  5. #pragma comment(lib,"ws2_32.lib") //添加静态链接库文件
  6. void main(int argc,char* argv[])
  7. {
  8.     WSADATA wsadata;
  9.     WSAStartup(MAKEWORD(1,1),&wsadata);
  10.     SOCKET socketClient=socket(AF_INET,SOCK_STREAM,0); //socket()
  11.     /***地址结构体***/
  12.     SOCKADDR_IN addrSvr;
  13.     addrSvr.sin_family=AF_INET;
  14.     addrSvr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
  15.     addrSvr.sin_port=htons(6000);
  16.     /**************/
  17.     connect(socketClient,(SOCKADDR*)&addrSvr,sizeof(SOCKADDR)); //connect()
  18.         char recvBuf[50];
  19.         recv(socketClient,recvBuf,50,0); //recv()
  20.         printf("%s\n",recvBuf);
  21.         send(socketClient,"你好,我是客户端",strlen("你好,我是客户端")+1,0);  //send()
  22.         closesocket(socketClient);
  23.     WSACleanup();
  24. }
复制代码
代码调试过程中出现的问题

问题一:macOS High Sierra下Clion出现CMake Error



办理办法:百度无果,重新打开Clion发现连license都过期了,多半是没救了,只能老诚实实用命令行试试了>_<



问题二:终端下编译server.c提示找不到"winsock2.h"头文件



办理办法:

   Mac下编程用什么替换windows.h头文件?
  

  • 我在mac下编程,想使用清屏指令cls不好使,也不能用windows.h头文件。请各人帮我想想怎么办。还有在mac下能用system" "么?
  • 不可,你不能在除了 Windows 的任何体系上使用 Windows.h。你要明白 API 的概念,windows.h 这个头文件是 Windows 带的,而不是 C 语言自身有的。毕竟上,出了 Windows,没有任何体系——实际上也是在真逼真切用 C 的体系——比方全部在跑类 Unix,好比 OS X、Linux 甚至 FreeBSD 上的,都不能用 Windows 这套 API。这也是为什么坊间都说 OS X 是适合做编程,特别是适合学编程的,因为 OS X 是“体制内”,也就使用和全天下除了 Windows 之外全部的东西都互通的底层架构的,而且它在过去的大部门时候都要比各类 Linux 要轻易上手,所谓的“更优雅”。
  • ……
  在百度知道上看到了这段对话后感觉已经凉了,还好我有windows8.1假造机,这回再也不怕找不到windows头文件了吧!
问题三:windows8.1假造机不兼容VC6.0





办理办法:


  • 右击Visual C++ 6.0快捷方式,选择"属性",在"目标(T):"中检察其可执行文件的地点为:"C:\Program Files (x86)\Microsoft Visual Studio\Common\MSDev98\Bin\MSDEV.EXE",找到MSDEV.EXE;
  • 右键选择"属性",在"通例"选项卡下将MSDEV.EXE更名为MSDEV1.EXE:

  • 在"兼容性"选项卡下勾选"以兼容模式运行这个步伐",将兼容模式选择Windows XP(Service Pack2)",并将权限等级勾选为“以管理员身份运行此步伐”,点击确定

  • 重新运行Visual C++ 6.0,奈斯,已经成功了!

  • 老例子,新建一个Win32控制台工程,并以Hello World方式打开:

     

  • 尽情开始你的演出吧~
问题四:编译error1——在编译VC时候,出现fatal error C1010: unexpected end of file while looking for precompiled head



问题具体解释:

致命错误C1010,在探求预编译指示头文件时,文件未预期竣事。就是没有找到预编译指示信息的问文件。顾名思义就是预编译因为缺少了预编译文件而失败。办理方法显然可以取消预编译,大概资助编译器找到预编译文件。
办理办法:


  • 右键单击项目工程中的cpp文件,在菜单Project-->Settings-->C/C++-->recompile Header,设置为第一项:Not using precompile headers。

  • 在.cpp文件开头添加包罗文件stdafx.h:#include "stdafx.h"
  • 重新编译即可~
问题五:编译error2——地点布局体大小写表示问题



办理办法:

不知道是不是编译情况不同的原因,学校电脑上的地点布局体成员addrSvr.sin_Family到我win8.1假造机上就必须改成addrSvr.sin_family了,满脸黑线= =

问题六:编译error3——sendBuf未定义



办理办法:

自己疏忽原因,在前面加上char sendBuf[50]即可~
至此,编译终于成功通过orz...
 



问题七:烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫

点击运行,弹出Windows防火墙……
 


点击"允许访问"后,额……
 


 


 


??☺???
办理办法:

百度一下,发现又打开了一个新天下的大门:
   问题根源:
  在windows平台下,ms的编译器(也就是vc带的谁人)在 Debug 模式下,会把未初始化的栈内存全部填成 0xcc,用字符串来看就是”烫烫烫烫烫烫烫”,未初始化的堆内存全部填成0xcd,字符串看就是“屯屯屯屯屯屯屯屯”。
  说人话:定义的字符串没有初始化就会出现这样的情况
  办理办法:初始化一下
  

  • char p[] = “0”;
  • ZeroMemory
  • memset
  那么这里是由于先运行client.c再运行server.c导致
  1.         char recvBuf[50];
  2.         recv(socksend,recvBuf,50,0); //recv()
  3. ```中数组`recvBuf`未被初始化的原因,解决方法当然是**先运行server.c再运行client.c**咯,这样客户端就能receive到服务器发来的recvBuf啦~
  4. ##运行结果
  5. - 一个客户端连接一个服务器:
  6.         ![tobLT.png](https://s1.ax1x.com/2017/10/20/tobLT.png)
  7. - 多个客户端同时连接一个服务器:
  8.         ![toOwF.png](https://s1.ax1x.com/2017/10/20/toOwF.png)
  9.        
  10. ##高级版mySocket——实现服务器客户端互发消息尬聊>_<
  11. ###核心伪代码
  12. - server.c:
  13.         ```
  14.         do{
  15.                 gets(sendBuf);
  16.                 send();
  17.                 recv();
  18.                 puts(recvBuf);
  19.         }while(返回值不为-1);
  20.         ```
  21. - client.c:
  22.         ```
  23.         do{
  24.                 recv();
  25.                 puts(recvBuf);
  26.                 gets(sendBuf);
  27.                 send();
  28.         }while(返回值不为-1);
  29.         ```
  30.        
  31. ###完整代码
  32. - server.c:
  33.         ```
  34.         // server.cpp : Defines the entry point for the console application.
  35.         //
  36.         #include "stdafx.h"
  37.         #include <Winsock2.h>
  38.         #include <string.h>
  39.         #pragma comment(lib,"ws2_32.lib") //添加静态链接库文件
  40.         void main(int argc,char* argv[])
  41.         {
  42.             WSADATA wsadata;
  43.             WSAStartup(MAKEWORD(1,1),&wsadata);
  44.        
  45.             SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0); //socket()
  46.             /***地址结构体***/
  47.             SOCKADDR_IN addrSvr;
  48.             addrSvr.sin_family=AF_INET;
  49.             addrSvr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
  50.             addrSvr.sin_port=htons(6000);
  51.             /**************/
  52.             bind(sockSrv,(SOCKADDR*)&addrSvr, sizeof(SOCKADDR)); //bind()
  53.             listen(sockSrv,5); //listen()
  54.             SOCKADDR_IN addrClient;
  55.             int len= sizeof(SOCKADDR);
  56.             while(1)
  57.             {
  58.                     SOCKET socksend=accept(sockSrv,(SOCKADDR*)&addrClient,&len); //accept()
  59.                         char sendBuf[50];
  60.                         char recvBuf[50];
  61.                         int a;
  62.                         do{
  63.                             printf("Me:");
  64.                                 gets(sendBuf);
  65.                                 fflush(stdin);
  66.                             send(socksend,sendBuf,strlen(sendBuf)+1,0); //send(),+1是因为字符串以'\0'结尾
  67.                             a=recv(socksend,recvBuf,50,0); //recv()
  68.                             printf("  Client:%s\n",recvBuf);
  69.                         }while(a!=-1);
  70.                     closesocket(socksend);
  71.             }
  72.                     closesocket(sockSrv);
  73.                     WSACleanup();
  74.         }
  75.         ```
  76. - client.c:
  77.         ```
  78.         // Client.cpp : Defines the entry point for the console application.
  79.         //
  80.        
  81.         #include "stdafx.h"
  82.         #include <Winsock2.h>
  83.         #pragma comment(lib,"ws2_32.lib") //添加静态链接库文件
  84.         void main(int argc,char* argv[])
  85.         {
  86.             WSADATA wsadata;
  87.             WSAStartup(MAKEWORD(1,1),&wsadata);
  88.             SOCKET socketClient=socket(AF_INET,SOCK_STREAM,0); //        socket()
  89.             /***地址结构体***/
  90.             SOCKADDR_IN addrSvr;
  91.             addrSvr.sin_family=AF_INET;
  92.             addrSvr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
  93.             addrSvr.sin_port=htons(6000);
  94.             /**************/
  95.             connect(socketClient,(SOCKADDR*)&addrSvr,sizeof(SOCKADDR));
  96.                 char recvBuf[50];
  97.                 char sendBuf[50];
  98.                 int a;
  99.                 do{
  100.                         a=recv(socketClient,recvBuf,50,0);
  101.                         printf("                Server:%s\n",recvBuf);
  102.                         printf("Me:");
  103.                         gets(sendBuf);
  104.                         fflush(stdin);
  105.                         send(socketClient,sendBuf,strlen(sendBuf)+1,0);
  106.                 }while(a!=1);
  107.                 closesocket(socketClient);
  108.             WSACleanup();
  109.         }
  110.        
  111.         ```
  112. ###运行结果(这不是尬聊是什么hhh)
  113. ![UKuNV.png](https://s1.ax1x.com/2017/10/25/UKuNV.png)
  114. ##参考资料
  115. - [Mac&iOS Socket编程](http://m.blog.csdn.net/bravegogo/article/details/50938454)
  116. - [Mac下编程用什么替换windows.h头文件](https://zhidao.baidu.com/question/369558222732704524.html?fr=ala&word=mac下windows头文件)
  117. - [如何在win8.1下运行VC6.0](https://jingyan.baidu.com/article/2009576198453dcb0721b4a1.html)
  118. - [关于SOCKET编程中“烫烫烫...”的问题](http://m.blog.csdn.net/zhichitianya1234/article/details/76291374)
  119. - [文件写入或控制台输出显示:"烫烫烫烫"问题解决办法](http://m.blog.csdn.net/alex__0805/article/details/47381531)
复制代码
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

尚未崩坏

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表