C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[56371] 도와주세요.ㅠ 소켓을 이용한 클라이언트 파일 수신기
신상욱 [] 1666 읽음    2009-03-05 14:57
안녕하세요?

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

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

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

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

특정 포트 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);

}




읽어 주셔서 감사합니다~!

+ -

관련 글 리스트
56371 도와주세요.ㅠ 소켓을 이용한 클라이언트 파일 수신기 신상욱 1666 2009/03/05
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.