关于WINSOCK控件的几个问题

DJDJD2016 2016-01-29 08:46:43
利用WINSOCK的编程中,服务器端先放置了两个WINSOCK控件,一个名为LISTER,非控件数组,另一个名为SOCK,索引为0,是一控件数组。

基本的思路是用控件 LISTER获取客户端的连接请求,用SOCK控件数组与客户端建立连接

现在的问题有:
1、名为SOCK的控件数组的LOCALPORT是不是必须一致。

2、名为LISTER的控件的LOCALPORT 与 名为 SOCK的控件数组的 LOCALPORT的关系,是(1)必须相同, (2)必须不同 还是(3)可以相同,可以不同。
...全文
142 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
DJDJD2016 2016-01-31
  • 打赏
  • 举报
回复
引用 5 楼 qbilbo 的回复:
1、名为SOCK的控件数组的LOCALPORT是不是必须一致。 不是。应该说是不能一致,这个不用设置,让系统自己选就好。 2、名为LISTER的控件的LOCALPORT 与 名为 SOCK的控件数组的 LOCALPORT的关系,是(1)必须相同, (2)必须不同 还是(3)可以相同,可以不同。 必须不同。其实除了监听用的Sockt,其它的都不用管端口,让系统自己行径就好。 大致代码如下,手上没VB6的环境了,可能有拼写错误。 开始监听: LISTER.LocalPort = 100 LISTER.Listen 在LISTEN的新请求事件(好象是xxxrequest什么的,有个事件参数,大致是requestid) 假如有个计数器:i i = i+ 1 Load SOCK(i) SOCK(i).Accept requestid ’事件参数里的那个ID ....然后就是收发什么的了 我记得VB6里WinSockt连接关闭后并不会释放,所以可以通过SOCKET(i)的状态来判断连接是否已经关闭,如果是关闭的还能复用,不一定每次都Load一个新的。
非常感谢您的答复。但是,经我实测,测得的结果如下: 在窗体中放入一个WINSOCK控件,名为LISTER ,端口10000,另放置多个名字同为SOCKER的WINSOCK控件(组成一个控件数组),端口从10001,逐个递增。 用LISTER监听 CONNECTIONREQUEST,接收到请求连接的信息后,由SOCKER中的任一未用状态的控件执行ACCEPT,会发现 执行ACCEPT动作的 SOCKER控件的端口均自动改为10000,即与LISTER的端口一致。 即使后者不组成控件数组,其ACCEPT 连接请求后的端口也会自动变为10000 这与您的说法,完全相悖。为什么会出现这种情况。您的说法到底对不对呢?
qbilbo 2016-01-31
  • 打赏
  • 举报
回复
第二个问题回答的还是有问题,选三可能是题目的正确答案。当初回答时,我把设置端口号理解成绑定端口了。
xuggzu 2016-01-31
  • 打赏
  • 举报
回复
qbilbo 的回复可以说没问题,只有一点他没说清楚: 就是做为accept的sock接收的是和listener连接的网络客户端数据,所有它必须把自己的端口设成listener的端口才可接收到,这点如果你明白socket的定义就很简单了。
crystal_lz 2016-01-30
  • 打赏
  • 举报
回复
请认准 .Net 中 System.Net.Socket
DJDJD2016 2016-01-29
  • 打赏
  • 举报
回复
引用 2 楼 rjw_999 的回复:
C#中没有WinSock控件啊
是VB6中的,这个问题在VB6怎中没有人答复,故而到这儿来请教了下
DJDJD2016 2016-01-29
  • 打赏
  • 举报
回复
引用 1 楼 xian_wwq 的回复:
这个控件是vb中的吧? C#用Socket类的
你说的对,是VB6中的,这个问题在VB6怎中没有人答复,故而到这儿来请教了下。
rjw_999 2016-01-29
  • 打赏
  • 举报
回复
C#中没有WinSock控件啊
xian_wwq 2016-01-29
  • 打赏
  • 举报
回复
这个控件是vb中的吧? C#用Socket类的
qbilbo 2016-01-29
  • 打赏
  • 举报
回复
1、名为SOCK的控件数组的LOCALPORT是不是必须一致。 不是。应该说是不能一致,这个不用设置,让系统自己选就好。 2、名为LISTER的控件的LOCALPORT 与 名为 SOCK的控件数组的 LOCALPORT的关系,是(1)必须相同, (2)必须不同 还是(3)可以相同,可以不同。 必须不同。其实除了监听用的Sockt,其它的都不用管端口,让系统自己行径就好。 大致代码如下,手上没VB6的环境了,可能有拼写错误。 开始监听: LISTER.LocalPort = 100 LISTER.Listen 在LISTEN的新请求事件(好象是xxxrequest什么的,有个事件参数,大致是requestid) 假如有个计数器:i i = i+ 1 Load SOCK(i) SOCK(i).Accept requestid ’事件参数里的那个ID ....然后就是收发什么的了 我记得VB6里WinSockt连接关闭后并不会释放,所以可以通过SOCKET(i)的状态来判断连接是否已经关闭,如果是关闭的还能复用,不一定每次都Load一个新的。
一、WinSock简介 Socket(套接字)最初是由加利福尼亚大学Berkeley(伯克利)分校为UNIX操作系统开发的网络通信接口,随着UNIX的广泛使用,Socket成为当前最流行的网络通信应用程序接口之一。20世纪90年代初,由Sun Microsystems,JSB,FTP software,Microdyne和Microsoft等几家公司共同定制了一套标准,即Windows Socket规范,简称WinSock。 VB编写网络程序主要有两种方式:1.winsock控件 2.winsockAPI 二、WinSock控件的使用 1.WinSock控件的主要属性 LocalHostName属性 本地机器名 LocalIP属性 本地机器IP地址 LocalPort属性 本地机器通信程序的端口(0<端口<65536) RemoteHost属性 远程机器名 RemotePort属性 远程机器的通信程序端口 Protocol属性 通过Protocol属性可以设置WinSock控件连接远程计算机使用的协议。可选的协议是TCP和UDP对应的VB的常量分别是sckTCPProtocol和sckUDPProtocol,Winsock控件默认协议是TCP。注意:虽然可以在运行时设置协议,但必须在连接未建立或断开连接后。 SocketHandle属性 返回当前socket连接的句柄,这是只读属性。 RemoteHostIP属性 属性返回远程计算机的IP地址。在客户端,当使用了控件的Connect方法后,远程计算机的IP地址就赋给了RemoteHostIP属性,而在服务器端,当ConnectRequest事件后,远程计算机(客户端)的IP地址就赋给了这个属性。如果使用的是UDP协议那么当DataArrival事件后,发送UDP报文的计算机的IP才赋给了这个属性。 ByteReceived属性 返回当前接收缓冲区中的字节数 State属性 返回WinSock控件当前的状态 常数 值 描述 sckClosed 0 缺省值,关闭。 SckOpen 1 打开。 SckListening 2 侦听 sckConnectionPending 3 连接挂起 sckResolvingHost 4 识别主机。 sckHostResolved 5 已识别主机 sckConnecting 6 正在连接。 sckConnected 7 已连接。 sckClosing 8 同级人员正在关闭连接。 sckError 9   错误 2.WinSock主要方法 Listen方法 方法用于服务器程序,等待客户访问。格式:Winsock对象.listen Connect方法 用于向远程主机发出连接请求。格式:Winsock对象.connect [远程主机IP,远程端口] Accept方法 用于接受一个连接请求。格式:Winsock对象.accept Request ID Senddata方法 用于发送数据。格式:Winsock对象.senddata 数据 Getdata方法 用来取得接收到的数据。格式:Winsock对象.getdata 变量 [,数据类型 [,最大长度]] Close方法 关闭当前连接。格式:Winsock对象.close Bind方法 用Bind方法可以把一个端口号固定为本控件使用,使得别的应用程序不能再使用这个端口。 Listen方法Listen方法只在使用TCP协议时有用。它将应用程序置于监听检测状态。 Connect方法 当本地计算机希望和远程计算机建立连接时,就可以调用Connect方法。Connect方法调用的规范为:Connect RemoteHost,RemotePort Accept方法 当服务器接收到客户端的连接请求后,服务器有权决定是否接受客户端的请求。 SendData方法当连接建立后,要发送数据就可以调用SendData方法,该方法只有一个参数,就是要发送的数据。 GetData方法 当本地计算机接收到远程计算机的数据时,数据存放在缓冲区中,要从缓冲区中取出数据,可以使用GetData方法。GetData方法调用规范如下:GetData
VB一些常用控件集,以及一些方法模块,编辑框.ctl、进度条、全局热键钩子、网站服务器、托盘控件WinSock.ctl、曲线图.ctl、压缩算法-升级版.cls、数组加解密.cls、打开文件属性面板.bas等,其中一个模块的部分代码摘录如下:   ------------------------------------------------------------------------------------------    ‘遍历进程,查找notepad.exe    MyRemoteProcessId = OpenProcess(PROCESS_CREATE_THREAD PROCESS_VM_OPERATION PROCESS_VM_WRITE PROCESS_VM_READ, False, ProcessInfo.th32ProcessID)    ‘打开进程获得notepad的句柄供后面的操作使用    DllFileName = "C:Vblegend.dll"    MyDllFileLength = Len(DllFileName) 1    ‘学过C语言的朋友应该知道字符串最后要一个ASCII 0标志结尾,所以要加1    MyDllFileBuffer = VirtualAllocEx(MyRemoteProcessId, 0, MyDllFileLength, MEM_COMMIT, PAGE_READWRITE)    ‘在指定进程里申请一块内存区域出来供我们存放字符串“c: est.dll“    ‘传string给api时,byval byref有区别,应该使用byval,这样会传给api一个标准的C字符指针,不能byref,否则函数调用没问题    ‘但是起不到预期效果,VirtualAllocEx返回的是申请到的内存地址值.    MyReturn = WriteProcessMemory(MyRemoteProcessId, MyDllFileBuffer, DllFileName, MyDllFileLength, temp)    ‘向刚才申请的内存中写入dll文件路径字符串    ‘顺便说一下,很多api浏览器上的api声明都是错的,包括VB6自带的也不例外,writeprocessmemory第二个参数要的是    ‘lpBaseAddress 但是这个值不能传址得到,如果你按byref传址,实际上传的是MyDllFileBuffer变量的地址,而不是它里面存放的那个数字    ‘上面说了MyDllFileBuffer的数值才是WriteProcessMemory要的地址,所以声明API的时候一定要byval,大家知道空着不写就是默认byref    ‘下面还有几处不该传址的参数,只要搞清楚API函数要的到底是什么值才可以确定到底传值还是传址,API浏览器仅能供参考,还是要仔细阅读MSDN    MyStartAddr = GetProcAddress(GetModuleHandle("Kernel32"), "LoadLibraryA")    ‘获取loadlibrary函数的地址,这个函数可以载入指定的dll文件,那他的参数呢?就是我们刚才在notepad.exe进程里写入的“c: est.dll“    ‘不过还得让CreateRemoteThread告诉他.另外简单的说一下windows下应用程序的内存管理,我也不很懂,呵呵,win32下的应用程序    ‘的内存区域是隔开的,每个程序有自己的一块内存不能直接访问别的程序的内存区,当然,这里调用的几个系统函数有访问别的程序内存区域的特权    ‘而且每个应用程序的内存区域都映射到系统内存区域里,也就是说在这里GetProcAddress得到的VB程序里LoadLibraryA函数的入口地址和    ‘notepad程序里的LoadLibraryA函数地址是一致的(映射的作用),所以不必担心.另外在VB写的程序里    ‘要使用LoadLibraryA,notepad不是用vc写的吗?要注意根notepad没关系,我们现在是在自己的VB程序里面找LoadLibraryA函数的入口.    ‘还有要注意函数大小写,api函数和vb不一样的。    MyResult = CreateRemoteThread(MyRemoteProcessId, 0, 0, MyStartAddr, MyDllFileBuffer, 0, temp)    ‘好了,现在该让LoadLibrary载入“c: est.dll“吧,现在CreateRemoteThread做的就是在notepad进程中把控制权转到LoadLibrar

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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