C언어 IPC관련 간단한 질문이에요!!
글쓴이: 떼찌할꼬야 / 작성시간: 화, 2011/12/06 - 5:22오후
프로그램은 이러합니다. WINAPI를 공부하는 도중에 생긴 질문입니다.
질문 1)
server쪽에는 학생 이름과 학점이 있고요, client는 이름을 서버쪽에 보내면 서버가 클라이언트한테 그 학생의 성적을 보내줍니다.
그런데, 저는 왜 자꾸 학점을 보낼 때 이상한 문자로 나타나는 걸까요;; string 형으로 A 문자를 보내면 보내는 쪽이나 받는 쪽이나 이상하게 뜹니다;;
예를 들면 이렇습니다..
receive : choi
send : A
이런식이 정상인데 A가 안들어가고 이상한 문자가 들어갑니다.
유니코드 문제인건가요??
질문 2)
텍스트 파일에
choi A
park B
lee C
다음과 같이 저장되어있을 때, 이것을 이름은 이름배열에 학점은 다른 학점 배열에 저장하고 싶은데;;
간단해 보이는데 쉽게 안되네요... 조금만 도와주세요 ㅠ
////////////////소스입니다...
#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <tchar.h>
#define nameSize 5
#define BUFSIZE 5
#define BUF_SIZE 1024
//server는 txt파일을 읽고, 배열에 저장하고, 요청하는 이름에 대해 학점을 출력해야 한다.
int main(int argc, char* argv[])
{
int i=0; //for문 돌리기 위한 counter
char* name[5]; //name array
char* score[5]; // score array
struct sockaddr_in srvSAddr; //서버 구조체 듣기위한 소켓
struct sockaddr_in connectAddr; // 통신하기 위한 소켓 구조체
DWORD addrLen;
WSADATA wsa; //윈도우 소켓 비동기식 구조체
DWORD servVal;
SOCKET srvSock, sockio; //듣기위한 소켓과 통신하기 위한 소켓
char sendScore[BUF_SIZE+5];
char reqName[BUF_SIZE+5]; //clinet가 보낸 이름 저장소
int temp; //배열에서 search할 때 사용
FILE *fr;
char torken;
LPSTR TEMP;
WSAStartup(MAKEWORD(2,0), &wsa); //원속 초기화
//파일을 연다.
fr= fopen(argv[1], "r");
if(!fr)
{
printf("File open error!\n");
return 0;
}
//배열들을 초기화
for(i=0; i<nameSize; i++)
{
name[i] = "empty";
score[i] = "F";
}
//파일로부터 읽어들임.
/*while((torken = fgetc(fr)) != EOF)
{
if((torken >= 'a' && torken <= 'z') || (torken >= 'A' && torken <= 'Z'))
strcat(name[i], (char*)torken);
else if(torken == ' ')
{
torken = fgetc(fr);
score[i] = (char*)torken;
torken = fgetc(fr);
i++;
}
}*/
//임시 배열 초기화
name[0] = "kim";
name[1] = "choi";
name[2] = "park";
name[3] = "lee";
name[4] = "jang";
score[0] = "A";
score[1] = "B";
score[2] = "A";
score[3] = "B";
score[4] = "A";
for(i=0; i<nameSize; i++)
printf("%s %s\n", name[i], score[i]);
//서버 구조체 초기화
srvSock = socket(AF_INET, SOCK_STREAM, 0);
memset( &srvSAddr, 0, sizeof(srvSAddr));
srvSAddr.sin_family = AF_INET;
srvSAddr.sin_addr.s_addr = htonl(INADDR_ANY);
srvSAddr.sin_port = htons(50000);
//소켓 바인드
servVal = bind(srvSock, (struct sockaddr*) &srvSAddr, sizeof srvSAddr);
//리슨하기 위해 준비
servVal = listen(srvSock, 5);
while(1)
{
//클라이언트 주소크기를 설정
addrLen = sizeof(connectAddr);
//accept가 있는지 기다린다.
sockio = accept(srvSock, (struct sockaddr*) &connectAddr, &addrLen);
//recv를 받는다.
servVal = recv(sockio, reqName, BUF_SIZE, 0);
printf("receive : %s\n", reqName);
//학점을 send해 준다.
temp = 0;
for(i=0; i<nameSize; i++)
if(!strcmp(reqName, name[i])) //이름 검색 후 학점을 찾아줌.
temp = i;
//이름을 배열에 없으면 x를 보내고, 있으면 학점을 보낸다.
if(temp == 0)
*sendScore = "이름이 존재하지 않습니다.";
else
*sendScore = score[i];
servVal = send(sockio, sendScore, sizeof(sendScore)+1, 0);
TEMP = (LPSTR)sendScore;
printf("보낸학점 : %s\n", TEMP);
}
shutdown(sockio, SD_BOTH);
closesocket(sockio);
servVal = WSACleanup();
fclose(fr);
return 0;
}
}-----------------------------
혹시 파일에서 string char 를 입력받으면 각각의 string배열과 char 배열에 저장하려고 하는데 이것도 잘 안되네요;;; 다른 방법이 있나요?
Forums:


댓글 테스트
ㄷㄷ
----------------------------------------------------------------------
세상은 나와 내가 아닌 사람들이 살아가는 곳!!
길이 문제 같은데, 실제 소스가 있어야 문제파악이 될 듯 합니다.
A 가 안들어가는건지,
A대신 다른 게 들어가는 건지,
A와 다른 게 들어가는 건지,
기타등등 다른 것도 많아서요. -_-;;
좀 더 자세한 설명을 해 주셔야 어떤 게 원인인지 추측할 수 있을 듯 합니다.
소스는 이러합니다.
수정한 댓글
----------------------------------------------------------------------
세상은 나와 내가 아닌 사람들이 살아가는 곳!!
댓글 달기