일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- beans
- 투자
- System
- function
- JavaScript
- 노드
- jsp
- CSS
- Kafka
- 악성코드
- UTF-8
- meta
- OOP
- windows
- CLASS
- WebProgramming
- HTML
- Sort
- query
- c++
- array
- 포인터
- C
- 자료구조
- Call-by-reference
- request
- API
- java
- algorithm
- 윈도우즈
- Today
- Total
hahahia
[TCP/IP] 온라인 사칙연산 서비스 구현 본문
클라이언트에서 피연산자 2개와 연산자 1개를 입력받으면 서버에서 연산을 하여 다시 클라이언트에게 결과값을 보여주는 프로그램을 만들어보았습니다.(리눅스 환경)
/* server */
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/time.h>
#define PORT 3600
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 client_addr, sock_addr;
int listen_sockfd, client_sockfd;
int addr_len;
struct cal_data rdata;
int left_num, right_num;
short int cal_result;
if((listen_sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("error");
return 1;
}
memset((void *)&sock_addr, 0x00, 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_sockfd, (struct sockaddr *)&sock_addr, sizeof(sock_addr)) == -1)
{
perror("error");
return 1;
}
if(listen(listen_sockfd, 5) == -1)
{
perror("error");
return 1;
}
while(1)
{
addr_len = sizeof(client_addr);
client_sockfd = accept(listen_sockfd, (struct sockaddr *)&client_addr, &addr_len);
if(client_sockfd == -1)
{
perror("error");
return 1;
}
read(client_sockfd, (void *)&rdata, sizeof(rdata)); // 소켓에서 데이터를 읽어옴
rdata.error = 0;
left_num = ntohl(rdata.left_num); // 네트워크 바이트 순서 변환
right_num = htonl(rdata.right_num);
switch(rdata.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)
{
rdata.error = 2;
break;
}
cal_result = left_num / right_num;
break;
default:
rdata.error = 1;
}
rdata.result = htonl(cal_result); // 결과 값을 네트워크 바이트 순서에 맞춤.
rdata.error = htons(rdata.error);
write(client_sockfd, (void *)&rdata, sizeof(rdata)); // 전송~
close(client_sockfd);
}
close(listen_sockfd);
return 0;
}
'Linux > Linux Programming' 카테고리의 다른 글
Linux TCP/IP 소켓 프로그래밍 (0) | 2013.01.27 |
---|---|
Linux Shell 구현 (0) | 2013.01.27 |