[완료]UDP로 파일복사 서버&클라이언트 만들고 있는데 질문있습니다..

kdg0886의 이미지

UDP로 파일복사 서버&클라이언트 만들고 있는데 질문있습니다..
a.txt 같은 텍스트 파일은 용량이 커도 다 읽히는데
mp3 같은 파일은 5메가라도 초반부분만 읽고 끝나버리는데 그 이유를 모르겠어요
한두번 읽으면 바로 파일 끝으로 포인터가 가버리네요 이유가 뭘까요?ㅠ

추가)
실수가 있었네요.. 클라이언트부에서 바이너리로 안열었습니다...
동영상이나 엠피3는 잘전송되는데 한글파일은 깨지네요 그 이유는 뭘까요?

----------client------------
 
#include <stdio.h>
#include <Winsock2.h>
 
#define	FILE_SVC_PORT	5491
#define BUF_SIZE	512
 
void sockSetAddress(struct sockaddr_in * pSockAddr, char *pstrIP, unsigned short nPort);
void sockError(int bQuit);
 
int main(int argc, char* argv[])
{
	FILE* out;	// file pointer
 
	WSADATA wsa;
 
	struct sockaddr_in	local_addr;
	SOCKET	s;
 
	// Argument processing
	if(argc==1)	// no optiong
	{
		fopen_s(&out, "ufile.dat","wb");
	}
	else if(argc != 3)	// wrong argument
	{
		printf("Usage : %s -f file\n", argv[0]);
		exit(1);
	}
	else if(strcmp(argv[1],"-f") != 0)	// wrong option
	{
		printf("Usage : %s -f file\n", argv[0]);
		exit(1);
	}
	else	// option
	{
		fopen_s(&out, argv[2],"wb");
	}
 
	// Winsock Initialization
	if (WSAStartup(MAKEWORD(2,2), &wsa) < 0)
		sockError(1);
 
	// Open a Socket
	if ( (s = socket (AF_INET, SOCK_DGRAM, 0)) < 0 )
		sockError(1);
 
	// Set local address & BIND
	sockSetAddress(&local_addr, NULL, FILE_SVC_PORT);
	if ( bind(s, (SOCKADDR *)&local_addr, sizeof(local_addr)) == SOCKET_ERROR)
		sockError(1);
 
	puts("====UDP File Server====");
	// Receive & echo back 
	{
		struct sockaddr client_addr;
		int	len_addr = sizeof(client_addr);
		int	retval;
 
		char buf[BUF_SIZE];
 
		while (1) 
		{
			memset(buf, 0x00, sizeof(buf));
 
			retval = recvfrom(s, buf, BUF_SIZE, 0, &client_addr, &len_addr);
 
			if (retval > 0)
			{
				//retval = sendto(s, buf, retval, 0, (SOCKADDR *) &client_addr, len_addr);
				fwrite(buf, sizeof(char), retval, out);
			}
			else
				break;
 
			if (retval == SOCKET_ERROR)
			{
				sockError(0);
				break;
			}
		} 
	}
 
	// Close the opened socket
	closesocket(s);
 
 
	// Winsock Finalization
	WSACleanup();
 
	return 0;
}
 
void sockSetAddress(struct sockaddr_in * pSockAddr, char *pstrIP, unsigned short nPort)
{
	if (!pSockAddr) return;
 
	pSockAddr->sin_family = AF_INET;
	pSockAddr->sin_port = htons(nPort);
 
	if (pstrIP)
	{
		if (isdigit(pstrIP[0]))
		{
			pSockAddr->sin_addr.s_addr = inet_addr(pstrIP);
		}
		else
		{
			HOSTENT * pHostent;
 
			if (pHostent = gethostbyname(pstrIP))
				memcpy(&pSockAddr->sin_addr.s_addr, pHostent->h_addr, pHostent->h_length);
			else
				pSockAddr = NULL;
		}
	}
	else
	{
		pSockAddr->sin_addr.s_addr = htonl(INADDR_ANY);
	}
}
 
void sockError(int bQuit)
{
    LPVOID lpMsgBuf;
    FormatMessage ( 
            FORMAT_MESSAGE_ALLOCATE_BUFFER |
            FORMAT_MESSAGE_FROM_SYSTEM |
            FORMAT_MESSAGE_IGNORE_INSERTS,
            NULL, WSAGetLastError( ),
            MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
            (LPTSTR)&lpMsgBuf, 0, NULL ) ;
    MessageBox ( NULL, (LPCTSTR)lpMsgBuf, "Error",               
                             MB_OK | MB_ICONINFORMATION ) ;
    LocalFree ( lpMsgBuf );
 
	if (bQuit) exit(1);
}
 
 
 
----------server------------
#include <stdio.h>
#include <Winsock2.h>
 
#define	FILE_SVC_PORT	5491
#define BUF_SIZE	512
 
void sockSetAddress(struct sockaddr_in * pSockAddr, char *pstrIP, unsigned short nPort);
void sockError(int bQuit);
 
int main(int argc, char* argv[])
{
	FILE* out;	// file pointer
 
	WSADATA wsa;
 
	struct sockaddr_in	local_addr;
	SOCKET	s;
 
	// Argument processing
	if(argc==1)	// no optiong
	{
		fopen_s(&out, "ufile.dat","wb");
	}
	else if(argc != 3)	// wrong argument
	{
		printf("Usage : %s -f file\n", argv[0]);
		exit(1);
	}
	else if(strcmp(argv[1],"-f") != 0)	// wrong option
	{
		printf("Usage : %s -f file\n", argv[0]);
		exit(1);
	}
	else	// option
	{
		fopen_s(&out, argv[2],"wb");
	}
 
	// Winsock Initialization
	if (WSAStartup(MAKEWORD(2,2), &wsa) < 0)
		sockError(1);
 
	// Open a Socket
	if ( (s = socket (AF_INET, SOCK_DGRAM, 0)) < 0 )
		sockError(1);
 
	// Set local address & BIND
	sockSetAddress(&local_addr, NULL, FILE_SVC_PORT);
	if ( bind(s, (SOCKADDR *)&local_addr, sizeof(local_addr)) == SOCKET_ERROR)
		sockError(1);
 
	puts("====UDP File Server====");
	// Receive & echo back 
	{
		struct sockaddr client_addr;
		int	len_addr = sizeof(client_addr);
		int	retval;
 
		char buf[BUF_SIZE];
 
		while (1) 
		{
			memset(buf, 0x00, sizeof(buf));
 
			retval = recvfrom(s, buf, BUF_SIZE, 0, &client_addr, &len_addr);
 
			if (retval > 0)
			{
				//retval = sendto(s, buf, retval, 0, (SOCKADDR *) &client_addr, len_addr);
				fwrite(buf, sizeof(char), retval, out);
			}
			else
				break;
 
			if (retval == SOCKET_ERROR)
			{
				sockError(0);
				break;
			}
		} 
	}
 
	// Close the opened socket
	closesocket(s);
 
 
	// Winsock Finalization
	WSACleanup();
 
	return 0;
}
 
void sockSetAddress(struct sockaddr_in * pSockAddr, char *pstrIP, unsigned short nPort)
{
	if (!pSockAddr) return;
 
	pSockAddr->sin_family = AF_INET;
	pSockAddr->sin_port = htons(nPort);
 
	if (pstrIP)
	{
		if (isdigit(pstrIP[0]))
		{
			pSockAddr->sin_addr.s_addr = inet_addr(pstrIP);
		}
		else
		{
			HOSTENT * pHostent;
 
			if (pHostent = gethostbyname(pstrIP))
				memcpy(&pSockAddr->sin_addr.s_addr, pHostent->h_addr, pHostent->h_length);
			else
				pSockAddr = NULL;
		}
	}
	else
	{
		pSockAddr->sin_addr.s_addr = htonl(INADDR_ANY);
	}
}
 
void sockError(int bQuit)
{
    LPVOID lpMsgBuf;
    FormatMessage ( 
            FORMAT_MESSAGE_ALLOCATE_BUFFER |
            FORMAT_MESSAGE_FROM_SYSTEM |
            FORMAT_MESSAGE_IGNORE_INSERTS,
            NULL, WSAGetLastError( ),
            MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
            (LPTSTR)&lpMsgBuf, 0, NULL ) ;
    MessageBox ( NULL, (LPCTSTR)lpMsgBuf, "Error",               
                             MB_OK | MB_ICONINFORMATION ) ;
    LocalFree ( lpMsgBuf );
 
	if (bQuit) exit(1);
}

댓글 달기

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