간단한 소켓통신을 만들고 있습니다
클라이언트쪽에서 문자열을 보내면 서버는 그대로 에코하는 방식이거든요
이게 서버랑 클라이언트 연결도 정상적으로 되고 클라이언트에서 send 반환값이 문자열 길이가 나오는거 보니 보내기도 정상인것 같은데 서버에서 recv로 나오는 반환값이 0인경우가 있어요
근데 웃긴게 이게 계속 이런게 아니라 간헐적으로 이런 현상이 있습니다...
처음에 프로그램 실행해서 첫 문자열 보냈을때 정상적으로 에코하면 계속 정상 작동합니다
근데 프로그램을 닫고 재실행 했을때 첫 에코가 안되면(recv반환이 0이면) 계속 0이 반환되네요
왜이러는지 알려주실 능력자님 도와주십쇼ㅠㅠㅠ
<서버>------------------------------------------------------------------------------------------
int szClntAddr, strLen, fdNum, i;
int recv_len = 0;
int option, optlen;
TIMEVAL timeout;
fd_set reads, cpyReads;
if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
ShowMessage("Server WSAStartup Error");
return;
}
servSock = socket(PF_INET, SOCK_STREAM, 0);
if(servSock == INVALID_SOCKET)
{
ShowMessage("Server Socket Error");
return;
}
optlen = sizeof(option);
option = true;
setsockopt(servSock, SOL_SOCKET, SO_REUSEADDR, (char*)&option, optlen);
memset(&servAddr, 0, sizeof(servAddr));
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
servAddr.sin_port = htons(8000);
if(bind(servSock, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR)
{
ShowMessage("Server Bind Error");
return;
}
if(listen(servSock, 5) == SOCKET_ERROR)
{
ShowMessage("Server Listen Error");
return;
}
FD_ZERO(&reads);
FD_SET(servSock, &reads);
while(1)
{
char temp_message[BUF_SIZE];
char recv_message[BUF_SIZE];
int temp, count = 0;
cpyReads = reads;
timeout.tv_sec = 3;
timeout.tv_usec = 0;
if((fdNum = select(0, &cpyReads, 0, 0, &timeout)) == -1)
break;
if(fdNum == 0)
continue;
for(i = 0 ; i < reads.fd_count ; i++)
{
if(FD_ISSET(reads.fd_array[i], &cpyReads))
{
if(reads.fd_array[i] == servSock)
{
szClntAddr = sizeof(clntAddr);
clntSock = accept(servSock, (SOCKADDR*)&clntAddr, &szClntAddr);
if(clntSock == INVALID_SOCKET)
ShowMessage("Server Accept Error");
FD_SET(clntSock, &reads);
Panel_Message->Caption = "Connected Client....";
Application->ProcessMessages();
}
else
{
while((strLen = recv(reads.fd_array[i], temp_message, strlen(temp_message), 0)) != 0)
{
for(temp = 0 ; temp < strLen ; temp++)
recv_message[count++] = temp_message[temp];
send(clntSock, temp_message, strLen, 0);
recv_len += strLen;
}
recv_message[recv_len] = 0;
if(recv_len != 0)
{
Server_Memo->Lines->Add("메세지를 받았습니다. 메세지를 다시 전달 합니다.");
recv_len = 0;
}
if(strLen == 0)
{
FD_CLR(reads.fd_array[i], &reads);
closesocket(cpyReads.fd_array[i]);
Panel_Message->Caption = "Closed Client....";
Application->ProcessMessages();
}
}
}
}
}
closesocket(servSock);
WSACleanup();
return;
}
<클라이언트>--------------------------------------------------------------------------------------
AnsiString temp = Edit_DrawUp->Text;
int str_len, recv_len, recv_cnt, i = 0;
char * message;
message = temp.c_str();
Client_Memo->Lines->Add("Client>> " + AnsiString(message));
if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
ShowMessage("Client WSAStartup Error");
return;
}
clntSock = socket(PF_INET, SOCK_STREAM, 0);
if(clntSock == INVALID_SOCKET)
{
ShowMessage("Client Socket Error");
return;
}
memset(&servAddr, 0, sizeof(servAddr));
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = inet_addr(addr);
servAddr.sin_port = htons(8000);
if(servAddr.sin_addr.s_addr == INADDR_NONE)
{
ShowMessage("INET_ADDR Error");
return;
}
if(connect(clntSock, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR)
{
ShowMessage("Client Connect Error");
return;
}
Panel_Message->Caption = "Connected Server....";
Application->ProcessMessages();
recv_len = 0, recv_cnt = 0;
str_len = send(clntSock, message, strlen(message), 0);
while(recv_len < str_len)
{
recv_cnt = recv(clntSock, message, str_len, 0);
if(recv_len == -1)
{
Client_Memo->Lines->Add("Client>> 메세지가 전송되지 않았습니다.");
break;
}
recv_len += recv_cnt;
}
message[str_len] = 0;
if(str_len != 0 && recv_cnt != -1)
Client_Memo->Lines->Add("Server>> " + AnsiString(message));
Edit_DrawUp->Clear();
closesocket(clntSock);
WSACleanup();
|