HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
0430
ポチNTPサーバーによる時刻動機5解決


ポチ

リンク

2011/4/30(Sat) 23:34:31|NO.38803

現在ランチャーを作っています。
機能にNTPサーバーによる時刻同期を付けたいのですが、
未熟なモノで自力でスクリプトを作る事が出来ず、引用させて頂いています。
http://blog.goo.ne.jp/hiro239415/e/c426a545863921a13a9d6a70b7ae4484
時刻を合わせた後ランチャーを終了させずに切断したいのですが上手く行きません。
心優しい方・・・修正をお願い致します。



screen 0,300,150:title "ランチャ" objsize 100,50 pos 0 ,0 :button "メモ帳",*notepad pos 100,0 :button "ペイント",*paint pos 200,0 :button "タスクマネージャー",*task pos 0 ,50:button "電卓",*calc pos 100,50 :button "ゴミ箱を空にする",*recycle pos 200,50:button "日付と時刻",*date pos 0,100: button "プログラムと機能",*uninst pos 100,100:button "時刻合わせ",*ajust pos 200,100:button "終了",*owari stop *notepad;メモ帳を起動する exec "notepad.exe" stop *paint;ペイントを起動する exec "mspaint.exe" stop *calc;電卓を起動する exec "calc.exe" stop *task;タスクマネージャーを起動する exec "taskmgr.exe" stop *recycle;ゴミ箱を空にする ※ スクリプトが長くなるため一部省略しています。 stop *date;日付と時刻 stop *uninst;プログラムと機能 stop *ajust;時刻合わせ #define PORT 123 #define SOCK_DGRAM 2 #define AF_INET 2 #define FD_MESSAGE 0x33 #define FD_EVENT 0x5000 #define WM_TIMER 0x0113 #define WM_CLOSE 0x0010 #define ID_TIMER 0x6000 #uselib "Ws2_32.dll" #cfunc WSAStartup "WSAStartup" int , sptr #cfunc socket "socket" int,int,int #cfunc inet_addr "inet_addr" sptr #cfunc gethostbyname "gethostbyname" sptr #cfunc connect "connect" int,sptr,int #cfunc send "send" int,sptr,int,int #cfunc recv "recv" int,sptr,int,int #cfunc WSAAsyncSelect "WSAAsyncSelect" int,int,int,int #func shutdown "shutdown" int,int #func closesocket "closesocket" int #func WSACleanup "WSACleanup" #cfunc WSAGetLastError "WSAGetLastError" #cfunc htons "htons" int #cfunc ntohl "ntohl" int #uselib "crtdll.dll" #cfunc localtime "localtime" sptr #cfunc asctime "asctime" sptr #uselib "kernel32.dll" #func SetLocalTime "SetLocalTime" sptr #uselib "user32.dll" #cfunc SetTimer "SetTimer" int,int,int,sptr #cfunc KillTimer "KillTimer" int,int sdim host,260 sdim hostname,260 dim tflag : tflag=0 host="eric.nc.u-tokyo.ac.jp" hostname=host sdim WSAData,400 ret=WSAStartup(0x0101, varptr(WSAData)) if ret!=0{ dialog "WSAStartup error",,"stop" gosub *closesoc } gosub *SVconnect oncmd gosub *FDEVENT,FD_EVENT oncmd gosub *closesoc,WM_CLOSE oncmd gosub *TIMER,WM_TIMER gosub *SetTime stop *FDEVENT if wparam==soc{ if lparam>>16==0{ ret=lparam&0xffff switch ret case 0x0001 //FD_READ gosub *SVrecv swbreak case 0x0020 //FD_CLOSE gosub *closesoc swbreak default swbreak swend } } stop return *SVsocket soc=socket(AF_INET, SOCK_DGRAM, 0) if soc == 0{ gosub *closesoc dialog "socket error",,"stop" stop } return *SVconnect gosub *SVsocket dim svaddr sdim hostent, 16 svaddr=inet_addr(varptr(hostname)) if svaddr==-1{ ret=gethostbyname(varptr(hostname)) if ret{ dupptr svaddr,ret+12,4 dupptr ret,svaddr,4 dupptr svaddr,ret,4 } else{ gosub *closesoc dialog "gethostbyname error" return } } sdim sockaddr, 16 wpoke sockaddr, 0, AF_INET wpoke sockaddr, 2, htons(PORT) lpoke sockaddr, 4, svaddr if connect(soc, varptr(sockaddr), 16)==-1{ gosub *closesoc dialog "connect error" return } ret=WSAAsyncSelect(soc,hwnd,FD_EVENT,FD_MESSAGE) if ret!=0:dialog "WSAAsyncSelect error",,"stop":stop ret=SetTimer(hwnd,ID_TIMER,5000,0) return *SVsend dim NTP_SEND, 12 NTP_SEND(0) = 11;htonl(0x0B000000) ret=send(soc,varptr(NTP_SEND),48) if ret != 48{ gosub *closesoc dialog "send error" return } return *SVrecv dim NTP_RECV , 12 if recv(soc, varptr(NTP_RECV) ,48 ,0)==48{ dim t dim tm,9 ret=ntohl(NTP_RECV(10))-2208988800 dupptr tm,localtime(varptr(ret)),36 pos 50,50:tm(5)+=1900:tm(4)++ if tflag==1{ sdim systime,16 wpoke systime,0,tm(5):wpoke systime,2,tm(4) wpoke systime,6,tm(3):wpoke systime,8,tm(2) wpoke systime,10,tm(1):wpoke systime,12,tm(0) SetLocalTime(varptr(systime)) tflag=0 } dupptr tm,ret,36 dialog ""+gettime(0)+"/"+gettime(1)+"/"+gettime(3)+" \n"+gettime(4)+":"+gettime(5)+":"+gettime(6)+"\nに変更しました。" gosub *closesoc WSACleanup } return *TIMER gosub *SVsend return *SetTime tflag=1 gosub *SVsend return *closesoc ret=KillTimer(hwnd,ID_TIMER) shutdown soc,2 ret=WSAAsyncSelect(soc,hwnd,0,0) closesocket soc return *owari;プログラムを終了する end



この記事に返信する


ポチ

リンク

2011/4/30(Sat) 23:56:59|NO.38804

訂正です。

× "NTPサーバーによる時刻動機"
○ "NTPサーバーによる時刻同期"

大変失礼しました。



ORZ

リンク

2011/5/1(Sun) 08:37:22|NO.38809

closesocketっていう単語が入ってるので切断処理はしてるんじゃない?
うまくいきません、とだけ書かれても我々はエスパーではないので具体的にどのような
状態になっているのか、どんなエラーが出るのか君の思念波を感じることができない。
どのような状態になっているのか詳しく書きましょう。



skyblue

リンク

2011/5/1(Sun) 10:40:23|NO.38810

*ajust で時刻同期が正常に終わった後
WSACleanupが実行されていないように見えるのですけど気のせいですか?



nue

リンク

2011/5/1(Sun) 11:37:43|NO.38811

SNTPは本来ミリ秒とかの細かい単位で同期するもので通信にかかる時間なんかも考慮するんだが、
このやり方だとSNTPの意味がないようなきがする
秒単位で時刻を取得するならSNTPでなく、以下のTPを使ったやりかたで十分と思うので,*adjust以下をごっそりこれに
すり替えればやりたいことはできると思います。
どうしても元のスクリプトをいかしたいならまた考えますが。

//Time Protocol(RFC868) #include "hspsock.as" #uselib "crtdll.dll" #cfunc localtime "localtime" sptr #uselib "kernel32.dll" #func SetLocalTime "SetLocalTime" sptr hostname="ntp.sut.ac.jp" sockopen 0,hostname,37 if stat:dialog hostname+"に接続できませんでした":stop sockgetb time,0,4,0 if stat<4:dialog hostname+"から時刻を受信できませんでした":stop sockclose 0 time=(time<<24|(time<<8&$ff0000)|(time>>8&$ff00)|(time>>24&$ff))-2208988800 dupptr tm,localtime(varptr(time)),36 tm(5)+=1900:tm(4)++ sdim systime,16 wpoke systime,0,tm(5):wpoke systime,2,tm(4) wpoke systime,6,tm(3):wpoke systime,8,tm(2) wpoke systime,10,tm(1):wpoke systime,12,tm(0) SetLocalTime (varptr(systime)) dialog ""+gettime(0)+"/"+gettime(1)+"/"+gettime(3)+" \n"+gettime(4)+":"+gettime(5)+":"+gettime(6)+"\nに変更しました。" stop



ポチ

リンク

2011/5/1(Sun) 13:21:38|NO.38815

nueさま、ありがとうございます。
HSPsockを使って、まさこの様にしたかったのです。
しかも簡潔で無駄がない。
もう感激です。

本当にどうも有難うございます!!



ONION software Copyright 1997-2021(c) All rights reserved.