VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 776|回复: 7

易语 转 C语言 WSARecvFrom 类型不对老是蹦

[复制链接]
85_avatar_middle
最佳答案
3 
在线会员 发表于 2019-3-18 21:45:16 | 显示全部楼层 |阅读模式
3驿站币
易语 转 C

易语代码  无任何问题
.版本 2

.子程序 work_WSA_s, , , 单独的任务
.局部变量 Overlapped, 整数型
.局部变量 NumberOfBytesTransferred, 整数型
.局部变量 CompletionKey, 整数型

.判断循环首 (真)
    .如果真 (GetQueuedCompletionStatus (s_iocp, NumberOfBytesTransferred, CompletionKey, Overlapped, -1))
        .如果真 (CompletionKey = -1)
            跳出循环 ()
        .如果真结束
        WSARecvFrom (s_sock, Overlapped + 20, 1, 0, 0, Overlapped + 28, 16, Overlapped, 0)

    .如果真结束

.判断循环尾 ()
----------------------------------------------------------------------------------
C代码
void work_WSA_s() {
        u_long NumberOfBytesTransferred;
        u_long CompletionKey;
        LPOVERLAPPED Overlapped = NULL;      

        while (TRUE) {
                if (GetQueuedCompletionStatus(s_iocp, &NumberOfBytesTransferred, &CompletionKey, &Overlapped, -1)) {
                        if (-1 == CompletionKey) {
                                break;
                        }
                        WSARecvFrom(s_sock, (WSABUF*)(&Overlapped + 20), 1, 0, 0, (SOCKADDR*)(&Overlapped + 28), 16, &Overlapped, 0);   
                        //这里 应该是带结构体 的指针参数不对 老是蹦    求大神指导
                }

        }
}

最佳答案

查看完整内容

调用下 WSAGetLastError 获取下错误码看看具体的错误信息是什么




上一篇:C++的递归调用?
下一篇:《实用C++》第19课的疑问!
51_avatar_middle
最佳答案
88 
online_admins 发表于 2019-3-18 21:45:17 | 显示全部楼层
调用下 WSAGetLastError 获取下错误码看看具体的错误信息是什么
85_avatar_middle
最佳答案
3 
ico_lz  楼主| 发表于 2019-3-18 21:57:59 | 显示全部楼层
&Overlapped + 20 是直接写的内存位置的数据,没用wsabuff结构体     &Overlapped + 28  对应 addr结构体起点内存     
Overlapped 一共48个字节 前20字节留给系统   
20  buflen   
24  lpbuf   
28  AF_INET  
30  port   
32  IP
44  Overlapped序号
85_avatar_middle
最佳答案
3 
ico_lz  楼主| 发表于 2019-3-18 23:30:13 | 显示全部楼层
感谢站长   好像发现问题了  是传入了自己制作的  "内存数据"  又去用LPOVERLAPPED Overlapped = NULL;  这个结构体接收  去满足VS2015的语法格式需要
长度结构都不一样  
请问站长自己制作的  "内存数据结构"   是直接传  无类型指针吗 ?
85_avatar_middle
最佳答案
3 
ico_lz  楼主| 发表于 2019-3-18 23:45:29 | 显示全部楼层
void * Overlapped=NULL  //定义初始

Overlapped+20   好像这个格式的参数过不了

强转后等效于 (u_int*)Overlapped+5   这个就没问题了

自己制作的 内存数据结构怎么用 无类型指针 表达过WSARecvFrom参数检查呀?


85_avatar_middle
最佳答案
3 
ico_lz  楼主| 发表于 2019-3-18 23:47:47 | 显示全部楼层
主要 用的是 VS 2015   问了朋友 他们用VS2017有个  "符合模式" 解决无类型指针加减计算不报错的问题    GCC编译也不报错 就VS2015不知道怎么设置
85_avatar_middle
最佳答案
3 
ico_lz  楼主| 发表于 2019-3-19 19:57:27 | 显示全部楼层
ANSI C 规定,不可以对void指针进行运算操作,因为我们不知道指针指向的数据类型大小,无法进行偏移;
但,
GNU规定,void指针的运算操作与char型保持一致;
因此,为了程序的可移植性,我们需要在处理void指针运算时一律转换为char型处理,例如:
void *p;
((char *)p)++;    //通过这种手段控制p的偏移

终于找到了 VOID*不能计算 的原因和处理方法了  C89不支持
85_avatar_middle
最佳答案
3 
ico_lz  楼主| 发表于 2019-3-24 22:51:35 | 显示全部楼层
结贴  直接原因是addrlen 应该是地址
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2021-9-21 14:16

Powered by CcTry.CoM

© 2009-2021 cctry.com

快速回复 返回顶部 返回列表