注册 登录
编程论坛 VFP论坛

利用winsock,协议类型upd,在A 电脑上发送消请教息,B电脑接收消息,大部电脑正常,个别电脑收不到?

wxzd123 发布于 2025-10-18 14:42, 273 次点击
请教利用winsock,协议类型upd,在A 电脑上发送消息,B电脑接收消息,大部电脑正常,个别电脑收不到?代码应该没有问题,应该个别电脑系统问题,从那些方面找原因?有什么工具测试修改吗?谢谢
10 回复
#2
sam_jiang2025-10-18 17:56
upload your code
#3
wxzd1232025-10-18 21:10
回复 2楼 sam_jiang 老师源代码
只有本站会员才能查看附件,请 登录
#4
sam_jiang2025-10-18 22:31
看了你的代码,你没有bind一个端口,也就是说,你可以向192.168.31.110 的58001 端口发送数据,udp协议是不管对方有没有接收的,发过去就完了。

对方电脑如果运行了同样的程序,是没有办法发送或接收的。

假设A电脑的ip是192.168.31.10,那么你应该bind 58002端口,remoteport=58001,

那么另外一台电脑的IP地址192.168.31.110,它应该bind 58001 端口,romoteport=58002。

这样,这两台电脑就可以通讯了。
#5
wxzd1232025-10-19 08:40
udp=Val(Filetostr("udp.txt"))
Thisform.sock1.Object.Bind(udp)
老师这个不是吗?这样设置不对吗
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录
两个电脑都可以互相发送接收
#6
sam_jiang2025-10-19 20:45
你的form的init事件,这里绑定的端口和远程端口居然是同一个端口???
看你用了2个winsock控件,其实一个便够了。

udp=Val(Filetostr(LOCFILE("udp.txt"))) &&58001
ip=Filetostr(LOCFILE("ip.txt"))
ip1=Left(ip,Rat(".",ip)-1)+".255"
Thisform.sock1.Object.Bind(udp)
Thisform.fs.Object.RemoteHost=ip1 &&要连接的远程计算机的名称或IP地址 字符    否送字符
Thisform.fs.Object.RemotePort=udp  &&设置要连接的远程端口号   数字
PUBLIC cs
cs=1
thisform.Tag='jj'
Set Library To myFll
ThisForm.Label7.Caption =GetLocalIP()

ThisForm.Label8.Caption=Getwordnum(CURDIR(),(OCCURS('\',CURDIR()))-1,'\')+'IP:'


创建一个UDP应用程序比创建TCP程序更简单,因为UDP协议不需要一个确定的连接。

UDP协议不需要明确的连接。要在2个控件之间传送数据,(连接的双方)必须完成三个步骤:

·确定远程主机属性为对方的计算机名;
·确定远程主机属性为第二个控件的本地端口属性;
·调用约定方法指定要被使用的本地端口。

你可以参考这篇文章,希望对你有帮助!
https://

[此贴子已经被作者于2025-10-19 20:47编辑过]

#7
wxzd1232025-10-19 20:57
谢谢sam_jiang的指导,除了关闭防火墙和一些防护软件外还需要注意什么?
#8
sam_jiang2025-10-19 22:21
回复 7楼 wxzd123
跟防火墙什么安全软件没有关系吧?
还有,确保2台电脑在同一个局域网里面。。。

给你个示例在电脑A运行:
程序代码:

**************************************************
*-- Form:         form1 (d:\documents\visual foxpro 项目\udptest1.scx)
*-- 父类:  form
*-- 基类:    form
*-- 时间戳:   10/19/25 10:12:05 PM
*
DEFINE CLASS form1 AS form


    Top = 0
    Left = 0
    DoCreate = .T.
    Caption = "本地端口58002"
    Name = "Form1"


    ADD OBJECT olecontrol1 AS olecontrol WITH ;
        Top = 12, ;
        Left = 324, ;
        Height = 100, ;
        Width = 100, ;
        Name = "Olecontrol1"


    ADD OBJECT label1 AS label WITH ;
        AutoSize = .T., ;
        Caption = "远程ip:", ;
        Height = 16, ;
        Left = 12, ;
        Top = 15, ;
        Width = 50, ;
        Name = "Label1"


    ADD OBJECT text1 AS textbox WITH ;
        Value = 192.168.1.7, ;
        Height = 20, ;
        Left = 72, ;
        Top = 12, ;
        Width = 100, ;
        Name = "Text1"


    ADD OBJECT label2 AS label WITH ;
        AutoSize = .T., ;
        Caption = "远程端口:", ;
        Height = 16, ;
        Left = 12, ;
        Top = 51, ;
        Width = 62, ;
        Name = "Label2"


    ADD OBJECT text2 AS textbox WITH ;
        Alignment = 3, ;
        Value = 58001, ;
        Height = 20, ;
        Left = 72, ;
        Top = 48, ;
        Width = 100, ;
        Name = "Text2"


    ADD OBJECT label3 AS label WITH ;
        AutoSize = .T., ;
        Caption = "本地ip:", ;
        Height = 16, ;
        Left = 12, ;
        Top = 88, ;
        Width = 50, ;
        Name = "Label3"


    ADD OBJECT text3 AS textbox WITH ;
        Value = 192.168.1.7, ;
        Height = 20, ;
        Left = 72, ;
        Top = 85, ;
        Width = 100, ;
        Name = "Text3"


    ADD OBJECT label4 AS label WITH ;
        AutoSize = .T., ;
        Caption = "本地端口:", ;
        Height = 16, ;
        Left = 12, ;
        Top = 124, ;
        Width = 62, ;
        Name = "Label4"


    ADD OBJECT text4 AS textbox WITH ;
        Alignment = 3, ;
        Value = 50082, ;
        Height = 20, ;
        Left = 72, ;
        Top = 121, ;
        Width = 100, ;
        Name = "Text4"


    ADD OBJECT edit1 AS editbox WITH ;
        Height = 84, ;
        Left = 12, ;
        Top = 156, ;
        Width = 228, ;
        Name = "Edit1"


    ADD OBJECT command1 AS commandbutton WITH ;
        Top = 168, ;
        Left = 288, ;
        Height = 25, ;
        Width = 73, ;
        Caption = "发  送", ;
        Name = "Command1"


    PROCEDURE olecontrol1.DataArrival
        *** ActiveX 控件事件 ***
        LPARAMETERS bytestotal
        cdata=REPLICATE(CHR(0),bytestotal)
        this.object.getData(@cdata)
        thisform.edit1.Value="收到数据:"+CHR(13)
        thisform.edit1.Value=thisform.edit1.Value+cdata
    ENDPROC


    PROCEDURE olecontrol1.Init
        this.obJECT.Bind(58002)
    ENDPROC


    PROCEDURE command1.Click
        IF !EMPTY(thisform.edit1.Value)
            thisform.olecontrol1.remoteHost=thisform.text1.value
            thisform.olecontrol1.object.SendData(thisform.edit1.Value)
            thisform.edit1.Value=""
        ENDIF

    ENDPROC


ENDDEFINE
*
*-- EndDefine: form1
**************************************************


另外一个例子在电脑B运行:
程序代码:

**************************************************
*-- Form:         form1 (d:\documents\visual foxpro 项目\udptest2.scx)
*-- 父类:  form
*-- 基类:    form
*-- 时间戳:   10/19/25 10:12:06 PM
*
DEFINE CLASS form1 AS form


    Top = 0
    Left = 0
    DoCreate = .T.
    Caption = "本地端口58001"
    Name = "Form1"


    ADD OBJECT olecontrol1 AS olecontrol WITH ;
        Top = 12, ;
        Left = 324, ;
        Height = 100, ;
        Width = 100, ;
        Name = "Olecontrol1"


    ADD OBJECT label1 AS label WITH ;
        AutoSize = .T., ;
        Caption = "远程ip:", ;
        Height = 16, ;
        Left = 12, ;
        Top = 15, ;
        Width = 50, ;
        Name = "Label1"


    ADD OBJECT text1 AS textbox WITH ;
        Value = 192.168.1.7, ;
        Height = 20, ;
        Left = 72, ;
        Top = 12, ;
        Width = 100, ;
        Name = "Text1"


    ADD OBJECT label2 AS label WITH ;
        AutoSize = .T., ;
        Caption = "远程端口:", ;
        Height = 16, ;
        Left = 12, ;
        Top = 51, ;
        Width = 62, ;
        Name = "Label2"


    ADD OBJECT text2 AS textbox WITH ;
        Alignment = 3, ;
        Value = 58002, ;
        Height = 20, ;
        Left = 72, ;
        Top = 48, ;
        Width = 100, ;
        Name = "Text2"


    ADD OBJECT label3 AS label WITH ;
        AutoSize = .T., ;
        Caption = "本地ip:", ;
        Height = 16, ;
        Left = 12, ;
        Top = 88, ;
        Width = 50, ;
        Name = "Label3"


    ADD OBJECT text3 AS textbox WITH ;
        Value = 192.168.1.7, ;
        Height = 20, ;
        Left = 72, ;
        Top = 85, ;
        Width = 100, ;
        Name = "Text3"


    ADD OBJECT label4 AS label WITH ;
        AutoSize = .T., ;
        Caption = "本地端口:", ;
        Height = 16, ;
        Left = 12, ;
        Top = 124, ;
        Width = 62, ;
        Name = "Label4"


    ADD OBJECT text4 AS textbox WITH ;
        Alignment = 3, ;
        Value = 58001, ;
        Height = 20, ;
        Left = 72, ;
        Top = 121, ;
        Width = 100, ;
        Name = "Text4"


    ADD OBJECT edit1 AS editbox WITH ;
        Height = 84, ;
        Left = 12, ;
        Top = 156, ;
        Width = 228, ;
        Name = "Edit1"


    ADD OBJECT command1 AS commandbutton WITH ;
        Top = 168, ;
        Left = 288, ;
        Height = 25, ;
        Width = 73, ;
        Caption = "发  送", ;
        Name = "Command1"


    PROCEDURE olecontrol1.DataArrival
        *** ActiveX 控件事件 ***
        LPARAMETERS bytestotal
        cdata=REPLICATE(CHR(0),bytestotal)
        this.object.getData(@cdata)
        thisform.edit1.Value="收到数据:"+CHR(13)
        thisform.edit1.Value=thisform.edit1.Value+cdata
    ENDPROC


    PROCEDURE olecontrol1.Init
        this.object.Bind(58001)
    ENDPROC


    PROCEDURE command1.Click

        IF !EMPTY(thisform.edit1.Value)
            thisform.olecontrol1.remoteHost=thisform.text1.value
            thisform.olecontrol1.object.SendData(thisform.edit1.Value)
            thisform.edit1.Value=""
        ENDIF

    ENDPROC


ENDDEFINE
*
*-- EndDefine: form1
**************************************************


你参考我的dataarrival事件,init事件,发送按钮的click事件,以及初始化olecontrol的init事件,查看一下你的问题在哪里吧。

[此贴子已经被作者于2025-10-19 22:27编辑过]

#9
wxzd1232025-10-20 09:50
好,谢谢老师的帮。
如果防火墙打开时,不能接收可以发送
#10
yiyanxiyin2025-10-20 10:32
建议:ping得通不能说明端口畅通, ping不通也不能说明网络不通,  ping通不通只能提供一个参考, 不能写什么"恭喜您"
#11
wxzd1232025-10-20 13:34
有道理
1