C#, tray notify test

네이트온 메신저에서 메시지가 온 경우 알림을 주는 것과 같이 알림을 주는 트레이알림 테스트 코드.
근데 이벤트 처리가 제대로 안된다 -_-;;;
다른 방식으로 처리를 해야하나,,,,,,,,
혹시 아는 분이 있으면 댓글을 달아주면 좋겠는데

label에 이벤트를 추가했어야하는데,, 그걸 안했었네 -_-
이제는 잘 되지만 정리된 코드는 아니라는 거.

/***********************************************************

*
*     C# notify window at tray test code_revision
*     notifyWindowTest.cs 
*
************************************************************/
using System;
using System.Windows.Forms;
using System.Threading;
using System.Drawing;



namespace notifyWindowTest
{
    class TrayNotifyWindow
    {
        Form nForm = new Form();
        Label notiLabel;

        int mywidth;
        int myheight;

        Thread t1;

        public static ManualResetEvent allDone = new ManualResetEvent(false);


        public TrayNotifyWindow()
        {
            initLabel("[Received a file]");
            initNotifyForm();
            //nForm.MouseClick += nForm_MouseClick;
        }

        public TrayNotifyWindow(string a_fileName)
        {
            initLabel("[Received a file]\n" +"File:"+ a_fileName);

            initNotifyForm();
        }

        public TrayNotifyWindow(string a_fileName, string a_fileSize)
        {
            initLabel("[Received a file]\n" +"File:"+ a_fileName + "\nSize:" + a_fileSize);
            initNotifyForm();
        }

        private void initLabel(string a_text)
        {
            notiLabel = new Label();
            notiLabel.Text = a_text;
            notiLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
            notiLabel.Location = new System.Drawing.Point(10, 30);
            notiLabel.Size = new System.Drawing.Size(200, 40);
            nForm.Controls.Add(notiLabel);
        }


        private void initNotifyForm()
        {
            nForm.TopMost = true;
            nForm.ControlBox = false;
            nForm.ClientSize = new System.Drawing.Size(220, 100);

            // set values to change start point
            nForm.StartPosition = FormStartPosition.Manual;

            mywidth = Screen.PrimaryScreen.WorkingArea.Width - nForm.Width;
            myheight = Screen.PrimaryScreen.WorkingArea.Height - nForm.Height;

            nForm.Location = new System.Drawing.Point(mywidth, myheight);
        }

        private void nForm_MouseClick(object sender, EventArgs e)
        {
            System.Windows.Forms.MessageBox.Show("Click");
        }

        public void showNotifyWindow()
        {
            startThread();
        }

        private void stopThread()
        {
            t1.Abort();
        }


        private void startThread()
        {
            t1 = new Thread(new ThreadStart(StartNotify));
            t1.Start();
        }

        private void StartNotify()
        {
            
            nForm.MouseClick += nForm_MouseClick;
            notiLabel.MouseClick += nForm_MouseClick;

            int absolute_y, moving_y;
            
            absolute_y = Screen.PrimaryScreen.WorkingArea.Height;

            moving_y = absolute_y;

            // going up~
            while (moving_y > myheight)
            {
                moving_y -= 1;
                moveNotify(moving_y);
                
                //sleep
                System.Threading.Thread.Sleep(25);                

               // Application.DoEvents();
            }
                        
            // remain for 3 sec
            System.Threading.Thread.Sleep(1500);            
            //Application.DoEvents();

            // going down~
            while (moving_y < absolute_y)
            {
                moving_y += 1;
                moveNotify(moving_y);
                
                //sleep
                System.Threading.Thread.Sleep(25);

               // Application.DoEvents();
            }

            // when finished Notify, abort the thread.            
            stopThread();

            // and dispose nForm
            nForm.Dispose();


        }

        private void moveNotify(int a_height)
        {

            nForm.Location = new System.Drawing.Point(mywidth, a_height);

            nForm.Cursor = Cursors.Hand;
            nForm.Visible = true;
            //Application.DoEvents();
            nForm.Refresh();
            Application.DoEvents();
        }
    }
}

C strtok test


strtok 함수는 파싱할때 사용하기 좋은 함수이다.
delimiter를 정하면 token 단위로 파싱 할 수 있다.
아래는 함수 테스트를 위한 코드

--------------------------------------------------------

/**********************************************************
*
*        Test code for testing strtok
*
***********************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define CR \r
#define LF \n

#define SHOWALL 0

//#define REGISTER 0
//#define INVITE 1

#define IS_INVITE(val) strcmp(val,"INVITE") == 0
#define IS_CALLID(val) strcmp(val,"Call-ID") == 0 || strcmp(val, "CALL-ID") == 0 || strcmp(val, "call-id") == 0
#define IS_FROM(val) strcmp(val,"From") == 0 || strcmp(val,"FROM") == 0
#define IS_TO(val) strcmp(val,"To") == 0 || strcmp(val,"TO") == 0


enum SIP_METHOD{
REGISTER,
INVITE,
ACK,
CANCEL,
BYE,
OPTIONS
};


int sipd_parser(char *a_msg);
int getRequestType(char *method);
void process_INVITE_MSG();
void sipd_parse_header(char *a_msg);


void process_INVITE_MSG(){
printf("is INVITE!!!\n");
}

int sipd_parse_startLine(char *startline){
//printf("startlIne : %s\n",startline);

int methodType;
char *token;
char *ptr;

// check if start with 'SIP/2.0'
if( strncmp(startline,"SIP",3) == 0 ){
strtok_r(startline," ",&ptr);

// getMethod or status
token = strtok_r(NULL, " ",&ptr);
}
else{
token = strtok_r(startline," ",&ptr);
}
methodType = getMethodType(token);


// get myuri
strtok_r(NULL, ":",&ptr);
token = strtok_r(NULL, "@",&ptr);
printf("myuri : %s\n",token);

// get host uri
token = strtok_r(NULL, ":",&ptr);
printf("host uri : %s\n",token);

// get host port
token = strtok_r(NULL, " ",&ptr);
printf("host port : %s\n",token);

//printf("startline : %s\n",startline);

/*
* If need, do parse other elements here.
*/

return methodType;
}

int getMethodType(char *method){

int rv;

printf("recv method = %s\n",method);

if(method[0] >= 49 && method[0] <= 57){
rv = atoi(method);
printf("method = %d\n",rv);
}
//else if( (method[0] >= 65 && method[0] <= 90) || (method[0] >= 97 && method[0] <= 122) ){

else{
switch(method[0]){
case 'R': 
printf("REGISTER!!\n");
break;
case 'I': if(IS_INVITE(method)) rv = INVITE;
printf("INVITE!!\n");
break;
case 'A':
break;
case 'C':
break;
case 'B':
break;
case 'O':
break;
}/*
if( method[0] == 'I' ){
if( strcmp(method,"INVITE") == 0){
rv = INVITE;
}
}*/
}
// status response



return rv;
}

void sipd_parse_header(char *a_msg){
char *token = NULL;
char delim[] = " :\r\n";
//char tag_delim = "tag=";
char *msg;
short flag=0;
char *subprt;

msg = (char*)malloc(sizeof(a_msg));
strcpy(msg,a_msg);

//printf("token %s\n",msg);

token = strtok_r(msg,delim, &subprt);

//printf("header %s\n",token);

while(token != NULL){
if( IS_CALLID(token) ){
token = strtok_r(NULL, delim, &subprt);
//if( flag && *token != ' ' && *token != ':' ){
//strcpy(sipd_message->callid->id, token);
printf("call-id : %s\n",token);
break;
}
else if( IS_FROM(token) ){
strtok_r(NULL, "=", &subprt);
token = strtok_r(NULL, "\r\n", &subprt);
//strcpy(sipd_message->callid->id, token);
printf("from tag : %s\n",token);
}
else if( IS_TO(token) ){
strtok_r(NULL, "=", &subprt);
token = strtok_r(NULL, "\r\n", &subprt);
//strcpy(sipd_message->callid->id, token);
printf("to tag : %s\n",token);
}
token = strtok_r(NULL, delim, &subprt);
}
}



int sipd_parser(char *a_msg){
char *token = NULL;
char delim[] = "\r\n";
char msg[strlen(a_msg)];
int methodType;
char *ptr;

strcpy(msg,a_msg);//,sizeof(a_msg));

#if SHOWALL
printf("msg : %s\n",msg);
printf("a_msg : %s\n",a_msg);
#endif

token = strtok_r(msg, delim, &ptr);

methodType = sipd_parse_startLine(token);

while( (token = strtok_r(NULL, delim, &ptr)) != NULL){
/*token = strtok_r(NULL, delim, &ptr);
if(token == NULL) break;*/
#if SHOWALL
printf("in Parser %s\n",token);
#endif
sipd_parse_header(token);
}

//printf("after getMethod a_msg : %s\n",msg);
//sipd_parse_header(msg);

switch(methodType){
case 0: // REGISTER
break;
case 1: // INVITE
process_INVITE_MSG();
break;
case 2: // ACK
break;
case 3: // CANCEL
break;
case 4: // BYE
break;
case 5: // OPTIONS
break;
default:
if( methodType >= 100 && methodType < 200 ){
printf("100~\n");
}
else if( methodType >= 200 && methodType < 300 ){
printf("200~\n");
}
else if( methodType >= 300 && methodType < 400 ){
printf("300~\n");
}
else if( methodType >= 400 && methodType < 500 ){
printf("400~\n");
}
else if( methodType >= 500 && methodType < 600 ){
}
else if( methodType >= 600 && methodType < 700 ){
}
break;
}
return 0;
}

int main(){
char *token = NULL;
char s1[] = "SIP/2.0 401 Unauthorized sip:0476504146@90.96.10.10:5060 SIP/2.0\r\n\
Max-Forwards: 70\r\n\
Call-ID: f7c5f7c7d246fcdcab60ca5e8fa44a2b@90.96.10.21\r\n\
From: 0476504121 <sip:0476504121@90.96.10.10:5060>;tag=336bf603e6f94a8\r\n\
To: 0476504146 <sip:0476504146@90.96.10.10:5060>";//;tag=45645654345sdfgsas\r\n";
char s2[] = " :@CRLF";

printf("=== Message ====================\n%s\n\n",s1);

sipd_parser(s1);

return 0;
}

[link only] Installing Freepbx 2.8 with Asterisk 1.8 on Cent 5.8

Freepbx 2.8
[Src : http://www.markinthedark.nl/news/ubuntu-linux-unix/69-installing-freepbx-28-with-asterisk-18-on-centos-55.html]

TLS
[Src : http://www.freepbx.org/forum/freepbx/general-help/securing-the-conversation-with-tls-and-srtp-not-so-fast]
[Src : https://wiki.asterisk.org/wiki/display/AST/Secure+Calling+Tutorial]

multi-platform TCP, UDP client socket



/***************************************************
*
*  TCP Client_multi-platform
*
****************************************************/
#ifdef WIN32
#ifndef _WINSOCKAPI_
#define _WINSOCKAPI_
#endif
#endif

#include <stdio.h>

#ifdef WIN32
#pragma comment(lib, "ws2_32.lib") // Winsock 라이브러리 자동 링크
#include <windows.h>
#include <winsock2.h>
#define NET_INVALID_SOCKET INVALID_SOCKET
#define NET_SOCKET_ERROR SOCKET_ERROR
typedef int socklen_t; // unix 타입은 unsigned int, Windows는 int
#else
#include <sys/socket.h> // for socket(), bind(), connet()
#include <arpa/inet.h> // for sockaddr_in, inet_ntoa()
#include <unistd.h> // for close()
#include <stdlib.h> // for exit()
typedef int SOCKET;
#define NET_INVALID_SOCKET -1
#define NET_SOCKET_ERROR -1
#endif

#define MAX_DATA_SIZE 100

int main(){
#ifdef WIN32
WSADATA wsaData;
WORD version;
#endif

SOCKET ServerSocket;
SOCKET numbytes;

struct sockaddr_in ServerAddress;
unsigned short ServerPort = 5061;
char buf[MAX_DATA_SIZE];
#ifdef WIN32
version = MAKEWORD(2,2);
if(WSAStartup(version, &wsaData) < 0)
{
printf("WSAStartup Init Error");
WSACleanup();
exit(0);
}
#endif

ServerSocket = socket(AF_INET, SOCK_STREAM, 0);
if(ServerSocket == NET_INVALID_SOCKET)
{
printf("Fail to create the socket\n");
#ifdef WIN32
closesocket(ServerSocket);
WSACleanup();
#else
close(ServerSocket);
#endif
exit(0);
}
ServerAddress.sin_family = AF_INET;
ServerAddress.sin_addr.s_addr = inet_addr("23.44.153.149");
ServerAddress.sin_port = htons(ServerPort);
if(connect(ServerSocket, (struct sockaddr*)&ServerAddress, sizeof(ServerAddress)) < 0){
printf("Fail to connect to server\n");
#ifdef WIN32
closesocket(ServerSocket);
WSACleanup();
#else
perror("Fail to connect to server");
close(ServerSocket);
#endif
exit(0);
}
else{
printf("Successfully connected to server\n");
if( (numbytes = recv(ServerSocket, buf, MAX_DATA_SIZE, 0)) == -1){
printf("Fail to receive\n");
getchar();
exit(1);
}
buf[numbytes] = '\0';
}
printf("Received msg : %s\n",buf);
#ifdef WIN32
closesocket(ServerSocket);
WSAClean();
#else
close(ServerSocket);
#endif
printf("Close Client session\n");
getchar();
return 1;
}



/***************************************************
*
*  UDP Client_Linux only
*
****************************************************/

#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>


int main()
{
    int sockfd;
    int clilen;
    int state;
    char buf[255] = "TestTestTest";


    struct sockaddr_in serveraddr;    

    //memset(buf, 0x00, 255); 
    clilen = sizeof(serveraddr);
    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0)
    {
        perror("socket error : ");
        exit(0);
    }

    bzero(&serveraddr, sizeof(serveraddr));
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    serveraddr.sin_port = htons(5060);

    

    sendto(sockfd, (void *)&buf, sizeof(buf), 0, (struct sockaddr *)&serveraddr, clilen);
memset(buf, 0x00, 255); 
    recvfrom(sockfd, (void *)&buf, sizeof(buf), 0, NULL, NULL); 

    printf("recved : %s",buf);
    close(sockfd);

return 0;
}