soket client 질문입니다
안녕하세요
많은 자료들을 참고하다가
처음가입하여 질문을 남깁니다
많은 답변 부탁드리겠습니다
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. 수정을 한다면 어떻게 해야 하는지요?
정말 답답하여 질문을 올립니다
부탁 좀 드리겠습니다


댓글 달기