その時々

その時々で違うんです。特に決まっていないんです。

マウス位置サーバ

なんだか変な名前ですが、socketのサーバープログラムを作成してみました。
サーバーに接続するとサーバーのマウスカーソルの位置を返すプログラムです。

pythonでプロトタイプを作ってみました。

mouseserver.py

import socket
import random
import win32api

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('', 6633))
sock.listen(5)

while 1:
    conn, addr = sock.accept()
    conn.send(str(win32api.GetCursorPos()))
    conn.close()
sock.close()

すごくシンプルです。
起動しておいて

telnet localhost 6633

と接続してみるとマウスカーソルの位置が次のように返ってきます。

(123, 456)

もちろんリモートからもOKです。

さて実際のところは会社のクライアントに入れて、席にいるかどうかを見るために
考えたこのプログラム。
クライアントにはpythonは入っていないわけで、
Cで作ってみることにしました。

そのソースがこちら。

msrv.c

#include <stdio.h>
#include <windows.h>
#include <winsock.h>

#define PORT 6634

int mserver();

int main(int argc ,char *argv[]){

  STARTUPINFO si;
  PROCESS_INFORMATION pi;

  if (argc > 1) {
    mserver();
    return 0;
  }

  GetStartupInfo(&si);

  si.dwFlags = STARTF_USESHOWWINDOW;
  si.wShowWindow = SW_HIDE;

  CreateProcess(NULL, "msrv.exe run", NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi);

  return 0;
}

int mserver(){
  int fromlen;
  char mpos[20];
  WSADATA wsaData;
  SOCKADDR_IN saddin, faddin; 
  SOCKET sock, nsock;
  POINT pos;

  if(WSAStartup(MAKEWORD(1,1), &wsaData)){
    printf("WSAStartup error\n");
    return 0;
  }

  sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  if(!sock){
    printf("socket error\n");
    return 0;
  }    

  memset(&saddin, 0x00, sizeof(saddin));
  saddin.sin_family = AF_INET;
  saddin.sin_port   = htons(PORT);
                 
  if ( bind(sock, (struct sockaddr *)&saddin, sizeof(saddin)) ){
    printf("bind error\n");
    return 0;
  }

  if ( listen(sock, 5) ){
    printf("listen error\n");
    return 0;
  }

  while(1){
    fromlen = sizeof(faddin);
    nsock=accept(sock, (LPSOCKADDR)&faddin, &fromlen);
    if (nsock == INVALID_SOCKET){
      printf("accept error\n");
      return 0;
    }

    GetCursorPos(&pos);
    memset(mpos, 0x00, sizeof(mpos));
    sprintf(mpos, "(%d, %d)", pos.x, pos.y);
    send(nsock, mpos, sizeof(mpos), 0);

    shutdown(nsock, 2);
  }

  WSACleanup();
}

すごく面倒でした・・・
コンパイル
MinGWでやりました。

gcc -DWIN2 msrv.c -lwsock2 -o msrv.exe

このプログラムですが、一度起動してからCreateProcessで再度起動しています。
こうするとコンソールウインドウが出っぱなしにならなかったので。

あとはtelnetで接続するたびに現在のカーソル位置が返ってきます。
動いていれば、その席には人がいるってことです。

観察用にこんなpythonスクリプトを作ってみました。

mouseclient.py

import socket
import time

HOST = 'localhost'
PORT = 6634

for i in range(1, 50):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((HOST, PORT))
    data = s.recv(20)
    print 'Received', repr(data).replace('\\x00', '')
    time.sleep(1)
    s.close()

1秒毎に50回接続するスクリプトです。

こちらでマウスカーソルを再現させるなんてことも出来そうです。