Created
July 28, 2019 05:06
-
-
Save surinoel/04a425dd507232a1293f5a6258ce2417 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
#include <unistd.h> | |
#include <sys/types.h> | |
#include <sys/socket.h> | |
#include <arpa/inet.h> | |
#define BUF_SIZE 1024 | |
#define OPSZ 4 | |
int main(int argc, char **argv) | |
{ | |
int sock; | |
char opmsg[BUF_SIZE]; | |
int result, opnd_cnt; | |
struct sockaddr_in serv_addr; | |
if(argc != 3) { | |
printf("usage : %s <IP> <PORT>\n", argv[0]); | |
return -1; | |
} | |
sock = socket(AF_INET, SOCK_STREAM, 0); | |
if(sock < 0) { | |
perror("socket"); | |
return -1; | |
} | |
memset(&serv_addr, 0, sizeof(serv_addr)); | |
serv_addr.sin_family = AF_INET; | |
serv_addr.sin_addr.s_addr = inet_addr(argv[1]); | |
serv_addr.sin_port = htons(atoi(argv[2])); | |
if(connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { | |
perror("connect"); | |
close(sock); | |
return -1; | |
} | |
printf("Operand Count : "); | |
scanf("%d", &opnd_cnt); | |
opmsg[0] = (char)opnd_cnt; | |
for(int i=0; i<opnd_cnt; i++) { | |
scanf("%d", (int *)&opmsg[1+OPSZ*i]); | |
} | |
printf("Operator : "); | |
scanf(" %c", &opmsg[opnd_cnt*OPSZ+1]); | |
write(sock, opmsg, opnd_cnt*OPSZ+2); | |
read(sock, &result, sizeof(int)); | |
printf("Operand result : %d\n", result); | |
close(sock); | |
return 0; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
#include <unistd.h> | |
#include <arpa/inet.h> | |
#include <sys/types.h> | |
#include <sys/socket.h> | |
#define BUF_SIZE 1024 | |
#define OPSZ 4 | |
int calculate(int opcnt, int opinfo[], char op) | |
{ | |
int sum = opinfo[0]; | |
switch(op) | |
{ | |
case '+': | |
for(int i=1; i<opcnt; i++) { | |
sum += opinfo[i]; | |
} | |
break; | |
case '-': | |
for(int i=1; i<opcnt; i++) { | |
sum -= opinfo[i]; | |
} | |
break; | |
case '*': | |
for(int i=1; i<opcnt; i++) { | |
sum *= opinfo[i]; | |
} | |
break; | |
} | |
return sum; | |
} | |
int main(int argc, char **argv) | |
{ | |
int sock, clnt_sock; | |
struct sockaddr_in sock_addr, clnt_addr; | |
socklen_t clnt_size; | |
char opinfo[BUF_SIZE]; | |
int recv_cnt, recv_len; | |
int opnd_cnt, result; | |
sock = socket(AF_INET, SOCK_STREAM, 0); | |
if(sock < 0) { | |
perror("sock"); | |
return -1; | |
} | |
memset(&sock_addr, 0, sizeof(sock_addr)); | |
sock_addr.sin_family = AF_INET; | |
sock_addr.sin_addr.s_addr = htonl(INADDR_ANY); | |
sock_addr.sin_port = htons(atoi(argv[1])); | |
if(bind(sock, (struct sockaddr *)&sock_addr, sizeof(sock_addr)) < 0) { | |
perror("bind"); | |
close(sock); | |
return -1; | |
} | |
if(listen(sock, 5) < 0) { | |
perror("listen"); | |
close(sock); | |
return -1; | |
} | |
clnt_size = sizeof(clnt_addr); | |
for(int i=0; i<5; i++) { | |
clnt_sock = accept(sock, (struct sockaddr *)&clnt_addr, &clnt_size); | |
if(clnt_sock < 0) { | |
perror("accept"); | |
close(sock); | |
return -1; | |
} | |
read(clnt_sock, &opnd_cnt, 1); | |
recv_len = 0; | |
while(recv_len < opnd_cnt*OPSZ +1) { | |
recv_cnt = read(clnt_sock, &opinfo[recv_len], BUF_SIZE - 1); | |
if(recv_cnt < 0) { | |
perror("read"); | |
close(sock); | |
close(clnt_sock); | |
return -1; | |
} | |
recv_len += recv_cnt; | |
} | |
result = calculate(opnd_cnt, (int*)opinfo, opinfo[recv_len -1]); | |
write(clnt_sock, &result, sizeof(result)); | |
close(clnt_sock); | |
} | |
close(clnt_sock); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment