soket client 질문입니다

lchangd2의 이미지

안녕하세요

많은 자료들을 참고하다가

처음가입하여 질문을 남깁니다

많은 답변 부탁드리겠습니다

Client 쓰레드 소스입니다
DWORD WINAPI TCPClient(LPVOID arg)
{
int retval,retval2,retval3;

WSADATA wsa;
if(WSAStartup(MAKEWORD(2,2), &wsa) !=0)
return -1;
///////////////////////////////////////////////////////////// <-- SOCK
sock[0] = socket(AF_INET, SOCK_STREAM, 0);
if(sock[0] == INVALID_SOCKET)
err_display("socket()");

u_long on =1;

retval = ioctlsocket(sock[0], FIONBIO, &on);
if(sock[0] == SOCKET_ERROR)
err_display("ioctlsocket()");

//connect()
SOCKADDR_IN serveraddr;
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(9009);
serveraddr.sin_addr.s_addr = inet_addr("155.155.4.6");
connect(sock[0], (SOCKADDR *)&serveraddr, sizeof(serveraddr));

///////////////////////////////////////////////////////////// <-- SOCK2
sock[1] = socket(AF_INET, SOCK_STREAM, 0);
if(sock[1] == INVALID_SOCKET)
err_display("socket()");

on =1;

retval = ioctlsocket(sock[1], FIONBIO, &on);
if(sock[1] == SOCKET_ERROR)
err_display("ioctlsocket()");

//connect()
SOCKADDR_IN serveraddr2;
serveraddr2.sin_family = AF_INET;
serveraddr2.sin_port = htons(9010);
serveraddr2.sin_addr.s_addr = inet_addr("155.155.4.6");
connect(sock[1], (SOCKADDR *)&serveraddr2, sizeof(serveraddr2));

///////////////////////////////////////////////////////////// <-- SOCK3
sock[2] = socket(AF_INET, SOCK_STREAM, 0);
if(sock[2] == INVALID_SOCKET)
err_display("socket()");

on =1;

retval = ioctlsocket(sock[2], FIONBIO, &on);
if(sock[2] == SOCKET_ERROR)
err_display("ioctlsocket()");

//connect()
SOCKADDR_IN serveraddr3;
serveraddr3.sin_family = AF_INET;
serveraddr3.sin_port = htons(9011);
serveraddr3.sin_addr.s_addr = inet_addr("155.155.4.6");
connect(sock[2], (SOCKADDR *)&serveraddr3, sizeof(serveraddr3));

//Server Comunication
while(1)
{
//
WaitForSingleObject(TCPWrite, INFINITE);

retval = send(sock[0], buf, strlen(buf), 0);

if(retval == SOCKET_ERROR)
{
TCP_Route1=false;
closesocket(sock[0]);
//route1 close sock route2
retval2 = send(sock[1], buf, strlen(buf), 0);
retval3 = send(sock[2], buf, strlen(buf), 0);
if(retval2 == SOCKET_ERROR)
{
TCP_Route2=false;
closesocket(sock[1]);
}
else
TCP_Route2=true;
if(retval3 == SOCKET_ERROR)
{
TCP_Route3=false;
closesocket(sock[2]);
}
else
TCP_Route3=true;
}
else
{
SetEvent(TCPRead);
TCP_Route1=true;
continue;
}

if(!TCP_Route1)
{
sock[0] = socket(AF_INET, SOCK_STREAM, 0);
u_long on =1;
ioctlsocket(sock[0], FIONBIO, &on);
connect(sock[0], (SOCKADDR *)&serveraddr, sizeof(serveraddr));
}

if(!TCP_Route2)
{
sock[1] = socket(AF_INET, SOCK_STREAM, 0);
u_long on =1;
ioctlsocket(sock[1], FIONBIO, &on);
connect(sock[1], (SOCKADDR *)&serveraddr2, sizeof(serveraddr2));
}

if(!TCP_Route3)
{
sock[2] = socket(AF_INET, SOCK_STREAM, 0);
u_long on =1;
ioctlsocket(sock[2], FIONBIO, &on);
connect(sock[2], (SOCKADDR *)&serveraddr3, sizeof(serveraddr3));
}

SetEvent(TCPRead);
}
SetEvent(TCPRead);
return 0;
}

위와 같이

3개의 소켓을 쓰레드로 돌립니다

커넥션은 블럭을 피하기 위해 넌블러킹으로 설정하였습니다

1개의 소켓의 send 함수 기준으로 send 실패시 소켓을 닫고

넌 블러킹으로 소켓접속을 다시 연결될때까지 합니다

그상황에 나머지 소켓2개는 send를 하여 send 성공시 커넥션을 더이상 하지않고

send만 하도록 되어있습니다

결론은

잘될때는 잘됩니다

1,2,3 소켓을 껏다 켯다를 반복하면

넌 블러킹 때문인지 몰라도 서버를 실행시키면

클라이언트가 connect Disconnect connect Disconnect connect Disconnect 하다가 메세지를 받게됩니다

질문점은

1. 위소스는 문제가 없는 소스인지요?(넌블러킹 connect와 closesocket을 계속해서 발생함 소켓1번 오류시)
2. 수정을 한다면 어떻게 해야 하는지요?

정말 답답하여 질문을 올립니다
부탁 좀 드리겠습니다

댓글 달기

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