免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2373 | 回复: 2
打印 上一主题 下一主题

C++编写Socket网络程序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-20 12:32 |只看该作者 |倒序浏览
本帖最后由 keehoo 于 2011-12-20 12:33 编辑

//server.cpp 服务器端
  1. #include   <winsock2.h>
  2. #include   <io.h>
  3. #include   <windows.h>
  4. #include   <iostream>
  5. #include   <string>
  6. #pragma   comment(lib, "WS2_32.lib ")
  7. using   namespace   std;

  8. void   OutErr(string   msg)
  9. {
  10. cout << "错误!发生在 " <<msg <<endl;
  11. }

  12. fd_set  fdread;
  13. int  ret;

  14. DWORD  WINAPI  ThreadProc(LPVOID   lpParameter)
  15. {
  16. SOCKET c=(SOCKET)lpParameter;
  17. char   data[80];
  18. UINT   ReciveBytes=0;
  19. FD_ZERO(&fdread);
  20. FD_SET(c,&fdread);
  21. do
  22. {
  23.   if((ret=select(0,&fdread,NULL,NULL,NULL))==SOCKET_ERROR)
  24.   {
  25.    OutErr(string( "select "));
  26.    break;
  27.   }
  28.   
  29.   if(ret> 0)
  30.   {
  31.    if(FD_ISSET(c,&fdread))
  32.    {
  33.     ReciveBytes=recv(c,data,10,0);
  34.     if(ReciveBytes==SOCKET_ERROR)
  35.     {
  36.      break;
  37.     }
  38.     cout << "收到字节数: "
  39.      <<ReciveBytes
  40.      <<endl;
  41.     data[ReciveBytes]= '\0 ';
  42.     cout <<data <<endl;
  43.    }
  44.   }
  45. }while(ReciveBytes> 0);
  46. FD_CLR(c,&fdread);
  47. closesocket(c);
  48. return   0;
  49. }

  50. int   main()
  51. {
  52. SOCKET   server;
  53. SOCKET   client;
  54. SOCKADDR_IN   ser_addr,cli_addr;
  55. WSADATA   wdata;
  56. int   cliaddrLen=0;
  57. UINT   port=4000;
  58. HANDLE       Hnd;
  59. DWORD         dwThreadID;
  60. if(WSAStartup(MAKEWORD(2,0),&wdata)!=0)
  61. {
  62.   OutErr(string( "WSAStartup "));
  63.   return   1;
  64. }

  65. ser_addr.sin_addr.S_un.S_addr=inet_addr( "0.0.0.0 ");
  66. ser_addr.sin_family=AF_INET;
  67. ser_addr.sin_port=htons(port);

  68. //if((server=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_IP,NULL,0,1))==INVALID_SOCKET)
  69. if((server=socket(AF_INET,SOCK_STREAM,IPPROTO_IP))==INVALID_SOCKET)
  70. {
  71.   OutErr(string( "WSASocket "));
  72.   return   1;
  73. }

  74. if(bind(server,(SOCKADDR   *)&ser_addr,sizeof(SOCKADDR))!=0)
  75. {
  76.   OutErr(string( "bind "));
  77.   return   1;
  78. }

  79. if(listen(server,5)!=0)
  80. {
  81.   OutErr(string( "listen "));
  82.   return   1;
  83. }

  84. while(1)
  85. {
  86.   cliaddrLen=sizeof(SOCKADDR);
  87.   client=accept(server,(SOCKADDR   *)&cli_addr,&cliaddrLen);
  88.   cout << "客户IP: " <<inet_ntoa(cli_addr.sin_addr)
  89.    << ",端口: " <<ntohs(cli_addr.sin_port) <<endl;
  90.   
  91.   ULONG   ul=1;
  92.   if(ioctlsocket(client,FIONBIO,&ul)==SOCKET_ERROR)
  93.   {
  94.    OutErr(string( "ioctlsocket "));
  95.    return   1;
  96.   }
  97.   FD_ZERO(&fdread);//清空集合
  98.   FD_SET(client,&fdread);//将C加入到读取集合中
  99.   
  100.   //Hnd=CreateThread(NULL,0,ThreadProc,(LPVOID)client,0,&dwThreadID);
  101.         //接收数据
  102.   while(TRUE)
  103.   {
  104.    char   data[11];
  105.    int     ReciveBytes;
  106.    //这里阻断程序,知道缓冲区内有可读数据才返回
  107.    if((ret=select(0,&fdread,NULL,NULL,NULL))==SOCKET_ERROR)
  108.    {
  109.                 //套接字错误
  110.                 break;
  111.    }
  112.    
  113.    if(ret> 0)
  114.    {
  115.                 if(FD_ISSET(client,&fdread))//c中是否属于fdread集合                        
  116.                 {      
  117.      do//循环读取,每次接收10个字符,直到把缓冲区中全部取完
  118.      {
  119.       ReciveBytes=recv(client,data,10,0);
  120.       if(ReciveBytes==SOCKET_ERROR)
  121.       {
  122.        //SOCKET错误
  123.        break;  
  124.       }
  125.       data[ReciveBytes]=0;//加上结束符
  126.       cout << "收到 " <<ReciveBytes << "个字节:\n " <<data <<endl;
  127.      }while(ReciveBytes> 0);
  128.                 }
  129.    }
  130.   }//while接收数据
  131.   
  132.   if(Hnd==NULL)
  133.   {
  134.    CloseHandle(Hnd);
  135.    closesocket(client);
  136.   }
  137. }
  138. closesocket(server);
  139. WSACleanup();
  140. return   0;
  141. }

复制代码
//client.cpp 客户端
  1. #include   <iostream>
  2. #include   <winsock2.h>
  3. #include   <string>
  4. #pragma   comment(lib, "ws2_32.lib ")
  5. using   namespace   std;

  6. void   OutErr(string   msg)
  7. {
  8. cout << "错误发生: " <<msg <<endl;
  9. }

  10. int   main()
  11. {
  12. SOCKET   c;
  13. SOCKADDR_IN   server_addr;
  14. WSADATA       wsd;
  15. string         msg;
  16. string         remote_ip;

  17. cout << "输入对方IP地址: ";
  18. cin>> remote_ip;
  19. if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)
  20. {
  21.   OutErr(string( "WSAStartup "));
  22.   return   1;
  23. }

  24. if((c=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_IP,NULL,0,1))==INVALID_SOCKET)
  25. {
  26.   OutErr(string( "WSASocket "));
  27.   return   1;
  28. }
  29. server_addr.sin_addr.S_un.S_addr=inet_addr(remote_ip.c_str());
  30. server_addr.sin_family=AF_INET;
  31. server_addr.sin_port=htons(4000);

  32. if(connect(c,(SOCKADDR   *)&server_addr,sizeof(SOCKADDR_IN))!=0)
  33. {
  34.   OutErr(string( "connect "));
  35.   return   1;
  36. }

  37. do
  38. {
  39.   int   SentBytes;
  40.   cin>> msg;
  41.   if(msg== "exit ")break;
  42.   if((SentBytes=send(c,msg.c_str(),msg.size(),0))==SOCKET_ERROR)
  43.   {
  44.    OutErr(string( "send "));
  45.    break;
  46.   }
  47. }while(1);

  48. closesocket(c);
  49. WSACleanup();
  50. return   0;
  51. }
复制代码
转载自:http://blog.sina.com.cn/s/blog_68b606350100yi5l.html

论坛徽章:
0
2 [报告]
发表于 2011-12-20 20:50 |只看该作者
用Boost不是更方便吗?

论坛徽章:
5
技术图书徽章
日期:2013-11-07 13:21:58技术图书徽章
日期:2013-12-07 10:34:46技术图书徽章
日期:2014-04-23 08:50:31双鱼座
日期:2014-09-16 09:12:34亥猪
日期:2015-01-23 13:37:49
3 [报告]
发表于 2011-12-20 23:18 |只看该作者
这和c有啥子区别?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP