TCP 连接似乎接收到不完整的数据

2023-12-05

我已经设置了一个简单的 TCP 文件传输。一切似乎都工作正常,除了接收到的文件大小偶尔小于发送的文件大小。接收到的文件的大小似乎没有任何规律。

(在下面的代码中,请注意典型的客户端/服务器滚动是相反的) 我的客户端代码如下:

#define kMaxBacklog (5)
// fill out the sockadd_in for the server
struct sockaddr_in servAdddress;
//memcpy() to fill in the sockaddr

//setup the socket
int sockd, returnStatus;    
sockd = socket(AF_INET, SOCK_STREAM, 0);
if (sockd == -1)
    NSLog(@"could not create client socket");
else
    NSLog(@"created client socket");

returnStatus = connect(sockd, (struct sockaddr*)&servAdddress, sizeof(servAdddress));
if (returnStatus == -1)
    NSLog(@"could not connect to server - errno:%i", errno);
else
    NSLog(@"connected to server"); 

NSData *dataWithHeader = [self getDataToSend];
returnStatus = send(sockd, [dataWithHeader bytes], [dataWithHeader length], 0);
if (returnStatus == -1)
    NSLog(@"could not send file to server");
else if( returnStatus < [dataWithHeader length])
    NSLog(@"ONLY PARTIAL FILE SENT");
else
    NSLog(@"file sent of size: %i", returnStatus);

shutdown(sockd, SHUT_WR);
close(sockd);

客户端方法始终报告它发送了整个文件。

对于服务器:

#define MAXBUF (10000)
int _socket;
_socket = socket(AF_INET, SOCK_STREAM, 0); // set up the socket 

struct sockaddr_in addr; 
bzero(&addr, sizeof(addr)); 
addr.sin_len = sizeof(addr); 
addr.sin_family = AF_INET; 
addr.sin_addr.s_addr = INADDR_ANY;
addr.sin_port = htons(0); 

int retval = bind(_socket, (struct sockaddr *)&addr, sizeof(addr)); 
    if (retval == -1)
        NSLog(@"server could not bind to socket");
    else 
        NSLog(@"server socket bound");

socklen_t len = sizeof(addr); 
retval = getsockname(_socket, (struct sockaddr *)&addr, &len);
    if (retval == -1)
        NSLog(@"server could not get sock name");
    else 
        NSLog(@"server socket name got");

    int socket1, socket2, clientAddrLen, returnStatus;
    struct sockaddr_in servAdddress, clientAddress;
    clientAddrLen = sizeof(servAdddress);

    socket1 = _socket;

    returnStatus = listen(socket1, kMaxBacklog);
    if (returnStatus == -1)
        NSLog(@"server could not listen on socket");
    else
        NSLog(@"server socket listening");

while(1){
    FILE *fd;
    int i, readCounter;
    char file[MAXBUF];

    NSLog(@"server blocking on accept()");
    socket2 = accept(socket1, (struct sockaddr*)&clientAddress, (socklen_t*)&clientAddrLen);
    if (socket2 == -1)
        NSLog(@"server could not accpet the connection");
    else
        NSLog(@"server connection accepted");

    i = 0;
    readCounter = recv(socket2, file, MAXBUF, 0);
    if(!readCounter)
        NSLog(@"server connection cancelled, readCount = 0");

        else if (readCounter == -1){
        NSLog(@"server could not read filename from socket");
        close(socket2);
        continue;
    }
    else
        NSLog(@"server reading file of size: %i", readCounter);


    fd = fopen([myfilePathObject cStringUsingEncoding:NSASCIIStringEncoding], "wb");

    if(!fd){
        NSLog(@"server could not open the file for creating");
        close(socket2);
        continue;
    }
    else
        NSLog(@"server file open for creating");

    returnStatus = fwrite([myData bytes], 1, [myData length], fd);
    if (returnStatus == -1)
        NSLog(@"Error writing data to server side file: %i", errno);
    else
        NSLog(@"file written to disk);

    readCounter = 0;
    //close (fd);
    returnStatus = fclose(fd);
    if(returnStatus)
        NSLog(@"server error closing file");

因此,偶尔,readCounter 变量将不会包含与发送的文件相同的大小,但有时会包含相同的大小。

如果重要的话,文件传输是在 iPhone 和 iPhone 模拟器之间进行的,两者都是通过 WIFI 进行的。无论手机是服务器还是模拟器是服务器,都会发生这种情况。

如果有人能帮助我理解为什么会发生这种情况,我将不胜感激。我认为TCP的全部目的就是为了避免这种问题。

(为了给予应有的认可,我的服务器和客户端代码大量借鉴了 Apress 的 Davis、Turner 和 Yocom 所著的《Linux 网络编程权威指南》一书)


The recv函数只能接收 1 个字节,您可能需要多次调用它才能获取整个有效负载。因此,您需要知道您期望有多少数据。虽然你can通过关闭连接来发出完成信号,这并不是一个好主意。

Update:

我还应该提到的是send函数具有相同的约定recv:你必须循环调用它,因为你不能假设它会发送你的所有数据。虽然它可能在您的开发环境中始终有效,但这种假设会在以后困扰您。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TCP 连接似乎接收到不完整的数据 的相关文章

  • 具有多个文件扩展名的查找命令

    我正在查看许多子目录 找到所有以 JPG jpg 和 png 结尾的文件 并将它们复制到一个单独的目录中 但是现在只找到 JPG 有人可以解释我做错了什么吗 find root TEST Images name png o name jpg
  • PHP 通过 TCP/IP 发送消息

    我尝试通过 TCP IP 从 PHP 网站向 Arduino 发送消息 使用以下代码我可以从 php 网站发送消息 问题是 当第一次调用该网站时 消息不会立即发送 网站刷新几次后 消息就会到达 但逻辑上很多次 就像网站刷新量一样 已经尝试将
  • shell 脚本中的 Telnet

    如何在 shell 脚本中运行 telnet 并在远程服务器上执行命令 出于安全原因 我没有在我的Solaris 机器上安装expect 我也没有perlnet telnet模块已安装 那么如果不使用expect和perl我该怎么办呢 我尝
  • 如何使用 netcat 发送文件并保持连接?

    我发出命令 netcat serveraddress myport lt MY FILE 问题是 一旦文件发送完毕 netcat 就会发送一条消息来关闭连接 发送该文件后 我需要从控制台写入消息 我记得对标准输入做了一些事情 是这样的吗 n
  • python 中的原始套接字和 sendto

    我正在努力将 scapy 与twisted 集成 但我在 OSX 上遇到了这个非常奇怪的错误 我似乎无法弄清楚 基本上我无法通过原始套接字发送有效的 TCP 数据包 包括 IP 标头 这就是我正在做的 import socket from
  • SO_BINDTODEVICE Linux 套接字选项的问题

    我有一台带有两个网卡的电脑 一 eth0 用于 LAN 互联网 另一个用于与一个微控制器设备进行 UDP 通信 微控制器有一个 IP 192 168 7 2 和一个 MAC 地址 第二个电脑网络适配器 eth1 有 192 168 7 1
  • SO_REUSEPORT 可以在 Unix 域套接字上使用吗?

    Linux 内核 gt 3 9 允许通过设置在内核负载平衡的进程之间共享套接字SO REUSEPORT http lwn net Articles 542629 http lwn net Articles 542629 这如何用于类型的套接
  • pyvenv-3.4 返回非零退出状态 1

    我在 Kubuntu 14 04 我想用 python3 4 创建一个 virtualenv 我之前在其他文件夹中使用过 python2 7 但是当我尝试时 pyvenv 3 4 venv 我有 Error Command home fmr
  • TCP 校验和可能无法检测到错误吗?如果是的话,这件事是如何处理的?

    如果 TCP 有效负载在传输过程中被损坏 则重新计算的校验和将与传输的校验和不匹配 太好了 到目前为止一切都很好 如果 TCP 校验和在传输过程中损坏 则重新计算的校验和将与现在损坏的校验和不匹配 太好了 到目前为止一切都很好 当有效负载和
  • HttpRequest PUT内容到poco库中

    我想使用 HTTP PUT 请求将一些数据从 C 应用程序发送到服务器 我在用poco http pocoproject org我的应用程序中的网络库 我正在使用这个代码片段 HTTPClientSession session uri ge
  • 在 scapy 中通过物理环回发送数据包

    我最近发现了 Scapy 它看起来很棒 我正在尝试查看 NIC 上物理环回模块 存根上的简单流量 但是 Scapy sniff 没有给出任何结果 我正在做的发送数据包是 payload data 10 snf sniff filter ic
  • 什么是监控网络活动的好工具[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我经营的是小区 现在我正在寻找一个在服务器 Windows 或 Linux 上运行的监控工具 它可以跟踪
  • 检测 Android 上的网络连接类型

    如何检测 Android 上的网络连接类型 是否通过ConnectivityManager getActiveNetworkInfo getType 答案是否仅限于 Wifi 和移动设备 如果问题是要确定手机的网络是否已连接且速度是否足以满
  • express.io VS express + socket.io 有什么用处?

    我在这里发现了 socket io 和聊天示例 https github com rauchg chat example blob master index js https github com rauchg chat example b
  • lua-socket:unix 域套接字?

    我使用的是 lua socket 3 0rc1 3 Ubuntu Trusty 附带的 和 lua 5 1 我正在尝试监听 unix 域套接字 我能找到的唯一示例代码是this http lua users org lists lua l
  • 如何并行执行4个shell脚本,我不能使用GNU并行?

    我有4个shell脚本dog sh bird sh cow sh和fox sh 每个文件使用 xargs 并行执行 4 个 wget 来派生一个单独的进程 现在我希望这些脚本本身能够并行执行 由于某些我不知道的可移植性原因 我无法使用 GN
  • unix 下日期字段排序

    我有包含数十万条记录的文本文件 其中一个字段是日期字段 有没有办法根据日期字段对文件进行排序 09 APR 12 04 08 43 632279000 AM 19 MAR 12 03 53 38 189606000 PM 19 MAR 12
  • 当我退出应用程序时,如何删除 UNIX 域套接字文件?

    我有一个服务器应用程序 它在特定路径中创建一个 UNIX 域套接字 其名称和bind 到它 仅当我有意从应用程序代码中关闭 停止应用程序时 我才需要删除套接字 否则需要打开 我该怎么做呢 Thanks Edit 考虑一下我从终端内部启动并运
  • 伪TCP通道

    什么是伪 TCP 通道以及如何实现 伪 TCP 是一种协议 它实现了 TCP 的一些思想 通过不可靠的基于数据包的接口提供可靠的数据流 例如 如果您只能访问 UDP 但想要 一种可靠的方式来传递数据 则可以使用此方法 您可以在这里找到示例代
  • Perl 和 Unix 如何以相同的顺序对 Unicode 字符串进行排序?

    我正在尝试获取 Perl 和 GNU Linuxsort 1 程序就如何对 Unicode 字符串进行排序达成一致 我在跑sort with LANG en US UTF 8 在Perl程序中我尝试了以下方法 use Unicode Col

随机推荐

  • div 内的按钮,不发送 div onclick - JavaScript

    我有一个 div 该 div 有一个 onclick 事件 div 内部有一些文本和一个按钮 当我单击文本时 会发送 div onclick 这很好 但是 当我单击 div 内的按钮时 按钮的 onclickanddiv 已发送 我知道这是
  • 在 Plotly 中向 3D 散点图添加注释

    我是这个领域的新手 希望得到一些帮助 我刚刚开始使用 Plotly 并使用它来构建一个非常基本的 3D 散点图 该图对一些货架以及物品所在位置进行建模 当我构建 架子 并渲染绘图时 我想在文本中添加注释 指示我正在查看哪组架子 这是我的程序
  • Ruby 中的堆栈级别太深,试图绘制随机卡

    运行下面的代码时出现错误 堆栈级别太深 如果随机选择的卡不存在 则会选择另一张随机卡 我想我应该以某种方式尝试一下代码 但我不确定如何 有什么建议么 def hit choice of card rand deck length choos
  • 重点组件参考

    我正在开发一个基于 java swing 的简单应用程序 如何获取和设置表单当前聚焦的文本字段 文本区域的文本 我知道如何确定哪个组件具有焦点 但我不知道如何获取组件的选定文本 我使用 getFocusOwner 但它返回一个组件 因此没有
  • 按对列结果查询

    目前我的数据集由 4 列组成 id status user id created date 所以一段时间后数据可以是这样的 1 LOGIN 2019 07 16 07 06 55 Bob 2 LOGOUT 2019 07 16 07 29
  • 显示网页上的幻灯片数量

    我编写了一个自定义滑块 如本代码笔所示 http codepen io anon pen NqQpjG我添加了额外的功能来计算移动的幻灯片总数 例如 如果幻灯片总数为 8 则起始值将如下所示 Slides 0 8 当一张幻灯片移动时 它会变
  • 将源代码多次传递到 cpp

    基本上 我试图将源代码两次传递给 gcc 的 cpp 然后直接传递给 gcc 的 c 编译器 至于为什么 我相信有些东西永远无法在宏中内联 这是一个例子 say i want to make an inline definition tha
  • magento后端无法登录致命错误getBlockName

    在 Magento 1 8 上运行 我正在复制到测试生产站点 但在后端我无法登录 这是错误消息 Fatal error Call to a member function getBlockName on a non object in va
  • 从 gtk 树视图的选定行获取数据 - gtkmm,c++

    我有一个 GTK 应用程序 它的窗口带有treeview和一个按钮 单击按钮时 我需要从所选行的第一列 也是唯一一列 获取数据treeview 这是列的类 class ModelColumns public Gtk TreeModel Co
  • 为什么我安装了 opencv3 包却无法导入?

    我目前正在运行 Python 3 5 并使用 Anaconda 的 Spyder 作为我的 IDE 我在 Windows 机器上运行这个 当我写作时import cv3在我的代码顶部 它返回错误ImportError No module n
  • jQuery 和 jQuery Mobile:点击与 touchstart、touchend、touchmove 和 click?

    是否jQuery 移动点击相当于向元素添加事件侦听器 如下所示 myElement addEventListener touchstart touchStartHandler false 如果是这样 那么其余的正常事件 例如touchmov
  • 当仅限于 Android 时,YouTube API 密钥会出现 500 错误

    我在使用仅在 Android 上安全使用的密钥查询 YouTube 搜索 API 时遇到了非常困难的情况 看来当我删除该密钥的限制时 该请求工作正常 当我尝试锁定它并发送证书和包标头时 如中所述这个解决方案 我收到一个非常无用的 500 错
  • 解决 goroutine 死锁

    我一直在尝试解决我在Golang并发中遇到的这个简单问题 我一直在搜索所有可能的解决方案 但没有发现任何特定于我的问题的解决方案 或者我可能会错过一个 这是我的代码 package main import fmt time func pro
  • 如何在 WPF 绑定中替换 StringFormat 中的字符串

    我需要更换一个 with n 新行 在我的字符串中 我想在客户端执行此操作StringFormat
  • R 无法使用 hist() 因为由于负十进制数而导致“内容不是数字”?

    我是 R 新手 我正在尝试使用 hist 绘制 100 000 个数字列表的直方图 如下所示 0 764 0 662 0 764 0 019 0 464 0 668 0 464 但我不能这样做 因为 R 抱怨内容不是数字 这是我尝试过的 我
  • 上传文件时nodejs和express错误,“无法读取未定义的属性”

    编辑 为了清楚起见 我希望将文件上传到服务器 无论是图片还是一些 txt 我已经查看了与此类似的其他常见问题 但无法缓解我的问题 目的是创建文件上传功能 前端看起来像这样 div class holdingDiv div
  • 位置粘在头上

    你可能知道 position sticky 已登陆Webkit demo 到目前为止 我可以看到这只适用于父元素 但我想知道是否可以在带有表格的滚动 div 中使用它 所以它需要 监听 的滚动事件div 不是table 我知道我可以使用 j
  • 线程 NSTimer

    我知道有关此主题的许多问题 因为我自己之前也问过一个问题 但是 我的问题现在似乎与线程部分更相关 我有以下2种方法 void restartTimer NSAutoreleasePool pool NSAutoreleasePool all
  • 德尔福嵌入式 Chrome

    有人有使用delphi嵌入式chrome的经验吗 Delphi铬嵌入式 如何访问其 HTML 文档 就像给 Editbox 赋值一样 See 演示 guiclient目录为例 更新 设置输入字段文本的示例iGoogle page proce
  • TCP 连接似乎接收到不完整的数据

    我已经设置了一个简单的 TCP 文件传输 一切似乎都工作正常 除了接收到的文件大小偶尔小于发送的文件大小 接收到的文件的大小似乎没有任何规律 在下面的代码中 请注意典型的客户端 服务器滚动是相反的 我的客户端代码如下 define kMax