소켓을 이용한 클라이언트 파일 수신기 도와주세요.ㅠ

shin0128의 이미지

안녕하세요?

업/다운로드 컨트롤러를 개발하고 있는데요..

수신기에서 가끔 포트가 충돌이 나는건지 뻗어 버립니다. 그럼 포트가 죽다가 다시 살아나는데 시간이 걸리고..

그동안은 클라이언트에서도 당연 작동이 안되구요 ..

아래와 같이 작성을 했는데요.. 좀 야매로 배웠습니다 ㅠ

특정 포트 9310 으로 서로 전송을 하는데요..

아래의 소스에서 제가 뭔가 실수한거라도 있을까요? 고수님들 조언좀 부탁드립니다.

#include <STDIO.H>
#include <STDLIB.H>
#include <STRING.H>
#include <UNISTD.H>
#include <ARPA inet.h>
#include <SYS types.h>
#include <SYS socket.h>
#include <PTHREAD.H>
#include <SIGNAL.H>
 
#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);
 
}