파일 전송 프로그램 1:1 [리눅스 용] 만들어 봤는데 조언 부탁드

skylandi의 이미지

넘 허접하게 만들엇는데(테스트 상 ㅠㅠ)
조언 좀 얻고자 이케 글을 올립니다.
파일을 주고 받을때 전송할때 사이즈는 대략 얼마로 해야 할지 모르겟습니다. 남은 시간 구하는 방법도 갈켜 주시면 감사 드리겟습니다.
좋은 하루 되시길...
서버입니다.

#include <stdio.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <netdb.h>

#define MAXSIZE 2048

int main(int argc,char *argv[])
{
	struct sockaddr_in server,client;
	int sd,client_len,len,fd,newsd;
	char buf[MAXSIZE];
	off_t offset;
	long total;

	if(argc !=2)
	{
		printf("사용법 %s 전송할파일이름\n",argv[0]);
		exit(0);
	}

	if((sd=socket(PF_INET,SOCK_STREAM,0)) < 0)
	{
		printf("소켓 개설 실패\n");
		exit(1);
	}

	bzero((char *)&server,sizeof(server));

	server.sin_family=AF_INET;
	server.sin_port=htons(4001);
	server.sin_addr.s_addr=htonl(INADDR_ANY);

	if(bind(sd,(struct sockaddr *)&server,sizeof(server)) < 0)
	{
		printf("bind error\n");
		exit(0);
	}

	listen(sd,5);
	
	client_len=sizeof(client);
	newsd=accept(sd,(struct sockaddr *)&client,&client_len);

	fd=open(argv[1],O_RDONLY,0); // 파일 이름 argv[1]
	total=lseek(fd,0,SEEK_END); // 전송할 파일 크기

	printf("전송할 파일 크기 %ld \n",total);
	sprintf(buf,"%ld",total);
	send(newsd,buf,MAXSIZE,0);

	lseek(fd,0,SEEK_SET);
	while((len=read(fd,buf,MAXSIZE)) > 0)
	{
		len=send(newsd,buf,len,0);

		if(len == MAXSIZE)
		{
			total-=(long)len;
			if(total <= 0)
			{
				printf("성공적으로 보내기 완료\n");
				len=0;
				break;
			}
			else
			{
//				printf("성공 적으로 보내서 %ld 가 남았음\n",total);
				continue;
			}
		}
		else if(len < MAXSIZE)
		{
			total-=(long)len;
			if(total <= 0)
			{
				printf("성공 완료\n");
				break;
			}
			printf("비 성공적으로 %d 보냇당 그러나 %ld 만큼 남았다\n",len,total);
		}
		else if(len == -1)
		{
			printf("전송 실패\n");
			exit(0);
		}
	}

	close(sd);
	close(fd);
	return 0;
}

클라이언트 입니다.
#include <stdio.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <netdb.h>
#define MAXSIZE 2048


int main(int argc,char *argv[])
{
	struct sockaddr_in client;
	int sd,len,fd;
	char buf[MAXSIZE];
	long total;
	char a;

	if(argc !=2)
	{
		printf("사용법 %s 받을 이름\n",argv[0]);
		exit(0);
	}

	if((sd=socket(PF_INET,SOCK_STREAM,0)) < 0)
	{
		printf("소켓 개설 실패\n");
		exit(1);
	}

	bzero((char *)&client,sizeof(client));

	client.sin_family=AF_INET;
	client.sin_port=htons(4001);
	client.sin_addr.s_addr=htonl(INADDR_ANY);

	if(connect(sd,(struct sockaddr *)&client,sizeof(client)) < 0)
	{
		printf("error\n");
		exit(0);
	}

	fd=open(argv[1],O_WRONLY|O_CREAT|O_TRUNC,0644); // 파일 이름 argv[1]

	recv(sd,buf,MAXSIZE,0);
	total=atol(buf);
	printf("전송 받을 크기%ld\n",total);

	while((len=recv(sd,buf,MAXSIZE,0)) > 0)
	{
		len=write(fd,buf,len); 

		if(len == MAXSIZE)
		{
			total-=(long)len;
			continue;
//			printf("성공 적으로 받아와서 %ld 가 남았음\n",total);
		}
		else if(len < MAXSIZE)
		{
			total-=(long)len;
			if(total <= 0)
			{
				printf("성공 완료\n");
				break;
			}
			printf("비 성공적으로 %d 받아왓당 그러나 %ld 만큼 남았다\n",len,total);
		}
		else if(len == -1)
		{
			printf("전송 실패\n");
			exit(0);
		}
	}
	close(sd);
	close(fd);
	return 0;
}

맘고생 많이 하는 새벽에 ㅜㅜ
towngo의 이미지

최근에 패치서버를 만든적이 있었는데..

머 아시겠지만.. 주고 받는 패킷에 보내는 패킷의 크기를 같이 보내는 방법이 이용합니다. 받을때 그 크기를 보고 받게 되죠..

주고 받는 패킷의 크기가 자유롭게 변해두 잘 받고 보내진다면..
이걸 이용해서... 패킷의 크기를 바꿔보는거죠.

현재 패킷 크기일때 총패킷수를 구해서 거기에 루프를 한번 도는 시간을 곱하는 방법으로 전체 보내는 시간을 계산합니다.
글구.. 패킷 크기를 변화시켜 보면서 계산을 계속해 보는거죠..
머.. 그러면서 계속 시간을 비교해 보시면 되지 않을까 싶네요..

머 어떻게 변화시키는가 하는건 머 사람마다 다르겠죠.. ^^;

파일이 아주 크고.. 주고 받는 거리가 멀다면 모를까.. 로컬에서는 별차이가 없었다는.. 쿨럭~

하여간 허접데기 생각이었습니다..
아.. 쓰는김에.. TCP/IP에서 항상 정확히 간다고 알고는 있지만 항상 그렇지도 않은것 같네요.. T^T

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.