Linux平台下基于TCP/IP协议的C++网络编程初步

原博文地址:http://blog.csdn.net/nuptboyzhb/article/details/7998066


Linux平台下基于TCP/IP协议的C++网络编程初步
实验平台:Ubuntu(Linux)
开发工具:Eclipse+CDT

作者:@郑海波  http://blog.csdn.net/nuptboyzhb/
特点:
1.基于Linux平台的网络编程,最重要的特点是要调用Linux的API函数。这是与windows平台最大的不同。
2.我们将发送的消息封装成结构体,增添了其传递消息的复杂性。

3.我们用的是socket编程,没有用ACE网络编程。
服务器:
[c++ code]


 

[cpp]  view plain copy
  1. /* 
  2.  * MyMain.cpp 
  3.  * 
  4.  *  Created on: 2012-9-19 
  5.  *      Author: zhb 
  6.  */  
  7. #include <stdio.h>  
  8. #include <stdlib.h>  
  9. #include <errno.h>  
  10. #include <string.h>  
  11. #include <sys/types.h>  
  12. #include <netinet/in.h>  
  13. #include <sys/socket.h>  
  14. #include <sys/wait.h>  
  15. #include <arpa/inet.h>  
  16. #include <unistd.h>  
  17. #define SERVPORT 3333  
  18. #define BACKLOG 10  
  19. #define MAXSIZE 1024  
  20. /* 
  21.  *自定义信息 
  22.  */  
  23. typedef struct MyMessage{  
  24.     int ID;  
  25.     char info[256];  
  26. }MyMessage,*pMyMessage;  
  27. int main() {  
  28.     int sockfd, client_fd;  
  29.     struct sockaddr_in my_addr;  
  30.     struct sockaddr_in remote_addr;  
  31.     //创建套接字  
  32.     if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {  
  33.         perror("socket create failed!");  
  34.         exit(1);  
  35.     }  
  36.     //绑定端口地址  
  37.     my_addr.sin_family = AF_INET;  
  38.     my_addr.sin_port = htons(SERVPORT);  
  39.     my_addr.sin_addr.s_addr = INADDR_ANY;  
  40.     bzero(&(my_addr.sin_zero), 8);  
  41.     if (bind(sockfd, (struct sockaddr*) &my_addr, sizeof(struct sockaddr))== -1) {  
  42.         perror("bind error!");  
  43.         exit(1);  
  44.     }  
  45.     //监听端口  
  46.     if (listen(sockfd, BACKLOG) == -1) {  
  47.         perror("listen error");  
  48.         exit(1);  
  49.     }  
  50.   
  51.     while (1) {  
  52.         //int sin_size = sizeof(struct sockaddr_in);  
  53.         socklen_t sin_size = sizeof(struct sockaddr_in);  
  54.         if ((client_fd = accept(sockfd,(struct sockaddr*) &remote_addr,&sin_size)) == -1){  
  55.             perror("accept error!");  
  56.             continue;  
  57.         }  
  58.         printf("Received a connection from %s\n", (char*)inet_ntoa(remote_addr.sin_addr));  
  59.   
  60.         //子进程段  
  61.         if (!fork()){  
  62.             //接受client发送的请示信息  
  63.             int rval;  
  64.             char buf[MAXSIZE];  
  65.             if ((rval = read(client_fd, buf, MAXSIZE)) < 0) {  
  66.                 perror("reading stream error!");  
  67.                 continue;  
  68.             }  
  69.             printf("%s\n", buf);  
  70.             //向client发送信息  
  71.             //char* msg = "Hello,Mr hqlong, you are connected!\n";  
  72.             MyMessage data;  
  73.             memset((void *)&data,0,sizeof(MyMessage));  
  74.             data.ID=123;  
  75.             strcpy(data.info,"This message come from ServSocket!");  
  76.             if(send(client_fd,(void*)&data,sizeof(MyMessage),0) == -1){  
  77.                 perror("send error!");  
  78.             }  
  79.             close(client_fd);  
  80.             exit(0);  
  81.         }  
  82.         close(client_fd);  
  83.     }  
  84.     return 0;  
  85. }  


客户端:
[c++ code]

[cpp]  view plain copy
  1. /* 
  2.  * MyMainClient.cpp 
  3.  * 
  4.  *  Created on: 2012-9-19 
  5.  *      Author: zhb 
  6.  */  
  7. #include <stdio.h>  
  8. #include <stdlib.h>  
  9. #include <errno.h>  
  10. #include <string.h>  
  11. #include <sys/types.h>  
  12. #include <netinet/in.h>  
  13. #include <sys/socket.h>  
  14. #include <sys/wait.h>  
  15. #include <arpa/inet.h>  
  16. #include <unistd.h>  
  17. #define SERVPORT 3333  
  18. #define MAXDATASIZE 100  
  19. #define SERVER_IP "127.0.0.1"  
  20. #define DATA  "this is a client message"  
  21. /* 
  22.  *自定义信息 
  23.  */  
  24. typedef struct MyMessage{  
  25.     int ID;  
  26.     char info[256];  
  27. }MyMessage,*pMyMessage;  
  28. int main(int argc, char* argv[]) {  
  29.     int sockfd, recvbytes;  
  30.     //char buf[MAXDATASIZE];  
  31.     MyMessage recvData;  
  32.     struct sockaddr_in serv_addr;  
  33.   
  34.     if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {  
  35.         perror("socket error!");  
  36.         exit(1);  
  37.     }  
  38.     bzero(&serv_addr, sizeof(serv_addr));  
  39.     serv_addr.sin_family = AF_INET;  
  40.     serv_addr.sin_port = htons(SERVPORT);  
  41.     serv_addr.sin_addr.s_addr = inet_addr(SERVER_IP);  
  42.   
  43.     if (connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(struct sockaddr))== -1) {  
  44.         perror("connect error!");  
  45.         exit(1);  
  46.     }  
  47.     write(sockfd, DATA, sizeof(DATA));  
  48.     memset((void *)&recvData,0,sizeof(MyMessage));  
  49.     if ((recvbytes = recv(sockfd, (void *)&recvData,sizeof(MyMessage), 0)) == -1) {  
  50.         perror("recv error!");  
  51.         exit(1);  
  52.     }  
  53.     //buf[recvbytes] = '\0';  
  54.     printf("Received:ID=%d,Info= %s",recvData.ID,recvData.info);  
  55.     close(sockfd);  
  56.     return 0;  
  57. }  


 

不足:服务器没有进行多线程处理!当多个Client接入时,应考虑多线程编程。以后继续深入...

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以按照以下步骤配置Visual Studio(VS)来学习TCP/IP网络编程: 1. 安装Visual Studio:首先,确保你已经在计算机上安装了Visual Studio。你可以从官方网站(https://visualstudio.microsoft.com/)下载并安装最新版本的Visual Studio。 2. 创建新的项目:打开Visual Studio后,选择“创建新项目”选项。在项目模板中,选择适合你的编程语言(如C++、C#等)和平台(如Windows、Linux等)。 3. 配置项目属性:在项目创建后,右键点击项目名称,选择“属性”选项。在属性窗口中,找到“配置属性”和“链接器”选项。在这里,你可以设置包含库文件、头文件路径以及其他必要的编译选项。 4. 添加必要的库文件:根据你所选择的编程语言和平台,添加TCP/IP网络编程所需的库文件。例如,在C++中,你可能需要添加Winsock库文件(如ws2_32.lib)。 5. 编写网络编程代码:使用所选的编程语言编写TCP/IP网络编程代码。你可以参考相关的文档、教程或书籍来学习如何使用套接字(Socket)API、网络协议等进行网络编程。 6. 编译和运行代码:完成代码编写后,点击Visual Studio的“生成”按钮进行代码编译。如果没有错误或警告,你可以运行生成的可执行文件来测试你的网络编程应用程序。 以上是一个基本的配置过程,具体步骤可能会因你的编程语言、平台和具体需求而有所不同。建议你参考相关的网络编程教程和文档,以便更深入地学习和理解TCP/IP网络编程

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值