C/S 계속들어오는 메시지 처리방법 도움부탁드립니다.T_T

ktlsu1231의 이미지

안녕하세요.
짧으면 10ms 로 소켓을 통해 스트링 메시지가 주루룩주루룩 들어옵니다.
버퍼에 쌓여 가끔 메시지가 뭉쳐서 들어오는 경우도 많습니다.

그래서 뭉쳐서 들어오는 메시지는 잘라 원래형태로 복원을 하여
처리하는 과정을 거치고 있습니다.

문제는 뭉쳐서 들어오는 메시지를 가공하는 시간에 새로운 메시지가
처리되어 먼저도착한 것과 가공처리된 것 시간이 뒤바뀌는 경우가 있습니다.
(사실 이것이 메시지 가공시간에 뒤틀리는 것인지 아니면 메시지 들어올 때
순서가 바뀌어 들어오는 것인지 파악이 잘 안됩니다.)

그래서 클라이언트측 메시지에 시간데이터를 넣었지만 그 메시지를
다시 가공처리 후 DB에 Insert해야하는데, 시간이 뒤틀어지면
안되는 문제가 있어서요.

이것을 DB에 넣기 전에 Sort시켜 먼저도착한 메시지순으로 DB에 넣어주어야합니다.

Queue도 생각해보고, 일반 Sort방법도 생각해 보았지만,
메시지가 쏟아져 들어오는 주기가 너무 짧아서 고정버퍼에서 정렬하기도
힘들고, 정렬끝난 후 새로 들어온 들어온 메시지가 정렬된 메시지들 사이에
들어가야 하는 시간을 가질 수도 있어서요.

이 문제를 해결할 방법이 있을까요?

TCP/IP 소켓통신에서 메시지 도착 순서는 발송순서대로 오는 줄 알았는데,
꼭 그렇지도 않은 것 같고 어렵습니다.

도와주세요. 흐흑..

kslee80의 이미지

TCP 소켓이라면 오는 데이터가 뒤바뀌는 일은 없을텐데요?
클라이언트에서 뒤바껴서 오지 않는 이상 보내진 순서와 받는 순서는 같습니다.
(이건 TCP 에서 보장됩니다.)

클라이언트가 n 개거나 혹은 multi-threaded 로 여러 thread 에서 동시에 메세지를 보내거나
하는 경우라면 데이터가 뒤바뀔 여지가 많으니 이럴 때는 또 다른 방법을 고민해 봐야겠지만,

클라이언트가 하나이고, 메세지를 보내는 thread 가 하나라면
TCP 의 특성상 보내는 순서와 받는 순서는 뒤바뀌지 않으니
다른 문제로 인해 뒤바뀌는 것이 아닌가 확인해 보셔야 할 겁니다.

P.S.) (노파심에서) UDP 라면 보낸 메세지와 받는 메세지의 손서가 보장되지 않습니다.

IsExist의 이미지

답변을 해드리게 충분한 정보가 없습니다. 프로토콜에 대한 설명을 좀더 추가해 준다면 답변을 다는데 더 도움이 될듯 합니다.

소켓 타입에 대한 정보도 알려주세요.
---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

익명사용자의 이미지

버퍼를 하나더 쓰고,
소켓 버퍼에서 추가된 버퍼로 복사를 하고, 소켓버퍼는 비워줍니다.

재귀호출방식으로 추가된 버퍼내의 메시지를 파싱하면서,
버퍼가 빌때까지 하나씩 하나씩 다 디비에 밖아 넣습니다.
물론 패킷(메시지)은 STX, ETX가 있으면 좋죠.

추가된 버퍼가 다 비면,
다시 소켓 버퍼의 것을 추가된 버퍼로 복사하는 방식으로 처리하면 어떨까염?

ktlsu1231의 이미지

안녕하세요.

죄송합니다. 설명이 부족했습니다.

클라이언트는 현재 14대 잡혀있습니다. 증설예정입니다.

TCP사용하고 있습니다.

그리고, 해결했습니다. ^^

메시지 들어오는 부분에 array로 Size가 item에 따라
자동증감되는 원형큐를 붙여놓았더니 정상적으로 처리되었습니다.

메시지를 받자마자 약간의 부하를 주었던 것이 순서가 서로 뒤엉켜
버린 이유인 것 같습니다.

tcp/ip는 보낸 순서대로 받는 것이 확실하네요. ^^;;

감사합니다.

댓글 달기

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