刚刚接触SOCKET编程,网上看了一些资料,发现做些简单的应用还是不难。但是要深入了解SOCKET编程还需要系统的看一些书。一般在进程间通信TCP是一种不错的方式。 ---XXX

TCP链接是面向流的链接,因此数据在应用程序看来应该是没有边界的,之前对send和recv函数中发送的大小和返回值没有理解,今天做了一个实验有了进一步的了解。socket一些常用的函数介绍可以在这里找到http://blog.csdn.net/ithzhang/article/details/8448655

之前有个疑问是如果一方向另一方一次发送大量的数据,超过了TCP缓冲区的大小,那么接收方该如何处理。这里就要用到recv函数的返回值了,它指示了本次调用函数实际接收的字节数,如果这个值小于我们需要接收的数据,那么就需要再一次调用recv函数。

下面是我测试的代码,代码是在VS2013下编译的。

欢迎一起讨论,指正错误。

服务器端:

  1. #include <winsock2.h>
  2. #include <iostream>
  3. #include <numeric>
  4. #include <vector>
  5. #include <algorithm>
  6. #pragma comment(lib,"ws2_32.lib")
  7.  
  8. using namespace std;
  9.  
  10. const int port = ;
  11.  
  12. int main(int argc,char**argv)
  13. {
  14. WSADATA ws;
  15. if (WSAStartup(MAKEWORD(, ), &ws) != )
  16. {
  17. cout << "init windows socket failed::" << GetLastError() << endl;
  18. return -;
  19. }
  20.  
  21. SOCKET serverSocket;
  22.  
  23. serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  24.  
  25. sockaddr_in serverAddr;
  26. serverAddr.sin_family = AF_INET;
  27. serverAddr.sin_port = htons(port);
  28. //serverAddr.sin_addr.s_addr = inet_addr("192.168.182.1");
  29. serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
  30. memset(&(serverAddr.sin_zero), , sizeof(serverAddr.sin_zero));
  31.  
  32. if (bind(serverSocket, (SOCKADDR*)&serverAddr, sizeof(serverAddr))!=)
  33. {
  34. cout << "bind server socket failed\n";
  35. WSACleanup();
  36. return -;
  37. }
  38.  
  39. if (listen(serverSocket,)!=)
  40. {
  41. cout << "listen failded\n";
  42. return -;
  43. }
  44.  
  45. const int buf_size = * ;
  46.  
  47. float *buf = new float[buf_size];
  48.  
  49. for_each(buf, buf + buf_size, [](float &v){v = ; });
  50. cout << std::accumulate(buf, buf + buf_size, ) << endl;
  51. while (true)
  52. {
  53. int add_size = sizeof(SOCKADDR);
  54.  
  55. sockaddr_in client_addr;
  56. SOCKET accept_sock = accept(serverSocket, (SOCKADDR*)&client_addr, &add_size);
  57. if (accept_sock == -)
  58. {
  59. cout << "accept faild\n";
  60. continue;
  61. }
  62.  
  63. int send_size = send(accept_sock, (char*)buf, buf_size*sizeof(float), );
  64. cout << send_size << endl;
  65. if (send_size==-)
  66. {
  67. cout << "send data faild\n";
  68. continue;
  69. }
  70.  
  71. }
  72.  
  73. delete[] buf;
  74. return ;
  75. }

客户端的:

  1. #include <iostream>
  2. #include <numeric>
  3. #include <winsock2.h>
  4. #include <algorithm>
  5.  
  6. #pragma comment(lib,"ws2_32.lib")
  7. using namespace std;
  8. const int port = ;
  9. int main()
  10. {
  11. WSADATA ws;
  12.  
  13. if (WSAStartup(MAKEWORD(, ), &ws) != )
  14. {
  15. cout << "load socket faild\n";
  16. WSACleanup();
  17. return -;
  18. }
  19.  
  20. SOCKET client_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  21.  
  22. sockaddr_in server_addr;
  23. server_addr.sin_family = AF_INET;
  24. server_addr.sin_port = htons(port);
  25. server_addr.sin_addr.s_addr = inet_addr("192.168.182.1");
  26. memset(&(server_addr.sin_zero), , sizeof(server_addr.sin_zero));
  27.  
  28. if (connect(client_sock, (SOCKADDR*)&server_addr, sizeof(SOCKADDR)) != )
  29. {
  30. cout << "connect to server failed \n";
  31. WSACleanup();
  32. return -;
  33. }
  34. const int buf_size = * ;
  35.  
  36. float *buf = new float[buf_size] ;
  37. for_each(buf, buf + buf_size, [](float &v){v = ; });
  38. cout << std::accumulate(buf, buf + buf_size, ) << endl;
  39.  
  40. int recved_size = ;
  41.  
  42. do
  43. {
  44. int rsz = recv(client_sock, (char*)buf + recved_size, buf_size*sizeof(float)-recved_size, );
  45. if (rsz == -)
  46. {
  47. cout << "recv data failed\n";
  48. WSACleanup();
  49. }
  50. recved_size += rsz;
  51.  
  52. } while (recved_size<buf_size*sizeof(float));
  53.  
  54. cout << std::accumulate(buf, buf + buf_size, ) << endl;
  55. delete[] buf;
  56.  
  57. closesocket(client_sock);
  58. }

使用SOCKET TCP的更多相关文章

  1. 分布式消息总线,基于.NET Socket Tcp的发布-订阅框架之离线支持,附代码下载

    一.分布式消息总线以及基于Socket的实现 在前面的分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载一文之中给大家分享和介绍了一个极其简单也非常容易上的基于.N ...

  2. 分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载

    一.分布式消息总线 在很多MIS项目之中都有这样的需求,需要一个及时.高效的的通知机制,即比如当使用者A完成了任务X,就需要立即告知使用者B任务X已经完成,在通常的情况下,开发人中都是在使用者B所使用 ...

  3. 重新想象 Windows 8 Store Apps (62) - 通信: Socket TCP, Socket UDP

    [源码下载] 重新想象 Windows 8 Store Apps (62) - 通信: Socket TCP, Socket UDP 作者:webabcd 介绍重新想象 Windows 8 Store ...

  4. 关于socket tcp 断线重连

    这个问题困扰过我几次,都没有来得及研究,今天研究一下. 首先写一个最简易的socket tcp程序,连接成功后再关闭服务器然后再用客户端各种操作看是什么情况 测试表明 (1)客户端已经连接,当服务端关 ...

  5. ActionScript简单实现Socket Tcp应用协议分析器

    转自..smark http://www.cnblogs.com/smark/archive/2012/05/15/2501507.html ActionScript简单实现Socket Tcp应用协 ...

  6. 与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室

    原文:与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室 [索引页][源码下载] 与众不同 windows phon ...

  7. 基于.NET Socket Tcp的发布-订阅框架

    基于.NET Socket Tcp的发布-订阅框架 一.分布式消息总线 在很多MIS项目之中都有这样的需求,需要一个及时.高效的的通知机制,即比如当使用者A完成了任务X,就需要立即告知使用者B任务X已 ...

  8. 初步探究java中程序退出、GC垃圾回收时,socket tcp连接的行为

    初步探究java中程序退出.GC垃圾回收时,socket tcp连接的行为 今天在项目开发中需要用到socket tcp连接相关(作为tcp客户端),在思考中发觉需要理清socket主动.被动关闭时发 ...

  9. Socket TCP Server一个端口可以有多少个长连接?受到什么影响?linux最大文件句柄数量总结

    Socket TCP Server一个端口可以有多少个长连接? 网上答案很多,不知道那个才是正确的 理论上是无限的 16.Linux中,一个端口能够接受tcp链接数量的理论上限是? A.1024 B. ...

  10. 27.Socket,TCP,UDP,HTTP基本通信原理

    Socket,TCP,UDP,HTTP基本通信原理(摘自百度): TCP.UDP,HTTP 底层通信都是通过 socket 套接字实现 网络上不同的计算机,也可以通信,那么就得使用网络套接字(sock ...

随机推荐

  1. 转:So Easy!让开发人员更轻松的工具和资源

    Cascade Framework 很独特的 CSS 框架,进行了模块化划分,分类排版.表格.颜色.图标和打印样式等等. Mueller Grid System 一个模块化的网格系统,用于响应式或者固 ...

  2. 一】Maven入门

    一.简单pom.xml配置文件解析 <?xml version="1.0" encoding = "utf-8"?> <project xml ...

  3. Mysql 主从复制,读写分离设置

    一个简单完整的 Mysql 主从复制,读写分离的示意图. 1. 首先搭建 Mysql 主从架构,实现 将 mater 数据自动复制到 slave MySQL 复制的工作方式很简单,一台服务器作为主机, ...

  4. BZOJ 1002 [FJOI2007]轮状病毒

    1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3106  Solved: 1724[Submit][Statu ...

  5. 【动态规划】POJ 1161 & ZOJ1463 & XMU 1033 Brackets sequence

    题目链接: http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1033 http://poj.org/problem?id=1141 ZOJ目前挂了. ...

  6. Delphi 多线程的操作

    Delphi 操作多线程的代码, 在项目中需要在webservice中使用多线程,程序思想如下: 1.就创建一个线程, 也就是说有两个线程,主线程和创建的线程, 主线程用于程序的别的操作,例如停止服务 ...

  7. C#编译时出现“不安全代码只会在使用 /unsafe 编译的情况下出现”错误的解决

    原因是:在编译的代码里面有不安全类型unsafe方法或类!解决方法:将项目属性页中生成下的“允许不安全代码”复选框打上对勾即可,方法如下:项目属性对话框->生成->允许不安全代码块 选中即 ...

  8. Bitwise AND of Numbers Range——LeetCode

    Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND of all numbers ...

  9. House Robber——LeetCode

    You are a professional robber planning to rob houses along a street. Each house has a certain amount ...

  10. SQL Server优化之SQL语句优化

    一切都是为了性能,一切都是为了业务 一.查询的逻辑执行顺序 (1) FROM left_table (3) join_type JOIN right_table (2) ON join_conditi ...