소켓에 select를 걸고 select의 read가 들어올때 read를 2번 하려고 하는데 잘 안되네요~

skminho의 이미지

리눅스 기반이구요~ 서버쪽 입니다.

FD_ZERO(&selt);
FD_SET(unix_sock, &selt);
FD_SET(g_inet_sock, &selt);
select_rtn = select(maxfd+1, &selt, 0, 0, 0);

/* 외부, 내부 socket 데이터 수신에 따른 처리 함수 호출 */
if(select_rtn > 0)
{
if(FD_ISSET(unix_sock,&selt))
{

printf("내부 소켓\n");

}
if(FD_ISSET(g_inet_sock,&selt))
{
printf("외부 소켓\n");
out_rtn = outside_data();
if(out_rtn <= 0)
{
return -1;
}
fflush(g_inet_sock);
}
}

int outside_data()
{
int flag = 0;
int rd_rtn;
int size = 0;

char recv_buff[1024];

if(flag == 0)
{
flag = 1;

rd_rtn = read(g_inet_sock, recv_buff, 2); //길이를 리드 하는 부분

size = size(recv_buff); //사이즈를 구하고 리턴
}

else if(flag == 1)
{
flag = 0;

rd_rtn = read(g_inet_sock, recv_buff, size); //전체 패킷을 리드 하는 부분

process_data(recv_buff); //업무처리 하는 함수 콜

}
}
위에 방식으로 select를 걸었습니다.

inet에서 select가 걸려서 outside_data()함수로 가서 리드를 2번 하고 싶은데 잘 안됩니다.ㅠ.ㅠ

처음에는 패킷의 길이를 알기위해 read를 하고요 2번째는 총길이를 알고 나서 그만큼 리드를 하기 위해 또한번 리드를 하게 됩니다.

그리고 처음에는 클라이언트에서 보내는 값과 동일하게 나옵니다. 하지만 2번째 리드할때 데이터를 못받는 것인지 값이 출력이 안됩니다.

클라이언트에서는 write를 2번 하고 있습니다.

그리고 또 하나는 fflush(g_inet_sock);를 안해주면 printf("외부소켓\n")을 엄청 찍더라고요~

fflush(g_inet_sock); 이 무슨 역할을 하는 것인지? 궁금합니다. 대략으론 버퍼를 비워 주는 걸로 알고 있는데 맞는지요?

이상입니다.^^

chadr의 이미지

flag가 지역변수인데 전역변수같이 쓰셨네요.

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

skminho의 이미지

지금 현재 계속 테스트중에 수정하였습니다.

감사합니다. 그래도 안되요.ㅠ.ㅠ

나빌레라의 이미지

일단 소켓 초기화 코드가 제대로 되었는지 확인 한 번 더 해보시고요,

read()는 위 코드처럼 if-else if로 분리할 필요 없이

read(sock, &size, sizeof(int));
read(sock, buff, size);

이렇게 연달아서 읽으면 됩니다.
물론 클라이언트에서도

size=패킷크기;
write(sock, &size, sizeof(int));
write(sock, buff, size);

이렇게 그냥 연달아 보내면 되고요.

----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라

댓글 달기

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