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

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

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

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

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

服务器端:

 #include <winsock2.h>
#include <iostream>
#include <numeric>
#include <vector>
#include <algorithm>
#pragma comment(lib,"ws2_32.lib") using namespace std; const int port = ; int main(int argc,char**argv)
{
WSADATA ws;
if (WSAStartup(MAKEWORD(, ), &ws) != )
{
cout << "init windows socket failed::" << GetLastError() << endl;
return -;
} SOCKET serverSocket; serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(port);
//serverAddr.sin_addr.s_addr = inet_addr("192.168.182.1");
serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
memset(&(serverAddr.sin_zero), , sizeof(serverAddr.sin_zero)); if (bind(serverSocket, (SOCKADDR*)&serverAddr, sizeof(serverAddr))!=)
{
cout << "bind server socket failed\n";
WSACleanup();
return -;
} if (listen(serverSocket,)!=)
{
cout << "listen failded\n";
return -;
} const int buf_size = * ; float *buf = new float[buf_size]; for_each(buf, buf + buf_size, [](float &v){v = ; });
cout << std::accumulate(buf, buf + buf_size, ) << endl;
while (true)
{
int add_size = sizeof(SOCKADDR); sockaddr_in client_addr;
SOCKET accept_sock = accept(serverSocket, (SOCKADDR*)&client_addr, &add_size);
if (accept_sock == -)
{
cout << "accept faild\n";
continue;
} int send_size = send(accept_sock, (char*)buf, buf_size*sizeof(float), );
cout << send_size << endl;
if (send_size==-)
{
cout << "send data faild\n";
continue;
} } delete[] buf;
return ;
}

客户端的:

 #include <iostream>
#include <numeric>
#include <winsock2.h>
#include <algorithm> #pragma comment(lib,"ws2_32.lib")
using namespace std;
const int port = ;
int main()
{
WSADATA ws; if (WSAStartup(MAKEWORD(, ), &ws) != )
{
cout << "load socket faild\n";
WSACleanup();
return -;
} SOCKET client_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(port);
server_addr.sin_addr.s_addr = inet_addr("192.168.182.1");
memset(&(server_addr.sin_zero), , sizeof(server_addr.sin_zero)); if (connect(client_sock, (SOCKADDR*)&server_addr, sizeof(SOCKADDR)) != )
{
cout << "connect to server failed \n";
WSACleanup();
return -;
}
const int buf_size = * ; float *buf = new float[buf_size] ;
for_each(buf, buf + buf_size, [](float &v){v = ; });
cout << std::accumulate(buf, buf + buf_size, ) << endl; int recved_size = ; do
{
int rsz = recv(client_sock, (char*)buf + recved_size, buf_size*sizeof(float)-recved_size, );
if (rsz == -)
{
cout << "recv data failed\n";
WSACleanup();
}
recved_size += rsz; } while (recved_size<buf_size*sizeof(float)); cout << std::accumulate(buf, buf + buf_size, ) << endl;
delete[] buf; closesocket(client_sock);
}

使用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. VC++大数据量绘图时无闪烁刷屏技术实现(我的理解是,在内存上作画,然后手动显示,而不再直接需要经过WM_PAINT来处理了)

    http://hantayi.blog.51cto.com/1100843/383578 引言 当我们需要在用户区显示一些图形时,先把图形在客户区画上,虽然已经画好但此时我们还无法看到,还要通过 程序 ...

  2. 树形dp+MST-hdu-4126-Genghis Khan the Conqueror

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4126 题目意思: 给一图,n个点,m条边,每条边有个花费,给出q条可疑的边,每条边有新的花费,每条可 ...

  3. java 、Android 提交参数转码问题

    1.解决Android.JAVA.ajax提交中文.URL中文参数传递后的乱码问题的解决办法  2.JAVA 中URL链接中文参数乱码的处理方法  3.JAVA URL中带有中文时的处理 在提交参数的 ...

  4. library cache lock

    SESSION 34 执行存储过程: SESSION 43 编译存储过程: SESSION 25 删除存储过程: 1.查询查看library cache lock等待事件的相关会话 SQL> s ...

  5. library cahce pin

    library cahce pin(库高速缓存pin)等待事件与库高速缓存并发性有关,当会话尝试在库高速缓存中钉住对象 以修改或检查该对象时产生该事件.会话必须获取(pin)以确保此时对象没有被其他会 ...

  6. ext2,ext3,ext4文件系统管理软件包e2fsprogs

    e2fsprogs(也叫做e2fs programs)是一个Ext2(及Ext3/4)文件系统工具集(Ext2 Filesystems Utilities[2] ),它包含了诸如创建.修复.配置.调试 ...

  7. 【转】(DT系列一)DTS结构及其编译方法----不错

    原文网址:http://www.cnblogs.com/biglucky/p/4057476.html DTS结构及其编译方法 一:主要问题 1,需要了解dtsi与dts的关系 2,dts的结构模型 ...

  8. 基于JAVA的webVNC

    jxpiInstall安装程序下载: http://sdlc-esd.sun.com/ESD6/JSCDL/jdk/7u60-b19/jxpiinstall.exe?AuthParam=1402208 ...

  9. LANG=C是最早最简单的C语言环境(标准ASCII码)

    LANG=C是最早最简单的C语言环境(标准ASCII码)

  10. jquery切换tab标签例子

    之前做了一个简单的小效果,使用jquery方式,让tab标签切换,效果如下 代码其实很简单,首先先把代码分享给大家,代码如下 var shoptoggle = $('.shoptoggle .shop ...