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

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);
 
}

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.