【ClientSocket】SendBuf函数发送结构体出错,上代码

对牛乱弹琴 2012-06-12 03:59:37
先定义一个结构体

struct sss
{
int i;
double j;
...//其他的东西,都是一些char类型
char data[2048];
};

一个ClientSocket组件,发送这个结构体

char* cmd = "alskdfjl2k3j4l2k3j4l2asl";//
struct sss mysss;
mysss.i = 1;
mysss.j = 2;
...//其他的东西,都是一些char类型
sprintf(mysss.data, "%s", cmd);

int sendsize = N;//这里我会计算这个结构体的长度,不用怀疑
ClientSocket->Socket->SendBuf((char*)&mysss, sendsize);

服务器代码不写了,及其简单的几行。
问题是:这个是我用BCB写的一个ActiveX,如果直接用IE浏览器调试的话,没有问题,如果注册到VC里调用,则发送不成功;
还有,发送不成功分几种情况:1、如果data长度是128,则没有问题
2、如果data长度是512,发送第一次能接受到,第二次出错
3、如果data长度是1024,第一次接收就失败,接收为空
不知道是什么啊
...全文
175 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
cobra_chen 2012-06-15
  • 打赏
  • 举报
回复
本人平时会看一些博客。
另外找一些开源的代码看看,毕竟看代码是硬功夫,必须要练的。
baidu,google。
《UNIX网络编程》(两卷本),《UNIX网络高级编程》,《TCP/IP详解》
这三本书说的蛮好的。
本人到现在没看完,压力巨大。
不少东西看着云里雾里的。

[Quote=引用 11 楼 的回复:]

饿,你们几位大牛说的太高深了吧,貌似我太水了。说的我心里发毛。

不过我找到问题了,是公司装了一个安保系统(带出去的文件打开是乱码),导致程序除了问题。

不过看你们的回复我觉得还有好多我没发现的问题,你们貌似都很鄙视很不屑。
请求各位分享一下,或者指点一下,写网络通讯程序的注意事项,或者应该看的书籍等等,
是不是向网上说的先看一些实例性的书籍,照着做,然后在慢慢理解。因为我已经不是……
[/Quote]
赵4老师 2012-06-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
调试了一下午,进一步缩小问题范围(自认为如此)

C/C++ code
ClientSocket->Socket->SendBuf((char*)&mysss, sendsize);

mysss.data的内容在调用上面一行前后发生了变化,就是说调用SendBuf之后mysss被修改了
[/Quote]
Setting a Breakpoint When a Variable Changes Value
To set a breakpoint when a variable changes value

From the Edit menu, click Breakpoints.
Click the Data tab of the Breakpoints dialog box.
In the Expression text box, type the name of the variable.
Click OK to set the breakpoint.
cobra_chen 2012-06-13
  • 打赏
  • 举报
回复
赵老师总结的很好。
专业一点的说法,是否就是传说中的 ---> 协议?
[Quote=引用 2 楼 的回复:]

不知道有多少前人掉在TCP Socket
send(人多)send(病少)send(财富)
recv(人多病)recv(少财富)
陷阱里面啊!
http://topic.csdn.net/u/20120210/09/51109ed0-07b9-41f2-b487-a51597f2ca01.html
[/Quote]
qq120848369 2012-06-13
  • 打赏
  • 举报
回复
TCP字节流, 无话可说。
对牛乱弹琴 2012-06-13
  • 打赏
  • 举报
回复
调试了一下午,进一步缩小问题范围(自认为如此)
ClientSocket->Socket->SendBuf((char*)&mysss, sendsize);

mysss.data的内容在调用上面一行前后发生了变化,就是说调用SendBuf之后mysss被修改了
KING_314 2012-06-13
  • 打赏
  • 举报
回复
判断下发送的数据包长度是不是与你要写的长度一致
对牛乱弹琴 2012-06-13
  • 打赏
  • 举报
回复
饿,你们几位大牛说的太高深了吧,貌似我太水了。说的我心里发毛。

不过我找到问题了,是公司装了一个安保系统(带出去的文件打开是乱码),导致程序除了问题。

不过看你们的回复我觉得还有好多我没发现的问题,你们貌似都很鄙视很不屑。
请求各位分享一下,或者指点一下,写网络通讯程序的注意事项,或者应该看的书籍等等,
是不是向网上说的先看一些实例性的书籍,照着做,然后在慢慢理解。因为我已经不是学生了。

最后感谢大家,一天后结贴。
赵4老师 2012-06-12
  • 打赏
  • 举报
回复
“用抓包工具抓包”是Socket程序员必须掌握的技能之一!
赵4老师 2012-06-12
  • 打赏
  • 举报
回复
等你掉进陷阱后就明白了。(^_^)
对牛乱弹琴 2012-06-12
  • 打赏
  • 举报
回复
赵老师的这场大战我见识了,不过你写的东西我怎么没明白啊,[Quote=引用 2 楼 的回复:]

不知道有多少前人掉在TCP Socket
send(人多)send(病少)send(财富)
recv(人多病)recv(少财富)
陷阱里面啊!
http://topic.csdn.net/u/20120210/09/51109ed0-07b9-41f2-b487-a51597f2ca01.html
[/Quote]
对牛乱弹琴 2012-06-12
  • 打赏
  • 举报
回复
我现在能确定每次调用SendBuf的返回值和参数中的sendsize相等,是不是就确定一次性就发送出去了呢,因为这个函数返回值就是实际发送的长度
[Quote=引用 1 楼 的回复:]

send改为
int n = 0;
while ( n < len )
{
int c = send ( &buf[n]
if ( c > 0 )
n += c

}
[/Quote]
赵4老师 2012-06-12
  • 打赏
  • 举报
回复
不知道有多少前人掉在TCP Socket
send(人多)send(病少)send(财富)
recv(人多病)recv(少财富)
陷阱里面啊!
http://topic.csdn.net/u/20120210/09/51109ed0-07b9-41f2-b487-a51597f2ca01.html
ma100 2012-06-12
  • 打赏
  • 举报
回复
send改为
int n = 0;
while ( n < len )
{
int c = send ( &buf[n]
if ( c > 0 )
n += c

}

64,683

社区成员

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

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