프로그래밍/예전글

TCP기반의 에코서버/클라이언트

Cat체셔 2010. 8. 19. 11:17



//TCP기반의 에코서버
//made by chessire

#include<iostream>
#include<winsock2.h>

#pragma comment(lib, "ws2_32.lib")

void Error(char* szMessage);

void main()
{
 SOCKET s;     // 서버 소켓 디스크립터
 SOCKET cs;
 SOCKADDR_IN server;   // 소켓 구조체
 SOCKADDR_IN client;   // 소켓 구조체
 WSADATA wsaData;   // 스타트업 구조체

 int size = sizeof(client);
 char value[256];   //수신을 위한 정수값

 WSAStartup(MAKEWORD(2,2), &wsaData);

 s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);  //TCP기반의 서버 생성(IPv4)

 if( s == INVALID_SOCKET )
 {
  Error("socket");
  return;
 }

 server.sin_family = AF_INET;     // AF_INET 체계임을 명시
 server.sin_port = htons(10000);     // 10000번 포트를 사용
 server.sin_addr.S_un.S_addr = htonl(ADDR_ANY); // 자동 네트워크 카드 설정

 if(bind(s, (sockaddr*)&server, sizeof(server)) == SOCKET_ERROR)
 {
  closesocket(s);
  Error("bind");
  return;
 }

 if( listen(s,SOMAXCONN) != 0 )
 {
  closesocket(s);
  Error("listen");
  return;
 }

 printf("클라이언트로부터 접속을 기다리고 있습니다...\n");

 cs = accept(s, (sockaddr*)&client, &size);
//한명의 클라이언트만 접속을 받는다.

 if( cs == INVALID_SOCKET)
 {
  closesocket(s);
  Error("accept");
  return;
 }

 printf("클라이언트가 접속되었습니다.\n");
 printf("IP = %s, PORT = %d\n",
  inet_ntoa(client.sin_addr), ntohs(client.sin_port) );

 while(1)
 {
  int num = recv(cs, value, 256,0);        //클라이언트에게 메시지를 받는다.
  if(num == 0 || num == SOCKET_ERROR) //에러 확인
   break;
  printf("%s 수신\n",value);
  int num2 = send(cs, value, 256,0);     //그것을 다시 돌려준다.
 }

 closesocket(cs);
 closesocket(s);
 WSACleanup();
}

void Error(char* szMessage)
{
 printf("Error:[%d] %s \n", WSAGetLastError(), szMessage);
 WSACleanup();
 exit(0);
}


//TCP기반의 네트워크
//made by chessire

#include<iostream>
#include<winsock2.h>

#pragma comment(lib, "ws2_32.lib")

void Error(char* szMessage);

void main()
{
 SOCKET s;
 WSADATA wsaData;
 SOCKADDR_IN server;
 char value[256];
 ::ZeroMemory(value, sizeof(char)*256);

 WSAStartup(MAKEWORD(2,2), &wsaData);
 s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

 if(s == INVALID_SOCKET)
 {
  Error("socket");
  return;
 }

 server.sin_family = AF_INET;
 server.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
 server.sin_port = htons(10000);

 if( connect(s, (sockaddr*)&server, sizeof(server)) != 0 )
 {
  closesocket(s);
  Error("connect");
  return;
 }
 printf("127.0.0.1의 10000번 포트에 접속을 성공.\n");

 while(1)
 {
  char value2[256];
  printf("할말 입력(q is quit) : ");
  scanf("%s",value);
  if(!strcmp(value,"q") || !strcmp(value,"Q"))
   break;
  send(s, value,256,0);
  if(recv(s, value2,256,0) == 0)
   break;
  printf("%s\n",value);
 }
 puts("Received file data");
 send(s,"Thank you", 10, 0);
 closesocket(s);
 WSACleanup();
}

void Error(char* szMessage)
{
 printf("Error:[%d] %s\n", WSAGetLastError(), szMessage);
 WSACleanup();
 exit(0);
}