2016年11月15日 星期二

[C#]開機自動執行

using Microsoft.Win32;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {


        }

        private void button1_Click(object sender, EventArgs e)
        {

            try
            {
                string app_name= "WindowsFormsApplication1";

                string path = Application.ExecutablePath;

                RegistryKey rk = Registry.LocalMachine;

                RegistryKey rk2 = rk.CreateSubKey(@"Software\Microsoft\Windows\CurrentVersion\Run");

                if (rk2.GetValue(app_name) != null)
                {
                    rk2.DeleteValue(app_name, false);
                }
                rk2.SetValue(app_name, path);
                rk2.Close();
                rk.Close();
            }
            catch(Exception ex)
            {
                MessageBox.Show("fail\n");
            }     

        }
    }
}

2016年11月14日 星期一

[C++]Interprocess Communications (MailSlot)

#include "stdafx.h"
#include <Windows.h>
#include <strsafe.h>
#include <stdio.h>

HANDLE hSlot;
LPTSTR Slot = TEXT("\\\\.\\mailslot\\test_mailslot");

BOOL ReadSlot()
{
DWORD cbMessage, cMessage, cbRead;
BOOL fResult;
LPTSTR lpszBuffer;
TCHAR achID[80];
DWORD cAllMessages;
HANDLE hEvent;
OVERLAPPED ov;

cbMessage = cMessage = cbRead = 0;

hEvent = CreateEvent(NULL, FALSE, FALSE, TEXT("ExampleSlot"));

if (NULL == hEvent)
return FALSE;

ov.Offset = 0;
ov.OffsetHigh = 0;
ov.hEvent = hEvent;

fResult = GetMailslotInfo(hSlot, (LPDWORD)NULL, &cbMessage, &cMessage, (LPDWORD)NULL);

if (!fResult)
{
printf("Get MailSlot failed %d.\n", GetLastError());
return FALSE;
}

if (cbMessage == MAILSLOT_NO_MESSAGE)
{
printf("Waiting for a message\n");
return TRUE;
}

cAllMessages = cMessage;

while (cMessage != 0)
{
StringCchPrintf((LPTSTR)achID, 80, TEXT("\nMessage #%d of %d\n"), cAllMessages - cMessage + 1, cAllMessages);

lpszBuffer = (LPTSTR)GlobalAlloc(GPTR, lstrlen((LPTSTR)achID)*sizeof(TCHAR) + cbMessage);

if (NULL == lpszBuffer) return FALSE;

lpszBuffer[0] = '\0';

fResult = ReadFile(hSlot, lpszBuffer, cbMessage, &cbRead, &ov);

if (!fResult)
{
printf("Read Fail %d\n", GetLastError());
GlobalFree((HGLOBAL)lpszBuffer);
return FALSE;
}

StringCbCat(lpszBuffer, lstrlen((LPTSTR)achID)*sizeof(TCHAR) + cbMessage, (LPTSTR)achID);

_tprintf(TEXT("Contents of the mail:%s\n"), lpszBuffer);

GlobalFree((HGLOBAL)lpszBuffer);


fResult = GetMailslotInfo(hSlot, (LPDWORD)NULL, &cbMessage, &cMessage, (LPDWORD)NULL);

if (!fResult)
{
printf("Get Mail Slot Info %d\n", GetLastError());
}

}
CloseHandle(hEvent);
return TRUE;
}

int main()
{



hSlot = CreateMailslot(Slot, 0, MAILSLOT_WAIT_FOREVER, (LPSECURITY_ATTRIBUTES) NULL);

if (hSlot == INVALID_HANDLE_VALUE)
{
printf("Create Mail Slot Failed:%d \n", GetLastError()); 
return 0;
}
else printf("Mail slot create ok!!\n");

while (TRUE)
{
ReadSlot();
Sleep(3000);
}
}



=============================================================================================

#include "stdafx.h"

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


LPTSTR SlotName = TEXT("\\\\.\\mailslot\\test_mailslot");

int main()
{
    
HANDLE hfile;

hfile = CreateFile(SlotName, GENERIC_WRITE, FILE_SHARE_READ, (LPSECURITY_ATTRIBUTES)NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, (HANDLE)NULL);

if (hfile == INVALID_HANDLE_VALUE)
{
printf("CreateFile failed with %d\n", GetLastError());

return FALSE;
}



BOOL fResult;
DWORD cbWritten;

fResult = WriteFile(hfile, SlotName, (DWORD)(lstrlen(SlotName) + 1)*sizeof(TCHAR), &cbWritten, (LPOVERLAPPED)NULL);

if (!fResult)
{
printf("Write file failed:%d \n", GetLastError());

return FALSE;
}

printf("Slot written to successfully \n");


CloseHandle(hfile);


for (int h = 0; h < 10000; h++) Sleep(2000);

return 0;

}



執行結果:








2016年11月13日 星期日

CGI study

不錯的文章:

閒聊CGI(Common Gateway Interface)程式
http://blog.yam.com/csylvia/article/19952784

www service Ifo
http://blog.xuite.net/coke750101/networkprogramming/56098687



httpClient抓取网页–linux C/C++
http://www.xuebuyuan.com/2121856.html

Linux下C抓取网页

http://blog.csdn.net/hejinwei_1987/article/details/7540500

2016年11月7日 星期一

[C#]Interprocess Communications (File Mapping)

Send:

using System.IO.MemoryMappedFiles;

namespace ConsoleApplication_IPC_FileMappingSend
{
    class Program
    {
        static void Main(string[] args)
        {

            MemoryMappedFile mmf = MemoryMappedFile.CreateNew("test", 1000);

            MemoryMappedViewAccessor accessor = mmf.CreateViewAccessor();

            accessor.Write(500, 42);

            Console.WriteLine("Memory-mapped file created!");

            Console.ReadLine();

            accessor.Dispose();

            mmf.Dispose();


        }
    }
}


Recvive:

using System.IO.MemoryMappedFiles;


namespace ConsoleApplication_IPC_FileMappingRec
{
    class Program
    {
        static void Main(string[] args)
        {
            MemoryMappedFile mmf = MemoryMappedFile.OpenExisting("test");

            MemoryMappedViewAccessor accessor = mmf.CreateViewAccessor();
            int value = accessor.ReadInt32(500);
            Console.WriteLine("the answer is {0}", value);

            Boolean zeon1 = accessor.CanRead;
             
            mmf.Dispose();
           
            Console.ReadLine();
        }
    }
}

[C#]Interprocess Communications (Data Copy)

Send:

using System.Runtime.InteropServices;

namespace WindowsFormsApplication_IPC_DataCopy_Send
{
    public partial class Form1 : Form
    {

        [DllImport("user32.dll")]
        static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, IntPtr lParam);

        [DllImport("user32.dll")]
        private static extern int SendMessage(IntPtr hwnd, uint wMsg, int wPar);

        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        static extern uint RegisterWindowMessage(string lpString);
        uint MSG_SHOW = RegisterWindowMessage("Show Message");

        [DllImport("user32.dll")]
        static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            IntPtr nPrt = FindWindow(null, "TT");
            if(nPrt != IntPtr.Zero && textBox1.Text.Trim()!="")
            {
                try
                {
                    string tempword = textBox1.Text.Trim();
                    int iNum = int.Parse(tempword);
                    SendMessage(nPrt, MSG_SHOW, iNum , IntPtr.Zero);
                }
                catch(Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }
            }
        }
    }
}



Receive:

using System.Runtime.InteropServices;


namespace WindowsFormsApplication_IPC_DataCopy_Rec
{
    public partial class Form1 : Form
    {
        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        static extern uint RegisterWindowMessage(string lpString);
        uint MSG_SHOW = RegisterWindowMessage("Show Message");

        public Form1()
        {
            InitializeComponent();
        }


        protected override void WndProc(ref Message m)
        {
            if(m.Msg==MSG_SHOW)
            {
                label1.Text = (string)m.WParam.ToString();
            }
            base.WndProc(ref m);
        }
    }
}


2016年11月6日 星期日

[C#]Interprocess Communications (Clipboard)

使用剪貼簿的方法:
                           Clipboard.SetText
                           Clipboard.SetImage
                           Clipboard.SetData

                            Clipboard.GetText
                           Clipboard.GetImage
                            Clipboard.GatData


好像一次只能有一筆,不能一次Set多筆,然後慢慢接收.......@#$$$%%%%%


參考:


2016年11月3日 星期四

[C#]程式視窗縮到右下小工作列內

在 Toolbox 內選用 NotiftIcon,Properties 內,選 Icon 及當指標到圖示時,需顯示的 Text

namespace WindowsFormsApplication_NotifyEx
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

        }

        private void Form1_SizeChanged(object sender, EventArgs e)
        {
            if(this.WindowState==FormWindowState.Minimized)
            {
                this.Hide();
                this.notifyIcon1.Visible = true;
            }
        }


         //右下角圖示按兩下滑鼠指標
        private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            this.Show();
            this.WindowState = FormWindowState.Normal;
            this.notifyIcon1.Visible = false;

        }
    }
}



C# 讓表單執行時最大化、最小化、預設大小、最上層顯示
https://ithelp.ithome.com.tw/articles/10029790

[C#] WPF Notify Icon
http://cowbaycoding.blogspot.com/2017/02/c.html

[Raspberry] TCP/IP 傳輸之 server/client 程式

Socket 在哪邊:


















TCP:























UDP:








hostaddress 4 byte的數字組成,socket中的struct in_addr 將這個整束包裝起來,定義在in.h

struct in_addr {
__be32    s_addr;
}


特殊的host address number:
l   INADDR_LOOPBACK:指本機的address,也就是127.0,0,1(localhost)
l   INADDR_ANY:指任何連上來的address
l   INADDR_BROADCAST:傳送broadcast訊息才可使用
l   INADDR_NONE:某些function錯誤時的回傳值

字節順序轉換函數:
htonl():32位值從主機字節序轉換成網絡字節序
htons():16位值從主機字節序轉換成網絡字節序
ntohl():32位值從網絡字節序轉換成主機字節序
ntohs():16位值從網絡字節序轉換成主機字節序

Bind函數將socket與本機上的一個埠相關聯.你就可以在該埠監聽服務請求


Client:

#include <cstdlib>

#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <arpa/inet.h>

using namespace std;

/*
 *
 */
int main(int argc, char** argv) {

    int sockfd=0,n=0;
    char recvBuff[1024];
    struct sockaddr_in serv_addr;
   
    if(argc!=2)
    {
        printf("\n Usage:%s <ip of server> \n",argv[0]);
        return 1;
    }
   
    memset(recvBuff,'0',sizeof(recvBuff));
   
    if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0)
    {
        printf("\n Error: Could not create socket \n");
        return 1;
    }
   
    memset(&serv_addr,'0',sizeof(serv_addr));
   
    serv_addr.sin_family=AF_INET;
   
    serv_addr.sin_port=htons(5000);
   
    if(inet_pton(AF_INET,argv[1],&serv_addr.sin_addr)<=0)
    {
        printf("\n inet_pton error occured\n");
        return 1;
    }
   
    if(connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr))<0)
    {
        printf("\n Error:Connect Failed \n");
        return 1;
    }
   
   
    while((n=read(sockfd,recvBuff,sizeof(recvBuff)-1))>0)
    {
        recvBuff[n]=0;
        if(fputs(recvBuff,stdout)==EOF)
        {
            printf("\n Error:Fputs error \n");
        }
    }
   
    if(n<0)
    {
        printf("\n Read error\n");
    }
 
    return 0;
}



SERVER
:
#include <cstdlib>

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <time.h>

using namespace std;

/*
 *
 */

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

    int listenfd=0,connfd=0;
   
    struct sockaddr_in serv_addr;
   
    char sendBuff[1025];
   
    time_t ticks;
   
    listenfd=socket(AF_INET,SOCK_STREAM,0);

    memset(&serv_addr,'0',sizeof(serv_addr));
   
    memset(sendBuff,'0',sizeof(sendBuff));
   
    serv_addr.sin_family=AF_INET;
   
    serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
   
    serv_addr.sin_port=htons(5000);
   
    bind(listenfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr));
   
    listen(listenfd,10);
   
    while(1)
    {
        connfd=accept(listenfd,(struct sockaddr *)NULL,NULL);
       
        ticks=time(NULL);
       
        snprintf(sendBuff,sizeof(sendBuff),"%.24s\r\n",ctime(&ticks));
               
        write(connfd,sendBuff,strlen(sendBuff));
       
        close(connfd);
       
        sleep(1);
    } 
    return 0;
}



 

參考:
http://www.thegeekstuff.com/2011/12/c-socket-programming/








2016年10月10日 星期一

[ASP.NET] 練習

初學者,照著書本key....

執行畫面:

程式:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication5
{
    public partial class WebForm1 : System.Web.UI.Page
    {

        protected void Page_Load(object sender, EventArgs e)
        {
            if(!Page.IsPostBack)
            {
                Response.Write("網頁<b> 第一次值行 </b>...Page Load 事件...<br />");
            }
            else
            {
                int q = Convert.ToInt32(TextBox1.Text) + 1;
                TextBox1.Text = q.ToString();
                Response.Write("網頁重新 PostBack(回傳)....Page Load 事件...<br />");
            }

        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            Response.Write("按下[按鈕]....button 的 click 事件...<br />");
        }
    }

}


成功...!!


網頁即時通:

namespace WebApplication_Communication
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            string A = TextBox2.Text + ":" + TextBox4.Text; //發言者:發言
            TextBox1.Text += A + "\r\n";                    //寫入看板
            Application[TextBox3.Text] = A;                 //發給收訊者
            TextBox4.Text = "";                             //清除發言框
        }

        protected void Timer1_Tick(object sender, EventArgs e)
        {
            if(Application[TextBox2.Text]!=null)
            {
                TextBox1.Text += Application[TextBox2.Text] + "\r\n";//寫入看板
                Application[TextBox2.Text] = null;                   //刪除訊息
            }
        }
    }
}

執行結果:


2016年9月25日 星期日

[C#] 網路程式練習(四)

還是一樣,照著書上範例打,只是不知為何,雙向通沒多久,就當了.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.IO;
using System.Threading;
using System.Net;
using System.Net.Sockets;

namespace ConsoleApplicationbox
{
    class ChatBox
    {
        int port = 20;
        static void Main(string[] args)
        {
            ChatBox ChatBox = new ChatBox();
            if (args.Length == 0) ChatBox.ServerMain();
            else
                ChatBox.ClientMain(args[0]);
        }

        public void ServerMain()
        {
            IPEndPoint ipep = new IPEndPoint(IPAddress.Any, port);
            Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            newsock.Bind(ipep);
            newsock.Listen(10);
            Socket client = newsock.Accept();
            new TcpListener(client);
            newsock.Close();
        }

        public void ClientMain(String ip)
        {
            IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(ip), port);
            Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            server.Connect(ipep);
            new TcpListener(server);
            server.Shutdown(SocketShutdown.Both);
            server.Close();
        }

    }



    public class TcpListener
    {
        Socket socket;
        Thread inThread, outTHread;

        NetworkStream stream;
        StreamReader reader;
        StreamWriter writer;


        public TcpListener(Socket s)
        {
            socket = s;
            stream= new NetworkStream(s);
            reader = new StreamReader(stream);
            writer = new StreamWriter(stream);
            inThread = new Thread(new ThreadStart(inLoop));
            inThread.Start();
            outTHread = new Thread(new ThreadStart(outLoop));

            outTHread.Start();
            inThread.Join();  //等待inThread 執行序完成,才離開此函數
                                          //按照 inLoop的邏輯,這個函數永遠都不會跳出(inLoop 是無窮迴圈)
        }

        public void inLoop()
        {
            while(true)
            {
                String line = reader.ReadLine();
                Console.WriteLine("rec: " + line);
            }
        }


        public void outLoop()
        {
            String line = Console.ReadLine();
            writer.WriteLine(line);
            writer.Flush();
        }

    }

}





找到一本不錯的書:



2016年9月23日 星期五

[C#] 網路程式練習(三)

照書 Key.......

使用 TCP/IP 方式:

Client 端:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Net;
using System.Net.Sockets;

namespace ConsoleApplication_TCPclient
{
    class Program
    {
        static void Main(string[] args)
        {
            IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("192.168.100.1"), 20);

            Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            server.Connect(ipep);

            int j = 0;
            while(true)
            {
                j++;
                string input = "Hello word !! \r\n";
                byte[] data = Encoding.UTF8.GetBytes(input);
                server.Send(data);
                for (int h = 0; h < 100000; h++) ;

                if (j > 10) break;
            }

            server.Shutdown(SocketShutdown.Both);
            server.Close();



        }
    }
}



Server端:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Net;
using System.Net.Sockets;
using System.Threading;


namespace ConsoleApplicationTcpServer
{
    class Program
    {
        static void Main(string[] args)
        {

            IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 20);
           
            Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            newsock.Bind(ipep);

            newsock.Listen(10);

            while(true)
            {
                Socket client = newsock.Accept();

                IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;

                Console.WriteLine("Client End Point= " + clientep);

                TcpListener listener = new TcpListener(client);

                Thread thread = new Thread(new ThreadStart(listener.run));

                thread.Start();


            }




        }
    }


public class TcpListener
    {
        Socket socket;

        public TcpListener(Socket s)
        {
            socket = s;
        }
        public void run()
        {
            try
            {
                while(true)
                {
                    byte[] data = new byte[1024];
                    int recv = socket.Receive(data);

                    if (recv == 0) break;
                    Console.WriteLine(Encoding.UTF8.GetString(data, 0, recv));
                }

                socket.Close();
            } catch(Exception e)
            {
                Console.WriteLine("Client " + socket.RemoteEndPoint + " Error:close");
                Console.WriteLine(e);
            }

        }
    }

}

成功 ^^



另一個程式;

Server 端:

using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Collections;  //匯入集合物體功能

namespace WindowsFormsApplication_TCP
{
    public partial class Form1 : Form
    {
        TcpListener server;         //電話總機
        Socket Client;              //電話分機
        Thread Th_svr;              //電話總機開放中
        Thread Th_Clt;              //電話分機連線中
        Hashtable HT = new Hashtable();     //客戶名稱與通訊物件的集合(雜湊表)(Key:Name:Socket)

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //忽略跨執行緒處理的錯誤(允許跨執行緒存許變數)
            CheckForIllegalCrossThreadCalls = false;
            Th_svr = new Thread(ServerSub);
            Th_svr.IsBackground = true;
            Th_svr.Start();
            button1.Enabled = false;
        }

        private void ServerSub()
        {
            //Server IP and Port
            IPEndPoint EP = new IPEndPoint(IPAddress.Parse(textBox1.Text), int.Parse(textBox2.Text));
            server = new TcpListener(EP);   //建立伺服端監聽器(總機)
            server.Start(100);              //啟動監聽設定,允許最多連線數100人
            while(true)
            {
                Client = server.AcceptSocket();  //建立此客戶的連線物件Client
                Th_Clt = new Thread(Listen);     //建立監聽這個客戶連線的獨立執行緒
                Th_Clt.IsBackground = true;
                Th_Clt.Start();
            }
        }

        private void Listen()
        {
            Socket sck = Client;

            Thread Th = Th_Clt;

            while(true)
            {
                try
                {
                    byte[] B = new byte[1023];
                    int inLen = sck.Receive(B);
                    String Msg = Encoding.Default.GetString(B, 0, inLen);
                    String Cmd = Msg.Substring(0, 1);
                    String Str = Msg.Substring(1);
                    switch(Cmd)
                    {
                        case "0":
                            HT.Add(Str, sck);
                            listBox1.Items.Add(Str);
                            break;
                        case "9":
                            HT.Remove(Str);
                            listBox1.Items.Remove(Str);
                            Th.Abort();
                            break;
                    }
                }
                catch(Exception)
                {

                }
            }

        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            Application.ExitThread();
        }
    }
}

執行結果

















Client 端:

using System.Net;
using System.Net.Sockets;


namespace WindowsFormsApplicationTCP_Client
{
    public partial class Form1 : Form
    {

        Socket T;
        String User;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string IP = textBox1.Text;
            int Port = int.Parse(textBox2.Text);
            IPEndPoint EP = new IPEndPoint(IPAddress.Parse(IP), Port);

            T = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            User = textBox3.Text;

            try
            {
                T.Connect(EP);
                Send("0" + User);
            }
            catch(Exception)
            {
                MessageBox.Show("無法連上伺服器");
                return;
            }

            button1.Enabled = false;
        }

        private void Send(String str)
        {
            byte[] B = Encoding.Default.GetBytes(str);

            T.Send(B, 0, B.Length, SocketFlags.None); //使用連線物件傳送資烙
        }

    }
}

執行結果:








沒有連線過,不知是否有問題....