首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在Wsock2上轻松解决10040消息太长错误

如何在Wsock2上轻松解决10040消息太长错误
EN

Stack Overflow用户
提问于 2012-02-21 13:07:31
回答 3查看 18.9K关注 0票数 2

我从.Net应用程序通过udp套接字发送1404个浮点值,总共5616个字节。我从这个操作中没有得到异常。

但是,接收这些数据的程序是一个C++应用程序,当接收到如此大量的数据时,我得到一个10040消息太长错误。

显然,1480字节是Wsock2中消息的最大可能大小。

解决这个问题最简单、最干净的方法是什么?

谢谢!

编辑:发布一些代码:

这是我的套接字J_Receive类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include "J_Receive.h"


#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#if defined (WIN32) && !defined(__CYGWIN__)
#include <winsock.h>
#else
#include <unistd.h>
#include <sys/uio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <sys/time.h>
#endif
#include <string.h>

#include <iostream>

using namespace sockets;

J_Recibir::J_Recibir( void )
{
    _port = 0;
    _initialized = false;
    _buffer = 0L;
}

J_Recibir::~J_Recibir( void )
{
#if defined (WIN32) && !defined(__CYGWIN__)
    closesocket( _so);
#else
    close( _so );
#endif
}

bool J_Recibir::init( void )
{
#if defined(WIN32) && !defined(__CYGWIN__)
    WORD version = MAKEWORD(1,1);
    WSADATA wsaData;
    // First, we start up Winsock
    WSAStartup(version, &wsaData);
#endif

    if( _port == 0 )
    {
    fprintf( stderr, "Receiver::init() - port not defined\n" );
    return false;
    }

    if( (_so = socket( AF_INET, SOCK_DGRAM, 0 )) < 0 )
    {
        perror( "Socket" );
    return false;
    }



    /*int buffsize  = 50000;
    setsockopt( _so, SOL_SOCKET, SO_RCVBUF, (const char*)&buffsize, sizeof(buffsize));*/

#if defined (WIN32) && !defined(__CYGWIN__)
//    const BOOL on = TRUE;
//    setsockopt( _so, SOL_SOCKET, SO_REUSEADDR, (const char*) &on, sizeof(int));
#else
    int on = 1;
    setsockopt( _so, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
#endif




//    struct sockaddr_in saddr;
    saddr.sin_family = AF_INET;
    saddr.sin_port   = htons( _port );
#if defined (WIN32) && !defined(__CYGWIN__)
    saddr.sin_addr.s_addr =  htonl(INADDR_ANY);
#else
    saddr.sin_addr.s_addr =  0;
#endif

    if( bind( _so, (struct sockaddr *)&saddr, sizeof( saddr )) < 0 )
    {
        perror( "bind" );
        return false;
    }

    u_long iMode = 1;       // 1 para No bloqueante, 0 para bloqueante
    ioctlsocket(_so, FIONBIO, &iMode);

    _initialized = true;
    return _initialized;
}


void J_Recibir::setPort( const short port )
{
    _port = port;
}

void J_Recibir::setBuffer( void *buffer, const unsigned int size )
{
    _buffer = buffer;
    _buffer_size = size;
}

int J_Recibir::sync( void )
{
    if(!_initialized) init();

    if( _buffer == 0L )
    {
        fprintf( stderr, "Receiver::sync() - No buffer\n" );
        return -1;
    }

#if defined(__linux) || defined(__FreeBSD__) || defined( __APPLE__ )
    socklen_t 
#else
    int
#endif
        size = sizeof( struct sockaddr_in );

    fd_set fdset;
    FD_ZERO( &fdset );
    FD_SET( _so, &fdset );

    struct timeval tv;
    tv.tv_sec = 0;
    tv.tv_usec = 0;

#if defined (WIN32) && !defined(__CYGWIN__)
//    saddr.sin_port   = htons( _port );
    recvfrom( _so, (char *)_buffer, _buffer_size, 0, (sockaddr*)&saddr, &size );


//    recvfrom(sock_Receive, szMessage, 256, 0, (sockaddr*)&addr_Cli, &clilen)
    int err = WSAGetLastError ();
    if (err!=0){
        fprintf( stderr, "Receiver::sync() - error %d\n",err );
        perror("Error: ");
    }

    while( select( _so+1, &fdset, 0L, 0L, &tv ) )
    {
        if( FD_ISSET( _so, &fdset ) )
        {
            recvfrom( _so, (char *)_buffer, _buffer_size, 0, (sockaddr*)&saddr, &size );
        }
    }
#else
    recvfrom( _so, (caddr_t)_buffer, _buffer_size, 0, 0, &size );
    while( select( _so+1, &fdset, 0L, 0L, &tv ) )
    {
        if( FD_ISSET( _so, &fdset ) )
        {
            recvfrom( _so, (caddr_t)_buffer, _buffer_size, 0, 0, &size );
        }
    }
#endif

    if (err!=0) return -1;
    else        return 0;
}

下面是我调用接收函数的方式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
     sockets::J_Receiver receiverGUI = new sockets::J_Recibir();
     receiverGUI->setPort(4020);
     nDatosGUI = 1404;
     float* datosGUI = new datosGUI[nDatosGUI ];
     receiverGUI->setBuffer((void *)datosGUI, sizeof(float)*nDatosGUI);
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-21 15:41:06

WSAEMSGSIZE通常意味着您提供给recvfrom()的缓冲区小于传入的数据报。检查或发布您的recvfrom()代码,以确保您使用的缓冲区足够大且声明正确。因为IPv4数据包(理论上)可以达到64KB的大小,所以总是使用这么大的缓冲区是最安全的。

票数 4
EN

Stack Overflow用户

发布于 2012-02-21 13:21:58

MSDN documentation读取错误WSAEMSGSIZE (10040):

消息太长。

在数据报套接字上发送的消息大于内部消息缓冲区或其他网络限制,或者用于接收数据报的缓冲区小于数据报本身。

这可能意味着您的接收缓冲区太小,您需要扩大它。这是通过setsockopt函数和SO_RCVBUF选项完成的。

票数 1
EN

Stack Overflow用户

发布于 2012-02-21 16:29:52

当您调用recvfrom()时,10040会告诉您使用更大的缓冲区。这并不意味着您要增加套接字的内部接收缓冲区的大小。

既然你已经知道你希望接收多少个浮点数,只需声明一个足够大的缓冲区来接收所有浮点数,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
float buffer[1404];
int ret = recvfrom(..., (char*)&buffer[0], sizeof(buffer), ...);

Winsock对消息没有1480字节的限制。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9378146

复制
相关文章
python中星号的意义(**字典,*列表或元组)
传递实参和定义形参(所谓实参就是调用函数时传入的参数,形参则是定义函数是定义的参数)的时候,你还可以使用两个特殊的语法:*、** 。 调用函数时使用* ,** test(*args)中 * 的作用:其实就是把序列 args 中的每个元素,当作位置参数传进去。比如上面这个代码,如果 args 等于 (1,2,3) ,那么这个代码就等价于 test(1, 2, 3) 。 test(**kwargs)中** 的作用:则是把字典 kwargs 变成关键字参数传递。比如上面这个代码,如果 kwargs 等于 {
用户1214487
2018/01/24
3.7K0
Python中的字典遍历
备忘一下python中的字典如何遍历,没有什么太多技术含量.仅供作为初学者的我参考.
技术小黑屋
2018/09/04
2.7K0
Python中如何遍历字典
今天在写一个判断列表中的元素是否与字典中的key值相等的时候,需要用到字典的遍历,经过查阅资料,知道怎么遍历字典的key值;
bear_fish
2018/09/20
1.6K0
Python中如何遍历字典
python中列表排序,字典排序,列表中的字典排序
key= lambda dict1:dict1[0] #dict1[0]表示按键,dict1[1]表示按值。
用户8346838
2021/03/10
9.1K0
Python - 从字典列表中删除字典
字典是python的一个非常常用的功能,用于根据用户需要在其中存储数据。另一个典型的过程涉及编辑或操作此数据。要成为一名高效且快速的程序员,您必须弄清楚如何从字典列表中删除字典。有许多技术可以从词典列表中删除字典,本文将介绍这些技术。
很酷的站长
2023/08/11
2650
Python - 从字典列表中删除字典
Python中的循环:遍历列表、元组、字典和字符串
想想现实生活中的情况。你是一位在森林里测量树木的野外生物学家。你选一棵树,测量它的直径和高度,把它们写在你的笔记本上,估计它的总体积。接下来,你再选一棵树,测量它的直径和高度,把它们写在你的笔记本上,估计它的总体积。然后,你再选一棵树,测量它的直径和高度,把它们写在你的笔记本上,估计它的总体积。
deephub
2021/04/16
12.1K0
在Python中,不用while和for循环遍历列表
s1=s.encode(encoding='utf-8').decode('unicode_escape')
用户2337871
2019/07/19
5.5K0
Python: 遍历字典
遍历字典 d = {'x': 1, 'y': 2, 'z': 3} 遍历keys for key in d: print key, y x z for key in d.iterkeys(): # d.iterkeys(): an iterator over the keys of d print key, y x z for key in d.keys(): # d.keys() -> ['y', 'x', 'z'] print key, y x z 遍历value
用户2183996
2018/06/28
1.1K0
Python遍历字典
前面我们简单介绍了Python字典和Python获取字典值。今天我们来聊聊如何遍历python字典。我们还是以car为例子。下面简单介绍三种方法来遍历字典。
生信交流平台
2020/08/06
7240
python中循环遍历for怎么用_python遍历字典的值
Python 会自动将dict_1视为字典,并允许你迭代其key键。然后,我们就可以使用索引运算符,来获取每个value值。
全栈程序员站长
2022/09/22
6K0
python中循环遍历for怎么用_python遍历字典的值
Python - 删除列表中的重复字典
Python 是一个非常广泛使用的平台,用于 Web 开发、数据科学、机器学习以及自动化执行不同的过程。我们可以将数据存储在python中,以不同的数据类型,例如列表,字典,数据集。python字典中的数据和信息可以根据我们的选择进行编辑和更改
很酷的站长
2023/08/11
3651
Python - 删除列表中的重复字典
python3-列表中存储字典
# Auther: Aaron Fan #示例1: #定义几个字典 alien_0 = {"color":"green", "points":5} alien_1 = {"color":"yellow", "points":10} alien_2 = {"color":"red", "points":15} #把字典存入到列表aliens中 aliens = [alien_0, alien_1, alien_2] #遍历这个列表 for alien in aliens:    print(alien
py3study
2020/01/06
1.4K0
python3-字典中存储列表
# Auther: Aaron Fan #示例1: #存储所点披萨的信息 pizza = {    '外皮':'厚的',    '配料列表':['香菇', '奶酪'], } #概述所点的比萨 print('您点了一道"%s-外皮"的比萨信息: ' % pizza['外皮']) for 配料 in pizza['配料列表']:    print("\t%s" % 配料) #示例2: 最喜欢的语言 = {    '张三':['python','ruby'],    '李四':['c'],    
py3study
2020/01/07
1.8K0
python实用技巧:在列表,字典,集合中快速筛选数据
python中,要对列表、字典、集合进行数据筛选,最简单的方式就是用遍历,逐一对比,将符合条件的元素保存。这种方式虽然简单,但不够简洁优雅,以下用实例说明其他实现方式。 本文示例代码均用python
章鱼喵
2018/06/27
5.7K0
python列表、元组、字典
列表是由一序列特定顺序排列的元素组成的。可以把字符串,数字,字典等都可以任何东西加入到列表中,列表中的元素之间没有任何关系。列表也是自带下标的,默认也还是从0开始。列表常用方括号表示,即:[],元素用逗号隔开。
py3study
2020/01/15
1.2K0
Python中的列表、元祖、字典的区别
定义 方法 列表 可以包含不同类型的对象,可以增减元素,可以跟其他的列表结合或者把一个列表拆分,用[]来定义的eg:aList=[123,'abc',4.56,['inner','list'],7-9j] 1.list(str):将str转换成list类型,str可以使字符串也可以是元组类型2.aList.append('test'):追加元素到列表中去3.del aList[1]:删除列表中下标为1的元素del aList:删除整个列表4.cmp(list1,list2):比较两个列表的大小5.len(
py3study
2020/01/09
2.8K0
Go 语言入门系列:列表与字典及其遍历
前面的文章主要介绍了 Go 容器的数组和切片的基本概念以及使用。本文将会介绍列表与字典在 Go 语言中相关的使用,以及几种常用容易的遍历及其使用。。
aoho求索
2021/08/06
3.4K0
python 字典、列表、json转换
#!/usr/bin/python3   import json      #python字典类型转换为json对象   data = {       'id' : 1,       'name' : 'test1',       'age' : '1'   }   data2 = [{       'id' : 1,       'name' : 'test1',       'age' : '1'   },{       'id' : 2,       'name' : 'test2',       '
一朵灼灼华
2022/08/05
1.4K0
python之列表、元组、字典
3 深拷贝和浅拷贝 1 浅拷贝: 当列表中存在有个列表时,其修改这个列表中列表的某一个元素时,其他被拷贝的列表中的对应元素也将被拷贝,其在拷贝这个列表中的列表时,拷贝的是这个内嵌列表的内存位置。
py3study
2020/01/14
2.8K0
点击加载更多

相似问题

遍历python中的字典列表

21

在python中遍历字典内的列表

665

如何遍历python字典列表

21

Python -遍历列表字典

21

在列表中遍历字典

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文