'소켓'에 해당되는 글 1건

  1. 2009/11/24 Lukavega 간단한 윈속 서버 겸 클라이언트

#include <stdio.h>
#include <winsock2.h>
#include <conio.h>
#define BUFSIZE 1024
char m[BUFSIZE];
WSADATA wsaData;
char k;
short mysend;
SOCKET sock = INVALID_SOCKET, sListen;
void server();
void client();
void Error(char* m);
void Error(char* m){
 fputs(m, stdout);
 fputs("\n", stdout);
 system("PAUSE");
 exit(-1);
}


int main(){
 if (WSAStartup(MAKEWORD(2,2), &wsaData)!=0)
  Error("Error! WSA START Error.");
 while(1){
  system("cls");
  printf("Server Or Client? (S or C) -");
  fflush(stdin);
  k = getch();
  switch(k){
  case 's':
  case 'S':
   sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
   server();
   mysend = 1;
   break;
  case 'c':
  case 'C':
   sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
   client();
   mysend = -1;
   break;
  }
  if(sock!=INVALID_SOCKET) break;
 }
 while(1){
  memset(m, 0, BUFSIZE);
  if(mysend==1){
   printf("보낼 메세지:");
   fflush(stdin);
   fgets(m, BUFSIZE-1, stdin);
   if(send(sock, m, strlen(m)-1, 0)==SOCKET_ERROR)
    Error("보내는 도중 에러\n");
   printf("상대방에게 잘 전달됨\n");
  }
  else if(mysend==-1){
   printf("상대방이 메세지를 보내는중\n");
   if(recv(sock, m, BUFSIZE-1, 0)==SOCKET_ERROR)
    Error("메세지받는 도중 에러\n");
   printf("받은 메세지");
   fputs(m, stdout);
   fputs("\n", stdout);
  }
  mysend = -mysend;
 }
 closesocket(sock);
 closesocket(sListen);
 WSACleanup();
 return 0;
}

void server(){
 SOCKADDR_IN clntaddr, addr;
 int clntsize = sizeof(clntaddr);
 unsigned short port;
 
 printf("\n Server Start\n");
 printf("Port: ");
 fflush(stdin);
 scanf("%d", &port);
 
 sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
 memset(&addr, 0, sizeof(addr));
 addr.sin_addr.s_addr = htonl(INADDR_ANY);
 addr.sin_family = AF_INET;
 addr.sin_port = htons(port);
 
 if (bind(sListen, (SOCKADDR*)&addr, sizeof(addr)) == SOCKET_ERROR)
  Error("Bind Error\n");
 if (listen(sListen, 5)==SOCKET_ERROR)
  Error("LISTEN Error");
 
 printf("서버열기 완료 \n 상대방의 접속을 기다림\n");
 sock = accept(sListen, (SOCKADDR*)&clntaddr, &clntsize);
 return ;
 
}

void client(){
 SOCKADDR_IN addr;
 unsigned short port;
 char ip[20];
 
 printf("\nClient Start\n");
 printf("IP:");
 fflush(stdin);
 scanf("%s", ip);
 printf("port:");
 scanf("%d", &port);
 memset(&addr, 0, sizeof(addr));
 addr.sin_addr.s_addr = inet_addr(ip);
 addr.sin_family = AF_INET;
 addr.sin_port = htons(port);
 
 if (connect(sock, (SOCKADDR*)&addr, sizeof(addr)) == SOCKET_ERROR)
  Error("Connect Error\n");
 return;
 
}

-------------------------------------------------------
서버와 클라이언트간 1대1 채팅프로그램.
실행하자마자 s를 입력하면 서버, c를 입력하면 클라이언트로 동작합니다.

VS6.0의 경우,
project > settings... > Link > Object/binary modules 에
ws2_32.lib를 추가해야합니다.

2009/11/24 13:43 2009/11/24 13:43
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://lukavega.untoc.com/tc/rss/response/33

댓글+트랙백 ATOM :: http://lukavega.untoc.com/tc/atom/response/33