|
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <stdio.h>
#include "WinSock2.h"
#include <conio.h>
//---------------------------------------------------------------------------
bool AcceptClient(int main_sock);
#pragma argsused
int main(int argc, char* argv[])
{
#if defined (__DEBUG)
if (argc != 3)
printf("argc error\n");
#endif
#if defined (__DEBUG)
char const *ip = argv[1];
int port = atoi(argv[2]);
#else
char const *ip = "211.52.8.153";
int port = 6176;
#endif
int err_check;
DWORD sockver = MAKEWORD(2, 0);
WSADATA sockdata;
err_check = WSAStartup(sockver, &sockdata);
if (err_check)
{
if (err_check == WSASYSNOTREADY)
ShowMessage("WSASYSNOTREADY");
else if (err_check == WSAVERNOTSUPPORTED)
ShowMessage("WSAVERNOTSUPPORTED");
else if (err_check == WSAEINPROGRESS)
ShowMessage("WSAEINPROGRESS");
else if (err_check == WSAEPROCLIM)
ShowMessage("WSAEPROCLIM");
else if (err_check == WSAEFAULT)
ShowMessage("WSAEFAULT");
else
ShowMessage("I don't know what error occured");
WSACleanup();
return 0;
}
int loop_socket = 0;
sockaddr_in this_addr;
loop_socket = socket(AF_INET, SOCK_STREAM, 0);
if (loop_socket == SOCKET_ERROR)
{
printf("socket error\n");
WSACleanup();
getch();
return 0;
}
this_addr.sin_family = AF_INET;
this_addr.sin_port = htons(port);
this_addr.sin_addr.S_un.S_addr = inet_addr(ip);
memset(this_addr.sin_zero, 0, 8);
err_check = bind(loop_socket, (struct sockaddr*)&this_addr, sizeof(struct sockaddr));
if (err_check == SOCKET_ERROR)
{
printf("bind error\n");
closesocket(loop_socket);
WSACleanup();
getch();
return 0;
}
err_check = listen(loop_socket, SOMAXCONN);
if (err_check == SOCKET_ERROR)
{
printf("listen error\n");
closesocket(loop_socket);
WSACleanup();
getch();
return 0;
}
timeval tv;
fd_set readfds, writefds;
tv.tv_sec = 100;
tv.tv_usec = 0;
while (1)
{
FD_ZERO(&readfds);
FD_SET(loop_socket, &readfds);
err_check = select(0, &readfds, NULL, NULL, &tv);
if (err_check < 0)
{
printf("select error\n");
closesocket(loop_socket);
WSACleanup();
break;
}
else if (err_check == 0)
{
printf("time out\n");
break;
}
else
{
if (FD_ISSET(loop_socket, &readfds))
{
if (AcceptClient(loop_socket))
printf("#####################\n");
else
printf("@@@@@@@@@@@@@@@@@@@@@\n");
}
}
}
getch();
return 0;
}
//---------------------------------------------------------------------------
bool AcceptClient(int main_sock)
{
sockaddr_in there_addr;
int dup_socket, err_check = 0;
char *buffer = new char[64];
timeval tv;
fd_set readfds, writefds;
tv.tv_sec = 10;
tv.tv_usec = 0;
int size = sizeof(sockaddr_in);
dup_socket = accept(main_sock, (sockaddr*)&there_addr, &size);
if (dup_socket == SOCKET_ERROR)
{
printf("accept error\n");
closesocket(main_sock);
WSACleanup();
getch();
return false;
}
while(1)
{
memset(buffer, 0, sizeof(buffer));
FD_ZERO(&readfds);
FD_ZERO(&writefds);
FD_SET(dup_socket, &readfds);
FD_SET(dup_socket, &writefds);
err_check = select(0, &readfds, &writefds, NULL, &tv);
if (err_check < 0)
{
printf("select error\n");
closesocket(dup_socket);
closesocket(main_sock);
WSACleanup();
return false;
}
else if (err_check == 0)
{
printf("time out\n");
return false;
}
else
{
if (FD_ISSET(dup_socket, &readfds))
{
int count = recv(dup_socket, buffer, strlen(buffer), MSG_PEEK);
if (count <= 0)
return false;
printf("%s\n", buffer);
}
else if (FD_ISSET(dup_socket, &writefds))
{
scanf("%s", buffer);
send(dup_socket, buffer, strlen(buffer), MSG_DONTROUTE);
printf("%s\n", buffer);
}
}
}
delete [] buffer;
return true;
}
//---------------------------------------------------------------------------
|