안녕하세요?
업/다운로드 컨트롤러를 개발하고 있는데요..
수신기에서 가끔 포트가 충돌이 나는건지 뻗어 버립니다. 그럼 포트가 죽다가 다시 살아나는데 시간이 걸리고..
그동안은 클라이언트에서도 당연 작동이 안되구요 ..
아래와 같이 작성을 했는데요.. 좀 야매로 배웠습니다 ㅠ
특정 포트 9310 으로 서로 전송을 하는데요..
아래의 소스에서 제가 뭔가 실수한거라도 있을까요? 고수님들 조언좀 부탁드립니다.
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define BUFSIZE 126976
void *file_send_thread(void *client_sock_arg);
int recvn(int s, char *buf, int len);
void Data_print(char *msgs);
void Data_print(char *msgs)
{
// FILE *fp = fopen("tmp.txt", "a+");
// fprintf(fp,"%s\n",msgs);
// fclose(fp);
}
int recvn(int s, char *buf, int len)
{
int received;
char *ptr = buf;
int left = len;
while(left > 0)
{
received = read(s, ptr, left);
if(received == -1)
return -1;
else if(received == 0)
break;
left -= received;
ptr += received;
}
return (len - left);
}
int main(int argc, char *argv[])
{
int retval;
pthread_t tid;
char tmp_msg[200];
signal(SIGPIPE, SIG_IGN);
int listen_sock = socket(AF_INET, SOCK_STREAM, 0);
if(listen_sock == -1)
{
Data_print("socket() error");
}
struct sockaddr_in serveraddr;
memset(&serveraddr, 0, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(9310);//9000
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
retval = bind(listen_sock, (struct sockaddr*) &serveraddr, sizeof(serveraddr));
if(retval == -1)
{
Data_print("bind() error");
exit(0);
}
retval = listen(listen_sock, 5);
if(retval == -1)
{
Data_print("listen() error");
}
int client_sock;
char client_sock_tmp[20];
struct sockaddr_in clientaddr;
int addrlen;
char buf[BUFSIZE];
while(1)
{
addrlen = sizeof(clientaddr);
client_sock = accept(listen_sock, (struct sockaddr*) &clientaddr, &addrlen);
if(client_sock == -1)
{
Data_print("accept() error");
}
sprintf(tmp_msg,"\n->FileSender connect : IP = %s, Port = %d\n", inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port));
Data_print(tmp_msg);
sprintf(tmp_msg,"Client Sock ID : %d\n",client_sock);
Data_print(tmp_msg);
sprintf(client_sock_tmp,"%d",client_sock);
if(pthread_create(&tid,NULL, file_send_thread,client_sock_tmp)<0)
{
Data_print("thrad create error:");
}
}
close(listen_sock);
return 0;
}
void *file_send_thread(void *client_sock_arg)
{
pthread_t tid;
int client_sock;
int retval;
int file_total_size;
char tmp_msg[200];
char buf[BUFSIZE];
char filename_dir[256];
memset(filename_dir, 0, sizeof(filename_dir));
char filename[256];
memset(filename, 0, sizeof(filename));
char save_filename[256];
tid =pthread_self();
client_sock =atoi(client_sock_arg);
//file dir
retval = recvn(client_sock, buf, BUFSIZE);
sprintf(filename_dir,"./files/%s",buf);
if(!mkdir(filename_dir,0777))
{
chmod(filename_dir,0777);
}
//file name
retval = recvn(client_sock, buf, BUFSIZE);
strcpy(filename,buf);
//file size
retval = recvn(client_sock, buf, BUFSIZE);
sprintf(save_filename,"%s%s",filename_dir,filename);
FILE *fpc = fopen(save_filename,"r");
if(fpc==NULL)
file_total_size=0;
else
{
fseek(fpc, 0, SEEK_END);
file_total_size=ftell(fpc);
fclose(fpc);
}
sprintf(tmp_msg,"Base_filesize : %d\n",file_total_size);
Data_print(tmp_msg);
sprintf(buf,"%12d",file_total_size);
retval = write(client_sock, buf, strlen(buf));
if(retval == -1)
{
Data_print("sock write() error!\n");
}
else
{
sprintf(tmp_msg,"save filename %s\n",save_filename);
Data_print(tmp_msg);
FILE *fp = fopen(save_filename,"a");
if(fp == NULL)
{
Data_print("File I/O error");
}
else
{
int numtotal = 0;
while(1)
{
retval = recvn(client_sock, buf, BUFSIZE);
if(retval == -1)
{
Data_print("recv() error");
break;;
}
else if(retval == 0) break;
else
{
fwrite(buf, 1, retval, fp);
numtotal += retval;
}
}
fclose(fp);
Data_print("-> File trans complete\n");
}
}
close(client_sock);
pthread_exit(NULL);
}
읽어 주셔서 감사합니다~!