겨우 초당 몇십 킬로바이트 정도의 데이터를 받는
프로그램인데요
서버에서 데이터를 이상없이 보내는 것은 확인했는데
이 프로그램에서 받은 데이터를 출력해보면
보낸 값들을 다 출력하지 못하고
매우 많이 잊어먹고 있습니다.
이상해서 sleep(1)을 중간에 넣어줬더니
전혀 이상한 값들을 출력하네요.
recv 함수가 느린 것은 아닐텐데 뭐가 문제일까요?
고맙습니다.
보내는 부분과 받는 부분 관련된 소스를 보여주세요 ~~~
show me the source
<어떠한 역경에도 굴하지 않는 '하양 지훈'>
#include <com.h> <C2H5OH.h> <woman.h> do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);
받는 데이터가 15바이트여야 하는데
지금보니 75바이트가 받아졌다고 나오네요.
버퍼에 여러개가 받아지는 경우도 있나요?
버퍼값을 나눠서 확인해봐야겠지만
한번 recv에 여러개의 데이터가 받아지는 경우가 있는지 몰랐습니다.
네트워크 프로그래밍은 거의 해본적이 없어서 당황스럽네요.. oops
tcp에서 recv일경우 특별한 설정이 없으면 해당 소켓에 대한 데이터만 받아오기때문에. 클라이언트에서 보낸 고대로의 데이터를 받아옵니다.
흠..
Chaos to Cosmos, Chaos to Chaos, Cosmos to Cosmos, Cosmos to Chaos.
TCP 소켓이라면 충분히 그런 현상이 생기고도 남습니다;;
TCP 소켓은 send() 를 호출했다고 해서 패킷이 출발하는 것도 아니고, 패킷이 "앞에 놈이랑 나는 다른 놈이다!" 라는 표식을 달고 다니지도 않습니다.
그래서 TCP 로 서로 통신하는 C/S 프로그램을 짤 때는 고정크기의 자료구조를 잡아서 recv() 하는 측에서 해당 크기만큼씩 처리하거나 데이타의 길이를 먼저 보내고 데이타를 보내는 식으로 하는 경우가 많죠.
흠 제가 글을 잘 이해하지 못했던것 같네요.
kslee80님의 말씀대로입니다.
그래서 대충. int totalsize; recv(sock,(char *)totalsize,sizeof(int),0)
해서 totalsize의 값을 읽어드린 다음에 다시 recv(sock,buffer,totalsize,0); 와 같은식으로 읽어오게 됩니다.
잘읽어보고 답글을 달아야 되는데 ^^;
텍스트 포맷에 대한 자세한 정보
<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]
보내는 부분과 받는 부분 관련된 소스를 보여주세요 ~~~[b][s
보내는 부분과 받는 부분 관련된 소스를 보여주세요 ~~~
show me the source
<어떠한 역경에도 굴하지 않는 '하양 지훈'>
#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);
받는 데이터가 15바이트여야 하는데지금보니 75바이트가 받아졌다고
받는 데이터가 15바이트여야 하는데
지금보니 75바이트가 받아졌다고 나오네요.
버퍼에 여러개가 받아지는 경우도 있나요?
버퍼값을 나눠서 확인해봐야겠지만
한번 recv에 여러개의 데이터가 받아지는 경우가 있는지 몰랐습니다.
네트워크 프로그래밍은 거의 해본적이 없어서 당황스럽네요.. oops
[quote="qurugio"]한번 recv에 여러개의 데이터가 받아지는
tcp에서 recv일경우 특별한 설정이 없으면
해당 소켓에 대한 데이터만 받아오기때문에.
클라이언트에서 보낸 고대로의 데이터를 받아옵니다.
흠..
Chaos to Cosmos,
Chaos to Chaos,
Cosmos to Cosmos,
Cosmos to Chaos.
Re: TCP 소켓이신지요?
TCP 소켓이라면 충분히 그런 현상이 생기고도 남습니다;;
TCP 소켓은 send() 를 호출했다고 해서 패킷이 출발하는 것도 아니고,
패킷이 "앞에 놈이랑 나는 다른 놈이다!" 라는 표식을 달고 다니지도 않습니다.
그래서 TCP 로 서로 통신하는 C/S 프로그램을 짤 때는
고정크기의 자료구조를 잡아서 recv() 하는 측에서 해당 크기만큼씩 처리하거나
데이타의 길이를 먼저 보내고 데이타를 보내는 식으로 하는 경우가 많죠.
흠 제가 글을 잘 이해하지 못했던것 같네요.kslee80님의 말씀
흠 제가 글을 잘 이해하지 못했던것 같네요.
kslee80님의 말씀대로입니다.
그래서 대충.
int totalsize;
recv(sock,(char *)totalsize,sizeof(int),0)
해서 totalsize의 값을 읽어드린 다음에 다시
recv(sock,buffer,totalsize,0);
와 같은식으로 읽어오게 됩니다.
잘읽어보고 답글을 달아야 되는데 ^^;
Chaos to Cosmos,
Chaos to Chaos,
Cosmos to Cosmos,
Cosmos to Chaos.
댓글 달기