CSocket 设置发送和接收字节数……一个通宵竟然搞不好

hzsdhf 2011-08-21 06:50:51
用UDP 广播

发送:m_ServerSock.Create(8029, SOCK_DGRAM, pszIP);
addr.sin_family = AF_INET;
addr.sin_addr.S_un.S_addr= INADDR_BROADCAST;
addr.sin_port = htons(atoi("8021"));
BOOL bCmdOpt = TRUE;
m_ServerSock.SetSockOpt(SO_BROADCAST, (void*)&bCmdOpt,1);


接收:m_ServerSock.Create(8021, SOCK_DGRAM, szIP);
BOOL bCmdOpt = TRUE;
m_ServerSock.SetSockOpt(SO_BROADCAST, (void*)&bCmdOpt,1);


IP 和 端口我已经搞懂了 发送时好像没限制字节数 但是只可以接收到3K以下的数据包……
我用VS2008 SetSockOpt函数参数是(int nOptionName,const void* lpOptionValue,

int nOptionLen,int nLevel = SOL_SOCKET )

试了一晚上没试出来 我是这样初始化套接字的 WSADATA wsd; AfxSocketInit(&wsd);

求打救呀 MSDN 好像没例子 反正就是没调试出来~ 7点了 崩溃了
...全文
321 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
zmshy2128 2011-08-21
  • 打赏
  • 举报
回复
再说明下,修改了缓冲区大小后,每个包的最大大小不能超过 65536字节
这是系统决定的
zmshy2128 2011-08-21
  • 打赏
  • 举报
回复
m_ServerSock.SetSockOpt(SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int));

m_ServerSock.SetSockOpt(SO_SNDBUF,(const char*)&nSendBuf,sizeof(int));


或者

setsockopt(m_ServerSock,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int));

setsockopt(m_ServerSock,SOL_SOCKET,SO_SNDBUF,(const char*)&nSendBuf,sizeof(int));

两个都行
hzsdhf 2011-08-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zmshy2128 的回复:]

需要设置发送和接收的缓冲区大小

C/C++ code
int nRecvBuf=32*1024;//设置为32K
setsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int));

setsockopt(s,SOL_SOCKET,SO_SNDBUF,(const char*)&nSendBuf,s……
[/Quote]

我要的也许就是这种设置了…… 不过 我是用 CSocket 你的这种设置我不太会用呀~~~

CSocket.SetSockOpt(int nOptionName,const void* lpOptionValue,
int nOptionLen,int nLevel = SOL_SOCKET )

这4个参数…… 好像只隔一层纸了 谁来捅破它呀
super_admi 2011-08-21
  • 打赏
  • 举报
回复
额。UDP啊,看错了。以上只能作为参考。
super_admi 2011-08-21
  • 打赏
  • 举报
回复
#define PLM_MAX_RECEIVE 1024
super_admi 2011-08-21
  • 打赏
  • 举报
回复
我一般会使用CSocket。试试这个:

bool MsgReceive ()
{
if(false == m_bOpenStatus)return false;
char myBuffer[PLM_MAX_RECEIVE]; long len = 0; strReceiveMsg.Empty();
#ifdef _UNICODE
#pragma message("_UNICODE macro activated!")
USES_CONVERSION;
#endif
do //此处有微小的死锁隐患(概率不大)
{
memset(myBuffer, 0, PLM_MAX_RECEIVE * sizeof(char));
len = Receive(myBuffer, PLM_MAX_RECEIVE - 2);
if(SOCKET_ERROR == len)return false;
#ifdef _UNICODE
strReceiveMsg += A2W(myBuffer);
#else
strReceiveMsg += myBuffer;
#endif
}while(PLM_MAX_RECEIVE - 2 == len);
return true;
}
zmshy2128 2011-08-21
  • 打赏
  • 举报
回复
需要设置发送和接收的缓冲区大小

int nRecvBuf=32*1024;//设置为32K
setsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int));

setsockopt(s,SOL_SOCKET,SO_SNDBUF,(const char*)&nSendBuf,sizeof(int));
hzsdhf 2011-08-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 coding_hello 的回复:]

UDP广播的完整的工程,需要的话可以下载

接收端新建一个Win32 Console工程,选中支持MFC,代码如下:
C/C++ code

#include "stdafx.h"
#include "UDPRecver.h"
#include "AfxSock.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static……
[/Quote]

刚睡醒……我想要接6万位的数据 而且你跟我写的没大区别呀

刚刚我自己慢慢的试了一次 是可以接收到7000多位的数据


目标是6万
robinkeng 2011-08-21
  • 打赏
  • 举报
回复
学习。。
hzsdhf 2011-08-21
  • 打赏
  • 举报
回复
我自己又搞了个简单一点的小实例,用的就是我的方法,还是不可以接收到8K以上的数据包

http://download.csdn.net/source/3537788

不知道有没有哪位高手有空改写一下,我要能接收5万位以上的接收端。

直接说怎么改就可以了,
小程序有点乱,发送端直接点“发送”就可以了,两个端都会提示字节。

各位,我这小菜的命运在你们手上啦~~
至善者善之敌 2011-08-21
  • 打赏
  • 举报
回复
楼主应该放松,好好休息一下,欲速则不达,也许一觉之后,发现紧紧是个参数设置的问题,哈哈
野男孩 2011-08-21
  • 打赏
  • 举报
回复
UDP广播的完整的工程,需要的话可以下载

接收端新建一个Win32 Console工程,选中支持MFC,代码如下:

#include "stdafx.h"
#include "UDPRecver.h"
#include "AfxSock.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// The one and only application object

CWinApp theApp;

using namespace std;

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;

// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}

AfxSocketInit();
CSocket m_ServerSock;
m_ServerSock.Create(8021, SOCK_DGRAM);
BOOL bCmdOpt = TRUE;
m_ServerSock.SetSockOpt(SO_BROADCAST, (void*)&bCmdOpt,1);

while(1)
{
CString addr;
UINT port;
char buf[4096] = {0};
UINT recv_len = m_ServerSock.ReceiveFrom(buf, sizeof(buf), addr, port);

cout << "收到来自(" << (LPCSTR)addr <<":"<<port<<")的" << recv_len <<"字节,内容:" <<buf << endl;
}

return nRetCode;
}


下面是收到的数据长度为4000字节,说明超过3k没问题

收到来自(192.168.1.5:8029)的4000字节,内容:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...........................................
hzsdhf 2011-08-21
  • 打赏
  • 举报
回复
最起码每次要接 60,000位数据 以上 系统是 XP 应该不是难的……
hzsdhf 2011-08-21
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zmshy2128 的回复:]

C/C++ code
m_ServerSock.SetSockOpt(SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int));

m_ServerSock.SetSockOpt(SO_SNDBUF,(const char*)&nSendBuf,sizeof(int));


或者

C/C++ code
setsockopt(m_S……
[/Quote]

我本来的m_ServerSock.SetSockOpt(SO_BROADCAST, (void*)&bCmdOpt,1);
的后面可不可以再加m_ServerSock.SetSockOpt(SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int));的:
不过 我试过了 不行呀~ 烦呀………………
bluemei-lee 2011-08-21
  • 打赏
  • 举报
回复
要注意CSocket是非线程安全类
hzsdhf 2011-08-21
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 pathuang68 的回复:]

CSocket是MFC中让我敬而远之的几个类之一...感觉直接用API写很容易写一点。
[/Quote]
我以为用封装好的类会比较简单?

因为我是看到一个例子用到CSocket可以 UDP广播而已

初学的人呀 没经验~不过, 我相信 这个问题可以解决吧?

到现在 还没行……
pathuang68 2011-08-21
  • 打赏
  • 举报
回复
CSocket是MFC中让我敬而远之的几个类之一...感觉直接用API写很容易写一点。

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧