Skip to content

Instantly share code, notes, and snippets.

@surinoel
Created July 28, 2019 05:06
Show Gist options
  • Save surinoel/04a425dd507232a1293f5a6258ce2417 to your computer and use it in GitHub Desktop.
Save surinoel/04a425dd507232a1293f5a6258ce2417 to your computer and use it in GitHub Desktop.
#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;
}
#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