게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
TCP/IP 소켓 프로그램에 기능추가하려는데 모르겠네요 ...
게시물ID : programmer_14977짧은주소 복사하기
작성자 : 참.철
추천 : 0
조회수 : 378회
댓글수 : 0개
등록시간 : 2015/12/14 02:18:32

서버

#pragma comment (lib , "ws2_32.lib")
#include <stdio.h>
#include <WinSock2.h>
#include <process.h>
#include <stdlib.h>
#include <string.h>

void Thread (void * p)
{
 
 SOCKET sock = (SOCKET)p;
 char buf[300],B[200];
 int recvsize;
 while(1)
 {
  recvsize = recv(sock,buf,sizeof(buf),0);
  if(recvsize == 0)
  {
   printf("접속종료 ");
   break;
  }
  buf[recvsize] = '';
  printf(" client >> %s>> ",buf); 
  
  
  if(strncmp(buf,"종료하시겠습니까? yes/no",4)==0) 
  {

    exit(0);
  }
 }
 
}


// server -> bind -> listen -> accept 순서
int main(int argc, char **argv) {

 int retval,size,sendsize;
 char A[200]="종료하시겠습니까? yes/no";
 WSADATA wsaData;
 retval = WSAStartup(MAKEWORD(2,2),&wsaData);
 if(retval != 0)
 {
  printf("WSAStartup 에러 ");
  return 0;
 }

 SOCKET serv_sock;              
 // interger -> SOCKET
 serv_sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
 if(serv_sock == SOCKET_ERROR)
 {
  printf("socket 에러 ");
  return 0;
 }

 SOCKADDR_IN serv_addr = {0};     
 serv_addr.sin_family = AF_INET;
 serv_addr.sin_port = htons(4000);  
 serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);

 retval = bind(serv_sock,(SOCKADDR*)&serv_addr,sizeof(SOCKADDR));  //bind
 if(retval == SOCKET_ERROR)
 {
  printf("bind 에러 ");
  return 0;
 }

 listen(serv_sock,0);

 SOCKADDR_IN clnt_addr = {0};
 size = sizeof(SOCKADDR_IN);
 SOCKET clnt_sock = accept(serv_sock,(SOCKADDR*)&clnt_addr,&size); //accept
 if(clnt_sock == SOCKET_ERROR)
 {
  printf("accept 에러 ");
  return 0;
 }
 printf("클라이언트 접속 ");
 printf("IP : %s, Port : %d ",inet_ntoa(clnt_addr.sin_addr),clnt_addr.sin_port);

 _beginthread(Thread,NULL,(void*)clnt_sock);    
 
 while(1) 
 {
  char buf[200] = {0}; 
  printf(">> "); 
  gets(buf);
  sendsize = send(clnt_sock,buf,strlen(buf),0); // 클라이언트로 메세지를 보냅니다

  if(strcmp(buf,"BYE")==0){ //BYE 입력시 이벤트 발생
   printf("종료하시겠습니까? yes/no");
   sendsize = send(clnt_sock,A,strlen(A),0); //클라이언트로 A라는 데이터를 보냅니다
  }
 }
 
 closesocket(clnt_sock);
 closesocket(serv_sock);
 WSACleanup(); //반드시 사용하고 나와야한다.
}













클라이언트

#pragma comment (lib, "ws2_32.lib")
#include <stdio.h>
#include <WinSock2.h>
#include <process.h> 
#include <stdlib.h>
#include <string.h>

void Thread (void * p) 
{
 SOCKET sock = (SOCKET)p;
 char buf[300],A[200];
 while(1)
 {
  int recvsize = recv(sock,buf,sizeof(buf),0);
  if(recvsize == 0)
  {
   printf("접속종료 ");
   break;
  }
  buf[recvsize] = '';
  printf(" server >> %s>> ",buf); 
 
  
  if(strncmp(buf,"종료하시겠습니까? yes/no",4)==0) 
  {

    exit(0);
  }
    
 }
}


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

 WSADATA wsaData;
 int retval = WSAStartup(MAKEWORD(2,2),&wsaData);
 int sendsize;
 char B[200]="종료하시겠습니까? yes/no";
 if(retval != 0)
 {
  printf("WSAStartup error ");
  return 0;
 }

 SOCKET serv_sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

 SOCKADDR_IN serv_addr;
 serv_addr.sin_family = AF_INET;
 serv_addr.sin_port = htons(4000);  
 serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");

 retval = connect(serv_sock,(SOCKADDR*)&serv_addr,sizeof(SOCKADDR));
 if(retval == SOCKET_ERROR)
 {
  printf("연결 실패 ");
  return 0;
 }
 _beginthread(Thread,NULL,(void*)serv_sock); 
 
 while(1)
 {
  char buf[200] = {0};//채팅관련 소스
  printf(">> "); 
  gets(buf);
  sendsize = send(serv_sock,buf,strlen(buf),0);

  if(strcmp(buf,"BYE")==0){ //BYE 입력시 이벤트 발생
   printf("종료하시겠습니까? yes/no");
   sendsize = send(serv_sock,B,strlen(B),0); //클라이언트로 B라는 데이터를 보냅니다
  }
  
 }


 closesocket(serv_sock);
 WSACleanup();
}




이소스에다가 종료할때 BYE를 입력하면


서로 동의하고 종료하는 기능을 추가하고싶은데 잘안됩니다 ㅠㅠ




서로 동의 하에 종료 되는 것이니
com1 com2가 있다고 치고

1)com1이 BYE라고 입력하였다
2)BYE 입력시 A라는 데이터 송신
3)com2에서 A라는 데이터 수신
4)A라는 데이터가 수신되었다면 종료확인 발생
5)com2 종료 확인. B라는 데이터 송신
5-1) com2 yes면 종료 아니면 취소
6)com1 B라는 데이터 수신
7)B데이터가 Yes라면 com1 종료 No면 유지



라고  어떤분이 설명해주길래

지금까지 계속 구글링하고 찾아봐서

4번까지는 했는데(이것도 제대로한게맞는지...)  5번부터 도저히 어떻게해야할지 모르겠습니다... 

전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호