龙云尧个人博客,转载请注明出处。
CSDN地址:http://blog.csdn.net/Michael753951/article/details/72553287
个人blog地址:http://yaoyl.cn/ubuntu-xia-jin-xing-socket-bian-cheng/
这是第一次进行网络编程,献给Ubuntu了。
由于需要结合OpenGL搭建的虚拟环境进行实验,为了将虚拟环境中的实验参数传送至另一台PC机协同工作。我们选择使用网络编程进行数据通行。本次博客先运行两个demo体会一下利用C++进行Socket编程。
我们在本次实验中将运行两个demo,第一个demo用来进行文件传输,第二个demo用来进行窗口对话。
本次demo采用TCP流,demo代码来自【 Linux网络编程:socket文件传输范例 】。
我们打开codeblocks,建立两个项目(project),新建的时候选择控制台(console)程序。第一个项目命名为“TCP_client”,第二个项目命名为“TCP_server”。然后将博客中的代码拷贝进main.cpp中,ctrl+F9进行编译。
注意,在这里当我们编译到 close(new_server_socket_fd);
的时候,编译器会报错 error: ‘close’ was not declared in this scope
。如下图所示。
我参考CSDN中【‘close’ was not declared in this scope 】添加了unistd.h库头,编译成功。
#include
在TCP_server编译成功之后,我们开始编译TCP_client。同样在将客户端复制下来之后,我们首先添加unistd.h库头,接着我们直接编译。
首先是在编译到if(inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr) == 0)
的时候,编译器报error: ‘inet_pton’ was not declared in this scope
错误如下图所示。
我参考了CSDN中【‘inet_pton’ was not declared in this scope 】添加了arpa/inet.h库头。
#include
再次编译的时候,依然遇到了报错。此时在编译到close(fp);
的时候报错error: invalid conversion from ‘FILE* {aka _IO_FILE*}’ to ‘int’ [-fpermissive]
。如下图所示。
我们发现本行代码中fp为文件指针,在C语言中,文件的打开和关闭应该是调用fopen和fclose,在打开文件部分,作者确实调用了fopen进行打开文件,但是在关闭的时候错用成了close,所以造成本次报错,我们将close换成fclose,就能够编译成功了。
我们在两份项目都能够正确编译执行以后,将开始正式进行实验。
首先关闭当前IDE,因为在codeblocks中,不能在同一个进程中打开两个main函数。我们需要分别进入之前已经建立好的TCP_server项目所在的文件夹和TCP_client项目所在的文件夹,分别代开他们的cbp文件,打开两个codeblocks进程,这样就能够同时打开两个console窗口了。(如果不能同时打开的话,可以刹参考CSDN中【CodeBlocks启动多个进程实例的做法 】的设置方法)
打开后server和client两个界面如图所示。
首先我们在server所在的文件夹中放置一个demo.jpeg文件作为源文件,然后我们可以发现此时client所在的文件夹中没有该文件。接着我们在TCP_client窗口中输入demo.jpeg
。
我们发现执行成功之后,client所在的文件夹中多出来了一个demo.jpeg文件,打开它和server中的demo.jpeg进行对比,发现结果一致。
故而我们认为本次demo运行没问题。
第二份demo参考自【Linux C Socket编程原理及简单实例】。
本次代码能够直接编译运行,不会有报错信息,测试截图如下所示。
本次demo作为Socket编程的入门测试以及环境测试,下一篇博客将对Socket编程进行深入的分析的总结。