서버
#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번부터 도저히 어떻게해야할지 모르겠습니다...