제가 지금 <winsock2.h>를 이용해서 서버랑 클라이언트를 구현하려는데요
분명 계산상으로는 패킷이 맞는데 서봐와 클라이언트 둘다 동시에 리시브상태에 들어서는 사태가 발생하네요 ㅠㅜ
일단 개략적인 소스는
server----------------------------
void User::Run() //관리자 쓰레드에서 돌아갈 Run 멤버 함수
{
char buf[BUFFER]; //입출력 버퍼
cout<<"start admin"<<endl;
string temp = "";
temp += "수행하고자 하는 명령어를 입력해 주세요.(명령어를 알고 싶다면 help를 입력하세요.)\n";
temp += ">>";
memset(buf,0x00,BUFFER); //버퍼 초기화
memcpy(buf,temp.c_str(),temp.size()); //버퍼에 출력할 문자열 복사
send(*admin,buf,BUFFER,0); //전달, 여기서 에러
temp.clear();
try{
while(true)
{//명령을 반복적으로 받아서 명령 처리 멤버함수에 전달
char buf[128] = "";
string command = "";
recv(*admin,buf,BUFFER,0);
this->command(*(new string(buf)));
send(*admin,END,strlen(END),0);
}
}
catch(exception e)
{//명령처리 함수에서 에러(종료신호, 소켓연결 끊어짐)를 던지면 쓰레드 함수 종료
}
}
void User::connectUser(SOCKET *client)
{
char buf[BUFFER] = "ID :"; //입출력버퍼 생성과 출력 자료 초기화
send(*client,buf,BUFFER,0); //버퍼 전송
send(*client,END,BUFFER,0); //전송파일 끝 신호 전송
recv(*client,buf,BUFFER,0); //자료 리시브, 자료는 ID의 문자열값
int ID = 0; //ID는 숫자로만 이루어지게 만들어져서 숫자로 치환
char dex[10] = {'0','1','2','3','4','5','6','7','8','9'};
for(int i = 0, a = 100000; i < strlen((const char *)buf) ;i++)
{
for(int j=0;j<10;j++)
{
if(buf[i] == dex[j])
{
ID += j * a;
break;
}
}
a /= 10;
if(a < 1) break;
}
if(ID == 0) //관리자 ID는 000000이라 숫자로 0
{
if(admin != NULL) closesocket(*admin);
this->admin = client;
memset(buf,0x00,BUFFER); //버퍼 초기화
memcpy(buf,"암호 :",strlen("암호 :")); //문자열 세팅
send(*admin,buf,BUFFER,0); //버퍼전송
memset(buf,0x00,BUFFER); //버퍼초기화
memcpy(buf,END,strlen(END)); //종료신호 셋팅
send(*admin,buf,BUFFER,0); //전송
while(true)
{
char pass[BUFFER] = ""; //암호 입력 버퍼
recv(*admin,pass,BUFFER,0); //암호 리시브
if(password == *(new string(pass))) //암호 확인
{
break; //암호 재확인 안함
}
char *msg = "암호가 틀렸습니다.\n암호 :"; //암호 재확인, 위와 동일
memset(buf,0x00,BUFFER);
memcpy(buf,msg,strlen(msg));
send(*admin,msg,BUFFER,0);
memset(buf,0x00,BUFFER);
memcpy(buf,END,strlen(END));
send(*admin,END,BUFFER,0);
}
this->Begin();//관리자 쓰레드 시작
}
}
client--------------------------
while(true)// 반복해서 리시브와 샌드
{
char buf[BUFFER]; //입출력 버퍼
memset(buf,0x00,BUFFER); //초기화
recv(client,buf,BUFFER,0); //리시브
if(buf[0] == 'E' && buf[1] == 'N' && buf[2] == 'D')
{//만약 리시브한 신호가 리시브 종료 신호라면
cin>>str; //표준입력, str은 string클래스로 초기에 선언되어있음
memcpy(buf,str.c_str(),str.size()); //버퍼에 복사
send(client, buf,BUFFER,0); //샌드
}
else
{
cout<<buf; //샌드하지 않을때는 리시브한 버퍼 출력
}
}
전반적인 소스는 이런데 오류가 생기는 부분이 서버의 유저클래스가 쓰레드거든요
그런데 인수로 받은 클라이언트와 받은 소켓을 멤버변수에 저장하고 쓰레드를 실행하면
쓰레드에서 샌드를 못하고 클라이언트에서 리시브를 못하네요 ㅠㅜ
뭐가 문제인걸까요;
댓글 분란 또는 분쟁 때문에 전체 댓글이 블라인드 처리되었습니다.