WINSOCK问题 ,怎么通过IP连接

jiazhij 2003-10-15 03:59:19
刚下载了一段WINSOCK的PB程序,用了下却不知道怎么通过IP连接。

下面这段程序是用对方机器名连接的,shostname是机器名。
iHostent = ws.GetHostByName(sHostName)
if IsNull(iHostent) then
MessageBox("server: 错误","获得本地IP失败!")
return -1
end if

iret = sClient.WSAAsyncSelect(handle(this), 1024, ws.FD_CONNECT)
if iret = ws.SOCKET_ERROR then
messagebox(String(ws.WSAGetLastError()), "WSAAsyncSelect 错误!")
return -1
end if
messagebox('',string(ihostent.h_addr_list[1]))
iret = sClient.WsConnect(iHostent.h_addr_list[1], iPort)

ihostent.h_addr_list[1]并不是我机器的IP啊。

...全文
88 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
am2000 2003-10-28
  • 打赏
  • 举报
回复
Function Long InternetConnect(Long hInternetSession, String sServerName, Integer nServerPort, String sUsername,String sPassword, Long lService, Long lFlags, Long lContext) Library "wininet.dll" Alias For "InternetConnectA"
zsd_31 2003-10-27
  • 打赏
  • 举报
回复
用指定 IP 和 指定 端口 ,用起来比较方便。
hkzhou 2003-10-27
  • 打赏
  • 举报
回复
哦是 wsconnect(ulong remoteipaddr,integer iport)函数 不用在向结构写ip详细
hkzhou 2003-10-27
  • 打赏
  • 举报
回复
知道ip可以直接用winsock的函数inet_addr(string ipaddr)得到一个ulong的16进制地址
然后用connect函数连接就可以 .上面我的程序是服务器端的.目的是取本机的ip地址.然后bind一个端口 使得服务器监视自己的端口 以便接收请求.
我客户端使用winsock控件写的-:)当然也可以用winsock.pbl来写

xzg8848 2003-10-22
  • 打赏
  • 举报
回复
jdsnhan(柳荫凉)
那他所要的IP格式是什么样得呢?
-------------------------------------------------------------
ihostent是如下结构指针:
struct hostent {
char * h_name; //主机名
char * h_aliases[]; //以NULL结束的别名数组
short h_addrtype; //地址类型。对于Windows Socket 总是PF_INET
short h_length ; //地址长度(字节),对PF_INET,其为4,即(32Bit)
char * h_addr_list[]; //以NULL结束的主机地址表,以网络字节次表示
};
对于X86系统来说,它的字节存储顺序是低位在前高位在后,而TCP/IP网络要求地址的表示是是顺序的,所以要先将机器的32位IP地址转化为网络要求的32位地址。
ihostent.h_addr_list[1]中放的是32位网络地址,当然,还要转化为字符类型。
jdsnhan 2003-10-21
  • 打赏
  • 举报
回复
sorry,忘记了楼主的东东是down下来的。你把ip全部补成3位,不足以零代替试试。
jdsnhan 2003-10-21
  • 打赏
  • 举报
回复
那他所要的IP格式是什么样得呢?
xzg8848 2003-10-21
  • 打赏
  • 举报
回复
你用的这个控件我不清楚,但如果它是一个完善的SCOK控件,应该有似类似ulong inet_addr(char * )这样的函数,用于将一个带点字符串表示的网络IP地址转化为以网络字节次序表示的网络地址。
jiazhij 2003-10-17
  • 打赏
  • 举报
回复
这个问题是这样的:
我不知道对方的机器名,但是知道对方的IP。
我只能输入IP地址再用程序连接,但是我发现ihostent.h_addr_list[1]中的内容我看不懂,我不知道怎么样把我的IP格式转化为他所要的格式。如"192.168.16.111" 直接把这个字符串写到ihostent.h_addr_list[1]中系统无法连接这个IP。
jiazhij 2003-10-17
  • 打赏
  • 举报
回复
jiazhij@sina.com
ropriest 2003-10-16
  • 打赏
  • 举报
回复
倒是这个包处理起来比较麻烦!
ropriest 2003-10-16
  • 打赏
  • 举报
回复
winsock连接应该是很简单的事情,只要知道服务器的ip和端口就行了。一般可以将这两个参数加密后放到*.ini文件或者直接放到数据库中,
取出参数后
ole_ws.object.Connect(is_serverip,is_serverport)
if ole_ws.object.state <> 7 then
messagebox("信息","服务器连接失败!")
return
end if

将要发送的指令传到一个blob类型的tcp包中然后在winsock的ocx_connect中
SendData(lb_cmd)

在winsock的dataarrival事件中写上sock包返回值处理等就可以了。

hkzhou 2003-10-16
  • 打赏
  • 举报
回复
有一篇具体关于tcp/ip for pb编程的文章
把邮箱告诉我 我发给你
hkzhou 2003-10-16
  • 打赏
  • 举报
回复
string ls_hostname,ls_hostaddr
integer li_port
integer li_flag

integer li_event
li_connectnum=1
ls_hostname=space(64)
dw_1.settransobject(sqlca)
dw_1.retrieve()
gi_socknum=0
integer i
gs_ws.gethostname(ref ls_hostname,len(ls_hostname))
gs_hostinfo=gs_ws.gethostbyname(ls_hostname)
if isnull(gs_hostinfo)=false then
lu_addr=gs_hostinfo.h_addr_list[1]
ls_hostaddr=gs_ws.inet_ntoa(lu_addr)
li_port=profileint("server.ini","server information","localport",-1)
li_flag= gs_sockstream.bind(lu_addr,li_port)
li_flag=gs_sockstream.listen(gi_num)
if (li_flag<0 )then
mle_1.text = mle_1.text + '~r~n' + '系统消息:监听失败!'
return
end if
end if
li_event=gs_ws.FD_ACCEPT
li_return=gs_sockstream.wsaasyncselect(handle(this),1024,li_event)
if li_return<0 then
mle_1.text=mle_1.text+'~r~n'+'[系统消息]:监听连接失败!'
return
else
mle_1.text=mle_1.text+'~r~n'+'[系统消息]:监听连接成功!'
end if
______________________________________________
我写的tcp/ip程序部分代码
ropriest 2003-10-16
  • 打赏
  • 举报
回复
连接需要服务器的ip,而不需要本机的ip吧!

flyhot 2003-10-16
  • 打赏
  • 举报
回复
up
xzg8848 2003-10-16
  • 打赏
  • 举报
回复
ihostent.h_addr_list[1]中放的是以NULL结束的shostname的地址,它是以网络字节顺序表示的,而不是以机器字节顺序表示的。
「已注销」 2003-10-15
  • 打赏
  • 举报
回复
看不懂 好象搞复杂了

建议发布个版本 让大家帮你调试一下

1,076

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 相关问题讨论
社区管理员
  • 基础类社区
  • WorldMobile
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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