注册 登录
编程论坛 VFP论坛

吹佬 recv接收到的数据大了后后台 没了?

ljb8864 发布于 2023-08-13 14:22, 971 次点击
    * 接收到数据包
    PROCEDURE _RecvData
        LPARAMETERS _hSocket
        LOCAL szReadBuf, nDataLen
        szReadBuf = SPACE(32768)    && 32 * 1024
        nDataLen = recv(_hSocket, @szReadBuf, LEN(szReadBuf), 0)
        IF nDataLen > 0
            szReadBuf = LEFT(szReadBuf, nDataLen)
            this._OnRead(_hSocket, szReadBuf)
        ENDIF
        closesocket(_hSocket)
    ENDPROC

这里要加一个循环吗?

[此贴子已经被作者于2023-8-13 14:54编辑过]

13 回复
#2
吹水佬2023-08-13 15:48
“大了后后台 没了”什么意思
#3
ljb88642023-08-13 15:54
回复 2楼 吹水佬
如果POST  超过23*1024 就接收不到

还有一个问题,服务器接收到数据,能不能知道对方的IP
#4
吹水佬2023-08-13 17:18
以下是引用ljb8864在2023-8-13 15:54:59的发言:

如果POST  超过23*1024 就接收不到

还有一个问题,服务器接收到数据,能不能知道对方的IP

定义的数据缓冲是23*1024,不够可以加足够大。
IP在包头,这里socket用的协议不处理包头。
socket(AF_INET, SOCK_RAW, IPPROTO_IP),这个可以处理包头,现在不知还好不好使。
#5
ljb88642023-08-13 17:49
以下是引用吹水佬在2023-8-13 17:18:17的发言:


定义的数据缓冲是23*1024,不够可以加足够大。
IP在包头,这里socket用的协议不处理包头。
socket(AF_INET, SOCK_RAW, IPPROTO_IP),这个可以处理包头,现在不知还好不好使。




        stSockAddr = REPLICATE(0h00, 16)
        nSize      = LEN(stSockAddr)
        _hSocket = accept(_hSocket, @stSockAddr, @nSize)

stSockAddr这个有返回,怎么转化为字符中
#6
吹水佬2023-08-13 17:53
回复 5楼 ljb8864
0h00改用chr(0)
#7
ljb88642023-08-13 18:06
以下是引用吹水佬在2023-8-13 17:53:00的发言:

0h00改用chr(0)

stSockAddr =REPLICATE(CHR(0), 16) 还是乱码


这样的编码如何转化为IP
0200FAEFC0A80B0E0000000000000

每次执行会变,是不是内存变量?

[此贴子已经被作者于2023-8-13 21:07编辑过]

#8
吹水佬2023-08-13 21:09
sockaddr是结构体,使用不同的协议其含义不同。
参考:https://learn.
#9
ljb88642023-08-14 07:53
回复 8楼 吹水佬
struct sockaddr {
        ushort  sa_family;
        char    sa_data[14];
};

struct sockaddr_in {
        short   sin_family;
        u_short sin_port;
        struct  in_addr sin_addr;
        char    sin_zero[8];
};


DECLARE LONG inet_ntoa IN "Ws2_32" LONG
 SYS(2600,inet_ntoa (CTOBIN(SUBSTR(stSockAddr,5,4), "4RS") ) ,16)


LEFT(szIP, AT(0h00, szIP)-1)

---------------------------------------------------------------------
    * 取IP地址
    * SYS(2600, lpIP地址, 4)返回 in_addr 结构指针
    nIP = CTOBIN(SYS(2600, lpIP地址, 4), "4RS")
    * 转换成“.”分隔字串(xxx.xxx.xxx.xxx)
    * inet_ntoa()返回IP字符串指针
    szIP = SYS(2600, inet_ntoa(nIP), 16)
*!*        ?sz域名,szIP
   
    szIP = LEFT(szIP, AT(0h00, szIP)-1)

    nlen = ALEN(aIP) + 1
    DIMENSION aIP(nlen)
    aIP[nlen] = szIP


还是用如下取法
Substr(lpBuffer,lnOffs,4))

  Asc(Substr(lcBuffer,1,1))+;
        Asc(Substr(lcBuffer,2,1))*256+;
        Asc(Substr(lcBuffer,3,1))*65536+;
        Asc(Substr(lcBuffer,4,1))*16777216

[此贴子已经被作者于2023-8-14 09:05编辑过]

#10
吹水佬2023-08-14 09:27
这样看看应该可以理解
程序代码:

*    struct in_addr {
*        in_addr_t s_addr;    [color=#808080]//32位无符号整数[/color]
*    }
DECLARE long strlen    IN msvcrt long
DECLARE long inet_addr IN ws2_32 string    && in_addr_t inet_addr(const char* cp)
DECLARE long inet_ntoa IN ws2_32 long      && char*     inet_ntoa(struct in_addr)
ip = "192.168.1.2"
sin_addr = inet_addr(ip)
p = inet_ntoa(sin_addr)
? SYS(2600,p,strlen(p))
? TRANSFORM(BITAND(sin_addr,0xFF))               +"."+;
  TRANSFORM(BITAND(BITRSHIFT(sin_addr,8), 0xFF)) +"."+;
  TRANSFORM(BITAND(BITRSHIFT(sin_addr,16),0xFF)) +"."+;
  TRANSFORM(BITAND(BITRSHIFT(sin_addr,24),0xFF))
#11
ljb88642023-08-14 10:38
以下是引用吹水佬在2023-8-14 09:27:29的发言:

这样看看应该可以理解

*    struct in_addr {
*        in_addr_t s_addr;    //32位无符号整数
*    }
DECLARE long strlen    IN msvcrt long
DECLARE long inet_addr IN ws2_32 string    && in_addr_t inet_addr(const char* cp)
DECLARE long inet_ntoa IN ws2_32 long      && char*     inet_ntoa(struct in_addr)
ip = "192.168.1.2"
sin_addr = inet_addr(ip)
p = inet_ntoa(sin_addr)
? SYS(2600,p,strlen(p))
? TRANSFORM(BITAND(sin_addr,0xFF))               +"."+;
  TRANSFORM(BITAND(BITRSHIFT(sin_addr,8), 0xFF)) +"."+;
  TRANSFORM(BITAND(BITRSHIFT(sin_addr,16),0xFF)) +"."+;
  TRANSFORM(BITAND(BITRSHIFT(sin_addr,24),0xFF))




*!*           返回stSockAddr字符串,再转化为bin和指针地址
       lcsin_addr=SUBSTR(stSockAddr,5,4)  &&sin_family[2] +sin_port[2] + in_addr sin_addr[4] + sin_zero[8]
       lpIP=IIF(1=1,CTOBIN(lcsin_addr, "4RS")   , ;
                    Asc(Substr(lcsin_addr,1,1))*2^0 + Asc(Substr(lcsin_addr,2,1))*2^8+ ;
                    Asc(Substr(lcsin_addr,3,1))*2^16+ Asc(Substr(lcsin_addr,4,1))*2^24  )
*!*           lpIP = inet_addr("192.168.1.2") 返lcsin_addr = BINTOC(inet_addr(@szIP), "4RS");  

       szIP=SYS(2600,inet_ntoa ( lpIP ) ,16)
       szIP4=TRANSFORM(BITAND(BITRSHIFT(lpIP,0),0xFF)) +"."+ TRANSFORM(BITAND(BITRSHIFT(lpIP,8),0xFF)) +;
              "."+ TRANSFORM(BITAND(BITRSHIFT(lpIP,16),0xFF)) +"."+ TRANSFORM(BITAND(BITRSHIFT(lpIP,24),0xFF))

       ? LEFT(szIP, AT(CHR(0), szIP)-1) ,    szIP4




[此贴子已经被作者于2023-8-14 10:43编辑过]

#12
iswith2023-08-21 14:31
说实话VFP处理的这样的结构体除了C32.fll其它都是看不懂!
#13
ljb88642023-08-22 08:06
回复 12楼 iswith
32的结构是使用define class,你写一个用用
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2023-8-22 08:29编辑过]

#14
iswith2023-08-23 10:59
基本现在结构都是c32方便又直观,C32全部数据类型都有!你怕什么呢?到了VFP还有万能字符串M结构
1