// 문제1 클래스 변경문제
/*
class CDInfo
{
 String registerNo;
 String title;
 CDInfo(String registerNo, String title)
 {
  this.registerNo = registerNo;
  this.title = title;
 }
}

class MusicCD extends CDInfo
{
 String artist;
 String music_name[];
 MusicCD(String registerNo, String title,
   String art, String musicname[])
 {
  // 슈퍼 클래스 생성자 사용
  super(registerNo, title);
  this.artist = art;
  this.music_name = musicname;
 }
 // 제대로 값이 들어갔는가 테스트용
 void Out()
 {
  System.out.println(this.registerNo);
  System.out.println(this.title);
  System.out.println(this.artist);
  System.out.println(this.music_name);
 }
}
public class main {
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  MusicCD cd = new MusicCD("t-1","darkness","rosa","하늘을보면 하늘밖에");
  cd.Out();
 }
}
*/
/*
// 문제2번
class Rectangle
{
 private int width, height;
 Rectangle(int width, int height)
 {
  this.width = width;
  this.height = height;
 }
 
 int getWidth()
 {
  return this.width;
 }
 
 int getHeight()
 {
  return this.height;
 }
}

class Square extends Rectangle  // a부분
{
 Square(int sideLenght)
 {
  super(sideLenght, sideLenght);  // b부분
 }
 int getSideLength()
 {
  return this.getWidth();
 }
}

public class main {
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  Square rect = new Square(100);
  System.out.println(rect.getSideLength());
 }
}
*/
// 문제 3번
interface Lendable
{
 abstract void checkOut(String aborrower, String data);
 abstract void checkIn();
 abstract void Out_borrower();
 abstract void Out_checkoutdata();
}

class SeparateVolume implements Lendable
{
 String requsetNo;
 String bookTitle;
 String writer;
 String borrower;
 String checkOutData;
 byte state;
 SeparateVolume(String requsetNo, String bookTitle, String writer)
 {
  this.requsetNo = requsetNo;
  this.bookTitle = bookTitle;
  this.writer = writer;
 }
 public void checkOut(String borrower, String data)
 {
  if(state != 0)
   return;
 
  this.borrower = borrower;
  this.checkOutData = data;
  this.state = 1;
  System.out.println("*" + bookTitle + " 이(가) 대출되었다.");
  System.out.println("대출인" + borrower);
  System.out.println("대출일:" + data + "\n");
 }
 
 public void checkIn()
 {
  this.borrower = null;
  this.checkOutData = null;
  this.state = 0;
  System.out.println("*" + bookTitle + " 이(가) 반납됨\n");
 }
 public void Out_borrower()
 {
  System.out.println("대출인" + borrower);
 }
 public void Out_checkoutdata()
 {
  System.out.println("대출일:" + checkOutData + "\n");
 }
}
class CDInfo
{
 String registerNo;
 String title;
 CDInfo(String registerNo, String title)
 {
  this.registerNo = registerNo;
  this.title = title;
 }
}
class AppCDInfo extends CDInfo implements Lendable
{
 String borrower;
 String checkOutData;
 byte state;
 AppCDInfo(String registerNo, String title)
 {
  super(registerNo, title);
 }
 public void checkOut(String borrower, String data)
 {
  if(state != 0)
   return;
 
  this.borrower = borrower;
  this.checkOutData = data;
  this.state = 1;
  System.out.println("*" + title + "CD가 대출되었다.");
  System.out.println("대출인" + borrower);
  System.out.println("대출일:" + data + "\n");
 }
 
 public void checkIn()
 {
  this.borrower = null;
  this.checkOutData = null;
  this.state = 0;
  System.out.println("*" + title + "CD가 반납됨\n");
 }
 public void Out_borrower()
 {
  System.out.println("대출인" + borrower);
 }
 public void Out_checkoutdata()
 {
  System.out.println("대출일:" + checkOutData + "\n");
 }
}

public class main {
 public static void main(String[] args)
 {
  Lendable arr[] = {
    new AppCDInfo("2005-7001", "Redhat Fedora"),
    new SeparateVolume("859ㅂ986ㅊ","책상은 책상답게","빅셀")
  };
  checkOutAll(arr, "김수진", "20060318");
 }
 static void checkOutAll(Lendable arr[], String borrower, String data)
 {
  for(Lendable obj : arr)
  {
   obj.checkOut(borrower, data);
   obj.Out_borrower();
   obj.Out_checkoutdata();
  }
 }
}

interface MessageSender
//class MessageSender
{
/* String title;
 String senderName;
 
 // 인터페이스에선 추상 메소드만 선언해야 하는데, 생성자를 썻음
 MessageSender(String title, String sendName)
 {
  this.title = title;
  this.senderName = sendName;
 }
*/
 abstract void sendMessage(String recipient);
 
}

abstract class MessageSender
{
 String title;
 String senderName;
 
 // 인터페이스에선 추상 메소드만 선언해야 하는데, 생성자를 썻음
 MessageSender(String title, String sendName)
 {
  this.title = title;
  this.senderName = sendName;
 }
 abstract void sendMessage(String recipient);
}

#include <winsock2.h>
#include <stdlib.h>
#include <stdio.h>

// 소켓 함수 오류 출력 후 종료
void err_quit(char *msg)
{
 LPVOID lpMsgBuf;
 FormatMessage(
  FORMAT_MESSAGE_ALLOCATE_BUFFER|
  FORMAT_MESSAGE_FROM_SYSTEM,
  NULL, WSAGetLastError(),
  MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
  (LPTSTR)&lpMsgBuf, 0, NULL);
 MessageBox(NULL, (LPCTSTR)lpMsgBuf, (LPCTSTR)msg, MB_ICONERROR);
 LocalFree(lpMsgBuf);
 exit(-1);
}

// 소켓 함수 오류 출력
void err_display(char *msg)
{
 LPVOID lpMsgBuf;
 FormatMessage(
  FORMAT_MESSAGE_ALLOCATE_BUFFER|
  FORMAT_MESSAGE_FROM_SYSTEM,
  NULL, WSAGetLastError(),
  MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
  (LPTSTR)&lpMsgBuf, 0, NULL);
 printf("[%s] %s", msg, (LPCTSTR)lpMsgBuf);
 LocalFree(lpMsgBuf);
}

// 도메인 이름 -> IP 주소
BOOL GetIPAddr(char *name, IN_ADDR *addr)
{
 HOSTENT *ptr = gethostbyname(name);
 if(ptr == NULL){
  err_display("gethostbyname()");
  return FALSE;
 }
 memcpy(addr, ptr->h_addr, ptr->h_length);
 return TRUE;
}

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

 // 명령행 인자 처리
 if(argc < 4)
 {
  fprintf(stderr, "<프로그램명> <스켄할IP> <최저Port> <최대Port>식으로 명령하시오\n");
  return -1;
 }

 // 윈속 초기화
 WSADATA wsa;
 if(WSAStartup(MAKEWORD(2,2), &wsa) != 0)
  return -1;

 // 소켓 주소 구조체 초기화; 단 포트 번호는 초기화하지 않음 (밑에서 for문 돌리니까)
 SOCKADDR_IN serveraddr;
 ZeroMemory(&serveraddr, sizeof(serveraddr));
 serveraddr.sin_family = AF_INET;
 if(!GetIPAddr(argv[1], &serveraddr.sin_addr))
  return -1;

 SOCKET sock;
 int port_min = atoi(argv[2]); // 포트 번호 최소값
 int port_max = atoi(argv[3]); // 포트 번호 최대값

 for(int search_port=port_min; search_port<=port_max; search_port++)
 {
  // 소켓 생성
  sock = socket(AF_INET, SOCK_STREAM, 0);
  if(sock == INVALID_SOCKET) err_quit("socket()");

  // 접속할 포트 지정
  serveraddr.sin_port = htons((u_short)search_port);

  // connect()
  retval = connect(sock, (SOCKADDR *)&serveraddr, sizeof(serveraddr));
  if(retval == SOCKET_ERROR)
  {
   printf("[%d번]연결실패\t", search_port); // 연결이 실패하면 점을 출력
  }
  else{
   printf("\n[%d번]포트 사용가능\n", search_port); // 연결이 성공하면 포트 번호를 출력
   closesocket(sock);
  }
 }

 // 윈속 종료
 WSACleanup();
 return 0;
}


// 뭐.. 주석은 충분히 달았으니...

#include <winsock2.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#define BUFSIZE 512
// 소켓 함수 오류 출력 후 종료
void err_quit(TCHAR *msg)
{
 LPVOID lpMsgBuf;
 FormatMessage(
  FORMAT_MESSAGE_ALLOCATE_BUFFER|
  FORMAT_MESSAGE_FROM_SYSTEM,
  NULL, WSAGetLastError(),
  MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
  (LPTSTR)&lpMsgBuf, 0, NULL);
 MessageBox(NULL, (LPCWSTR)lpMsgBuf, msg, MB_ICONERROR);
 LocalFree(lpMsgBuf);
 exit(-1);
}

// 소켓 함수 오류 출력
void err_display(char *msg)
{
 LPVOID lpMsgBuf;
 FormatMessage(
  FORMAT_MESSAGE_ALLOCATE_BUFFER|
  FORMAT_MESSAGE_FROM_SYSTEM,
  NULL, WSAGetLastError(),
  MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
  (LPTSTR)&lpMsgBuf, 0, NULL);
 printf("[%s] %s", msg, (LPCTSTR)lpMsgBuf);
 LocalFree(lpMsgBuf);
}

BOOL GetIPAddr(char *name, IN_ADDR *addr)
{
 HOSTENT *ptr = gethostbyname(name);
 if(ptr == NULL){
  err_display("gethostbyname()");
  return false;
 }
 memcpy(addr, ptr->h_addr, ptr->h_length);

 for (int i=0; ptr->h_addr_list[i]; i++)
 {
  // 모든 IP주소 뽑기
  printf("다른IP주소 %2d번 : %s\n", i, inet_ntoa(*(IN_ADDR*)ptr->h_addr_list[i]));
 }

 return true;
}

BOOL GetDomainName(IN_ADDR addr, char *name)
{
 HOSTENT *ptr = gethostbyaddr((char *)&addr, sizeof(addr), AF_INET);
 if(ptr == NULL){
  err_display("gethostbyaddr()");
  return false;
 }
 strcpy(name, ptr->h_name);

 for(int i=0; ptr->h_aliases[i]; i++)
 {
  // 모든 도메인 네임
  printf("별명 : %s\n",ptr->h_aliases[i]);
 }
 return true;
}

int main(int argc, char* argv[])
{
 WSADATA wsa;
 if(WSAStartup(MAKEWORD(2,2), &wsa)!=0)
  return -1;

 char buf[256];
 printf("도메인 주소를 입력하시오! : ");
 ::gets(buf);

 IN_ADDR addr;

 if(GetIPAddr(buf, &addr)){
  printf("\nIP 주소 = %s\n", inet_ntoa(addr));

  char name[256];
  if(GetDomainName(addr, name)){
   printf("\n도메인 이름 = %s\n", name);
  }
 }

 WSACleanup();
 return 0;
}

#include <winsock2.h>
#include <stdio.h>

typedef unsigned short u16; // 16bit (2byte) 정의
typedef unsigned long u32; // 32bit (4byte) 정의

bool IsLittleEndian()
{
 u16 x1, x2;
 x1 = 0x1234;   // x1에 임의의 값 대입(종단 시스템 바이트 정렬)
 x2 = htons(x1);   // x2에 x1값을 빅엔디안 변환

 if(x1 == x2)   // x1 과 x2 가 같다면 종단 시스템이 빅 엔디안이란 뜻..
  return false;
 else
  return true;
}

bool IsBigEndian2()   // 중복 소스 싫어요 >_<
{
 if(IsLittleEndian())
  return false;
 else
  return true;
}

bool IsBigEndian()
{
 u16 x1, x2;
 x1 = 0x1234;
 x2 = htons(x1);

 if(x1 == x2)
  return true;
 else
  return false;
}

int main(int argc, char* argv[])
{
 // 윈속 초기화
 WSADATA wsa;
 if(WSAStartup(MAKEWORD(2,2), &wsa) != 0)
  return -1;

 u_short x = 0x1234;
 u_long y = 0x123456789;

 u_short x2;
 u_long y2;

 // 호스트 -> 네트워크
 printf("호스트 -> 네트워크\n");
 printf("0x%x -> 0x%x\n", x, x2 = htons(x));
 printf("0x%x -> 0x%x\n", y, y2 = htonl(y));

 // 네트워크 -> 호스트
 printf("네트워크 -> 호스트\n");
 printf("0x%x -> 0x%x\n", x2, ntohs(x2));
 printf("0x%x -> 0x%x\n", y2, ntohl(y2));

 // 잘못 사용
 printf("잘못 사용예\n");
 printf("0x%x -> 0x%x\n", x, htonl(x));

 printf("\n\n빅엔디안 함수 사용중...\n");
 if(IsBigEndian())
  printf("IsBigEndian()에서 알리는 결과 : 이 컴퓨터는 빅엔디안 사용\n");
 else
  printf("IsBigEndian()에서 알리는 결과 : 이 컴퓨터는 리틀 엔디안 사용\n");
 
 printf("\n\n리틀 엔디안 함수 사용중...\n");
 if(IsLittleEndian())
  printf("IsLittleEndian()에서 알리는 결과 : 이 컴퓨터는 리틀 엔디안 사용\n");
 else
     printf("IsLittleEndian()에서 알리는 결과 : 이 컴퓨터는 빅엔디안 사용\n");
 
 
 // 윈속 종료
 WSACleanup();
 return 0;
}


+ Recent posts