간단한 소켓프로그램인데요, 소켓 연결은 되는데 값이 저장이 안되는 것 같아요ㅠㅠ
cal_data라는 구조체를 만들어서 연산자와 피연산자를 넘겨주는건데요....
소켓 연결까지는 되는데, 리눅스에서 실행해보면(./프로그램명 연산자 피연산자 연산기호)
서버에서 계산한 답이 나와야 하는데 그냥 %d %c %d = %d 이렇게 문자가 뜹니다ㅋㅋㅠㅠㅠㅠㅠ
소켓프로그래밍을 이제 막 공부하는 중이라 잘못된 부분이 어디인지를 봐도 잘 모르겠어요ㅠㅠ
어디가 잘못된건가요?ㅠㅠㅠㅠㅠ
////////////////client-리눅스//////////////////
struct cal_data
{
int left_num;
int right_num;
char op;
int result;
short int error;
};
int main(int argc, char **argv)
{
struct sockaddr_in server_addr;
struct cal_data rdata;
int server_sockfd;
char buffer[256];
int len;
int left_num, right_num;
if(argc != 4)
{
perror("Usage : %s [num1] [num2] [0p]\n", argv[0]);
return 1;
}
rdata.left_num = atoi(argv[1]);
rdata.right_num = atoi(argv[2]);
rdata.op = argv[3][0];
server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
if((server_sockfd = socket(AF_INET, SOCK_STREAM, 0) == -1))
{
perror("error :");
return 1;
}
memset((void *)&server_addr, 0x00, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
server_addr.sin_addr.s_addr = inet_addr(IP);
if(connect(server_sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1)
{
perror("connnect error :");
return 1;
}
rdata.left_num = htonl(rdata.left_num);
rdata.right_num = htonl(rdata.right_num);
read(server_sockfd, (void *)&rdata, sizeof(rdata));
rdata.error = 0;
write(server_sockfd, (void *)&rdata, sizeof(rdata));
rdata.error = 0;
if(ntohs(rdata.error != 0))
{
perror("CALC error %d\n", ntohs(rdata.error));
}
perror("%d %c %d = %d\n", ntohl(rdata.left_num), rdata.op, ntohl(rdata.right_num), ntohl(rdata.result));
close(server_sockfd);
return 0;
}
/////////////////////////server-윈도우/////////////////////////////
struct cal_data
{
int left_num;
int right_num;
char op;
int result;
short int error;
};
int main(int argc, char **argv)
{
WSADATA WSAData;
sockaddr_in client_addr, sock_addr;
SOCKET listen_s, client_s;
int len, addr_len;
struct cal_data sdata;
int left_num, right_num;
short int cal_result;
int recvn, sendn;
if(WSAStartup (MAKEWORD (2,2), &WSAData) != 0)
{
return 1;
}
listen_s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(listen_s == INVALID_SOCKET)
{
return 1;
}
ZeroMemory((void *)&sock_addr, sizeof(sock_addr));
sock_addr.sin_family = AF_INET;
sock_addr.sin_addr.s_addr = htonl(INADDR_ANY);
sock_addr.sin_port = htons(PORT);
if(bind(listen_s, (struct sockaddr *)&sock_addr, sizeof(sock_addr)) == -1)
{
printf("Error ");
return 1;
}
if(listen(listen_s, 5) == -1)
{
printf("Error ");
return 1;
}
for(;;)
{
addr_len = sizeof(client_addr);
client_s = accept(listen_s, (struct sockaddr *)&client_addr, &addr_len);
if(client_s == -1)
{
printf("Error ");
return 1;
}
len = sizeof(sdata);
recvn = recv(client_s, (char *)&sdata, len, 0);
if(recvn != len)
{
return 1;
}
sdata.error = 0;
left_num = ntohs(sdata.left_num);
right_num = ntohs(sdata.right_num);
switch(sdata.op)
{
case '+':
cal_result = left_num + right_num;
break;
case '-':
cal_result = left_num - right_num;
break;
case '*':
cal_result = left_num * right_num;
break;
case '/':
if(right_num == 0)
{
sdata.error = 2;
break;
}
cal_result = left_num / right_num;
break;
default:
sdata.error = 1;
}
sdata.result = htonl(cal_result);
sdata.error = htons(cal_result);
sendn = send(client_s, (char *)&sdata, len, 0);
if(sendn != len)
{
return 1;
}
closesocket(client_s);
}
closesocket(listen_s);
WSACleanup();
return 0;
}

일단 에코 서버/클라이언트 부터 만들어보세요. 계산기
일단 에코 서버/클라이언트 부터 만들어보세요.
지금 보니까 에코 서버/클라이언트를 만들기 위한 부분에서 문제가 있어요. 계산기 서버는 그 다음 단계 입니다.
말씀하신 것과 95% 쯤 똑같은 예제가 "열혈 TCP/IP 소켓프로그래밍 - 윤성우" 이라는 책에 있습니다. 혹시 지금 이책으로 공부하시는거 아닌가요? 너무 똑같은 주제라서요..
위 책 자료실에 보면 예제 코드가 있고 5장 예제 코드에 원하시는 정답에 해당하는 코드가 있어요..
그리고 소스코드는 여기 올릴 때 태그를 사용하세요..
'*' 대신 '<', '**' 대신 '>' 입니다.
*code**
server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
if((server_sockfd = socket(AF_INET, SOCK_STREAM, 0) == -1))
{
perror("error :");
return 1;
}
*/code**
server_sockfd = socket(AF_INET, SOCK_STREAM, 0); if((server_sockfd = socket(AF_INET, SOCK_STREAM, 0) == -1)) { perror("error :"); return 1; }이렇게 하면 되요..
위 코드에서 문제가 바로 보이죠? socket 을 왜 두번 호출했나요? 먼저 만든 소켓은 고아가 되었네요..
Thanks for being one of those who care for people and mankind.
I'd like to be one of those as well.
다시 한번
감사합니다. 다시 한번 해봐야겠어요!