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

kdg0886의 이미지

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

----------client------------

#include
#include

#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
#include

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