게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
C++ 능력자분들 도움좀 주세요 ㅠㅜ
게시물ID : science_3468짧은주소 복사하기
작성자 : 행인Ω
추천 : 0
조회수 : 968회
댓글수 : 3개
등록시간 : 2010/12/07 21:48:24
제가 지금 <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; //샌드하지 않을때는 리시브한 버퍼 출력
}
}

전반적인 소스는 이런데 오류가 생기는 부분이 서버의 유저클래스가 쓰레드거든요

그런데 인수로 받은 클라이언트와 받은 소켓을 멤버변수에 저장하고 쓰레드를 실행하면

쓰레드에서 샌드를 못하고 클라이언트에서 리시브를 못하네요 ㅠㅜ

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