[소켓] Winsock 프로그래밍 질문입니다.

dummy999의 이미지

Winsock에서 C언어로 프로그램을 짜고있습니다.
클래스는 이용하지않습니다.

-----------------------------------------------------

recv()를 사용하는 모듈인데 select를 이용해 타임아웃을 설정하려합니다.
이부분을 어떻게 구현 해야하는지 간단한예로 코딩부탁드립니다.

-----------------------------------------------------

통신을 하는데 서버쪽 프로그램은 제가 만들지않아서 잘모릅니다. 저는 클라이언트쪽이거든요
그런데 제가 보내면 상대방은 못받았다고만합니다.
제가 봤을땐 동기화문제같은데.. (서버쪽 소스자체가 없습니다.)
동기화문제좀해결할수있는 방법이있었음합니다.

상황이 서버는 무조건받아서 반송해주는 쪽이고 클라이언트가 접속하면 무조건주는쪽입니다.
그런데 서버가 어떻게 동작을 하는지 모르겠지만 어느순간되면 못받는다고 하더라구요.
통신은 TCP로 하고있습니다.

서버가 죽었는지 확인하기위해서 Ping개념의 Alive메시지를 주기는합니다.
그런데 TCP통신쪽에서는 그것을 확인할수있었음좋겠습니다.

맺어있지만 끊어지면 바로 Reconnection을 할수있게 말입니다.

dummy999의 이미지

위에건 답이 없더라도 이어서 글을써야할꺼같아요..
나중에 제가 찾아보기 편하게 하려고합니다.
-------------------------------------------------

질문내용 ::
같은 아이피에서 같은포트로 클라이언트2개가 1개의 다른서버에 물리고 거기서 송수신이 가능할까요?


-----[client]-----------------------------------------[server]------

  A.exe(1.1.1.1:1111) <-----(tcp/ip)---> +------------------------+
                                         | 사양모름(2.2.2.2:포트번호) |
  B.exe(1.1.1.1:1111) <-----(tcp/ip)---> +------------------------+

서버의 포트번호는 잘모름.. 이상하게 달라도가능하다라는 말을 들은적이있었고
얼핏보니까. 서버의 포트가 다른것같았음

그림을 정확하게 맞추기위해 몇차례 수정되었음.

서버는알기로는 두개의 프로그램으로 되어있다고 들었는데 저는 잘모릅니다.
일단 제가 해야할것은 클라이언트인데 현재는 하나로 작업중입니다.
그런데 이것을 두개로 분할해야합니다.

문제가 될수있을거라생각하는것은 하나의 아이피(하나의 시스템)에 동일한 포트를 쓰면서
통신이 가능한가 문제입니다.

예전에 제가 두개로 만들어 서버와 연결해봤더니 둘다 접속이 되더라구요..
그런데.. 서버의 포트가 1개라고되어있길래 하나로 합쳐놨더니..
A.exe가 주고 B.exe가 받을때 못받는것같더라구요..
그리고 얼핏그때의 기억엔 A와 B가 통신을 해버리는듯한.. -_-;;
다시말해 A가 주기만하는 TASK(프로그램)이고 B가 받기만한 프로그램이라면..
A가 주자마자 B가 select로 뭔가를 반응하는것같더라구요..
실질적으로는 서버를 거쳐 받게되어있는데 그게맞는건지 전혀 감을 잡을수없어서
도움을 요청합니다.

참고로 메아리 서버(Echo Server, 소켓통신할때 기본적으로 해보는 다중 연결서버프로그램 인터넷 참조)
에대한 개념과는 좀다른것같습니다.
메아리서버는 적어도 아이피를 통해서 서로 구분시킬수있지만.. 이경우 아이피도 포트도 모두동일한조건이라
뭘어떻게 구분되어 전송하는건지 궁금합니다.

혹시 서버에서 브로드캐스팅(한꺼번에 여러 목적지에 전송)하는것을 하고있지않을까생각해봤는데
이경우는 제가 잘알지못합니다.
(물론 위의 메아리서버도 마찬가지지만.. 하나의 아이피에 브로드캐스팅이 가능한건지..잘모름
된다면 될수도있을꺼같은데..)
그메커니즘이 어떻게 된건지 궁금합니다.

아이 TEST하기가 좀처럼 힘듭니다.
프로그램들이 10개이상 상주해있는 온라인상에서는 작업잘못했다가
사고날수도있고 혼자서하자니 많은프로그램들이 각각 서로의존하고있고
저역시 그것을 이용하지않으면 안되는것이라... -_-;;;

------------------------------------
F/OSS bless you... ^^*

kihongss의 이미지

같은 IP, 같은 포트라 함은 서버에 연결하는 소켓주소(IP주소+포트)를 말씀하시는거겠지요?
서버에서 대기하고 있는 소켓이 그 소켓주소로 연결을 기다리는 상황같군요.
서버에서 대기하고 있는 소켓주소의 소켓으로로 일단 연결이 되면, 다른
소켓주소가 배정된 소켓이 생성되고, 그 녀석하고 클라이언트가 통신을 하게 됩니다.

dummy999의 이미지

kihongss님이 말하시는것은 서버가 fork를해서 자식프로세스와 연결되어있음을 말하는건가요?

서버
부모프로세스
 |
 +- 자식프로세스 : 클라이언트 1.1.1.1에서 연결된소켓
 |
 +- 자식프로세스 : 클라이언트 1.1.1.3에서 연결된소켓
         :
         :
 +- 자식프로세스 : 클라이언트 주소 에서 연결된소켓

kihongss님은 이것을 말하시는거라 사료됩니다만..
서버가 지속적으로 자식을 Accept가능하다는 전제하에 되는 다중접속서버라고 저는 알고있습니다.

그런데 과연 위의 방식을 기반으로 클라이언트가 동일 아이피에서 접속했을때 이게 가능한가입니다.
아래처럼요..

서버
부모프로세스
 |
 +- 자식프로세스 : 클라이언트 1.1.1.1에서 연결된소켓
 |
 +- 자식프로세스 : 클라이언트 1.1.1.1에서 연결된소켓

그런데 서버가 그렇게 안되어있을수도있습니다.
듣기로는 서버는 프로그램이 두개라서 1:1로 연결된다라고도 들었습니다.

일단 이것은 서버가 그렇게 설계되어있는지가문제인데..
그렇게 안되어있다면 하나가 물렸을때 다른하나는 물릴수없습니다.
이런경우엔

-----[client]-----------------------------------------[server]------ 

  A.exe(1.1.1.1:1111) <-----(tcp/ip)---> AA.exe(2.2.2.2:포트번호)
                                              ↕
  B.exe(1.1.1.1:1111) <-----(tcp/ip)---> BB.exe(2.2.2.2:포트번호)

서버가 어떻게 생겼는지도 모른체 유추를 해댈려하니까...
여튼 지금상황에서는 서버가 어떻게 생겼고 어떻게 되었던지간에 아래처럼
서버가 접속이 가능한지 궁금합니다.

-----[client]-----------------------------------------[server]------ 

  A.exe(1.1.1.1:1111) <-----(tcp/ip)---> +------------------------+ 
                                         | 사양모름(2.2.2.2:포트번호) | 
  B.exe(1.1.1.1:1111) <-----(tcp/ip)---> +------------------------+ 

제가 확인할수있는사실은 예전에 클라이언트가 2개였을때 접속하니까. 둘다 동시에 접속이되는거같더라구요
그때 저는 하나의 연결이 성립된곳에 다른클라이언트가 그서버에 물리면 그것도 연결은 되지않지만 물려지는것이
아닌가 생각해봤습니다.
아래그림처럼요..

-----[client]-----------------------------------------[server]------ 

  A.exe(1.1.1.1:1111) <-----(tcp/ip)---> AA.exe(2.2.2.2:포트번호)
                                        
  B.exe(1.1.1.1:1111) <-----(tcp/ip)---> 임의로 AA의 연결에반응됨. 

서버가 어덯게 생겻는지만 알수잇다면 좋겠지만. 아니니까. 어떻게 방법이 없습니다.
그림이 엄청 많습니다.

------------------------------------
F/OSS bless you... ^^*

charsyam의 이미지

음 서버의 경우는 1.1.1.1:2222 번 포트고

클라이언트1 - 1.1.1.1:1111
클라이언트2 - 1.1.1.1:1112 여야 합니다.

만약 1은 TCP, 2는 UDP 라면 같은 1111을 쓸수있지만(레이어가
틀리기 때문입니다.) 같은 TCP에 클라이언트 1,2 가
같은 IP에 같은 포트는 쓸수 없는걸로 알고 있습니다. 고운 하루되시길...

뭐, select 는

while( select ( 타임아웃) > 0 )
{
recv();
}

뭐, 이런식으로 하면 간단하게 처리됩니다. 고운 하루되세요.

=========================
CharSyam ^^ --- 고운 하루
=========================

댓글 달기

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