2021.05.11 - [1인 1프로젝트] - 코딩 중
이전의 글에 이어 Process함수와 그 함수를 바탕으로 recv, send함수를 구현했다.
void remote(char * ip, int port){
int SocketNum = socket(PF_INET, SOCK_STREAM, 0);
struct sockaddr_in server_addr;
if(SocketNum < 0){
printf("Socket 오류");
exit(0);
}
memset( &server_addr, 0, 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 (inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr) != 1) {
printf("inte_pton");
exit(0);
}
if( -1 == connect( SocketNum, (struct sockaddr*)&server_addr, sizeof( server_addr) ) )
{
printf( "접속 실패\n");
exit( 1);
}
fd[1][0] = SocketNum;
fd[0][1] = SocketNum;
printf("Set Connnection with %s:%d", ip, port);
}
int process(char * path){
pid_t pid;
if(pipe(fd[0]) < 0){
printf("pipe error");
exit(0);
}
if(pipe(fd[1]) < 0){
printf("pipe error");
exit(0);
}
switch(pid = fork()){
case -1:
printf("fork error");
return -1;
case 0:
close(fd[1][0]);
close(fd[0][1]);
close(1);
close(0);
dup2(fd[1][1], STDOUT_FILENO);
dup2(fd[0][0], STDIN_FILENO);
execl(path, path, NULL);
}
close(fd[1][1]);
close(fd[0][0]);
char buf[1000];
printf("[*] Starting local process... pid is %d\n", pid);
return 0;
}
int Recvuntil(char * str, int print){
int i = 0, len = strlen(str), cnt = 0; // i : index, len : source length, cnt : total recv amount
char * tmp = (char * ) calloc(1, len);
while(1){
read(fd[1][0], tmp + i, 1);
cnt++;
if(print == 1) write(1, tmp + i, 1);
if(*(tmp + i) == *(str + i)) i++;
else i = 0;
if(i == len - 1){
free(tmp);
return cnt;
};
}
}
char * Recv(int cnt, int print){
char * tmp;
int len;
tmp = (char * ) calloc(1, cnt + 1); // cnt + 1 : NULL 문자 때문에
len = read(fd[1][0], tmp, cnt);
if(print == 1) printf("%s\n", tmp);
return tmp;
}
int Send(char * str){
return write(fd[0][1], str, strlen(str));
}
int Send32(char * str){ // 0 값을 보내기 위한 함수. strlen("\x00") = 0이기 때문
return write(fd[0][1], str, 4);
}
int Send64(char * str){
return write(fd[0][1], str, 8);
}
int Sendline(char * str){
int len;
char * tmp = (char * ) calloc(1, strlen(str) + 2); // strlen(str) + 2 : '\n' 개행 문자 , NULL 때문에
strcpy(tmp, str);
strcat(tmp, "\n");
len = Send(tmp);
free(tmp);
return len;
}