#define WIN32_LEAN_AND_MEAN #include #include #include #include #include #include //-- Prototypes: void HandleData(char *); void SendToIRC(char *, ...); int StrPos(char *, char); void SubStr(char *, int, int, char *); //-- Globals: SOCKET theSocket; int main(void) { WSADATA wsaData; SOCKADDR_IN serverInfo; LPHOSTENT hostEntry; unsigned short iPort; char * strServer; char strSRBuffer[3072]; strServer = "irc.freenode.net"; iPort = 6667; WSAStartup(MAKEWORD(2, 2), &wsaData); theSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(theSocket == INVALID_SOCKET) { WSACleanup(); return 1; } hostEntry = gethostbyname(strServer); serverInfo.sin_family = AF_INET; serverInfo.sin_addr = *((LPIN_ADDR)*hostEntry->h_addr_list); serverInfo.sin_port = htons(iPort); printf("%d -> main() -> Connecting...\n", time(0)); if(connect(theSocket, (LPSOCKADDR)&serverInfo, sizeof(struct sockaddr)) == SOCKET_ERROR) { WSACleanup(); return 1; } printf("%d -> main() -> Connected...\n", time(0)); printf("Connected to server %s:%d\n", strServer, iPort); //SendToIRC("USER SBot767 codedemons.net codedemons.net :NoName"); //SendToIRC("NICK SBot767 codedemons.net"); int bytesRecv = 0; while(bytesRecv != SOCKET_ERROR) { memset(strSRBuffer, 0, sizeof(strSRBuffer)); bytesRecv = recv(theSocket, strSRBuffer, sizeof(strSRBuffer), 0); HandleData(strSRBuffer); } closesocket(theSocket); WSACleanup(); return 0; } void HandleData(char * strBuffer) { char strCommand[16]; char strParameters[2555]; char strSource[255]; memset(strCommand, 0, sizeof(strCommand)); memset(strParameters, 0, sizeof(strParameters)); int iPos = StrPos(strBuffer, ' '); SubStr(strBuffer, iPos, strlen(strBuffer)-2, strParameters); // strip newlines from the end of the parameters SubStr(strBuffer, 0, iPos-1, strCommand); printf("%d -> HandleData() -> strBuffer = %s\n", time(0), strBuffer); // printf("%d -> HandleData() -> strCommand = %s\n", time(0), strCommand); // printf("%d -> HandleData() -> strParameters = %s\n", time(0), strParameters); if(strcmp(strCommand, "PING") == 0) { SubStr(strParameters, 1, strlen(strParameters), strSource); SendToIRC("PONG %s", strSource); } return; } void SendToIRC(char * strMessage, ...) { char strSendBuffer[3072]; memset(strSendBuffer, 0, sizeof(strSendBuffer)); va_list va; va_start(va, strMessage); vsprintf(strSendBuffer, strMessage, va); va_end(va); strcat(strSendBuffer, "\r\n"); printf("%d -> SendToIRC() -> strSendBuffer = %s\n", time(0), strSendBuffer); send(theSocket, strSendBuffer, strlen(strSendBuffer), 0); return; } int StrPos(char * strString, char cChr) { char * pch; pch = strchr(strString, ' '); if(pch == NULL) return -1; return (pch-strString+1); } void SubStr(char * strString, int iPos, int iLength, char * strReturn) { memset(strReturn, 0, strlen(strReturn)); if(iPos == -1) return; strncpy(strReturn, strString+(iPos), iLength - iPos); strcat(strReturn, "\0"); return; } ============================ OUTPUT ============================ 1164616905 -> main() -> Connecting... 1164616905 -> main() -> Connected... Connected to server irc.freenode.net:6667 1164616905 -> HandleData() -> strBuffer = NOTICE AUTH :*** Looking up your hostn ame... 1164616906 -> HandleData() -> strBuffer = NOTICE AUTH :*** Checking ident 1164616908 -> HandleData() -> strBuffer = NOTICE AUTH :*** Couldn't look up your hostname 1164616936 -> HandleData() -> strBuffer = NOTICE AUTH :*** No identd (auth) resp onse 1164616937 -> HandleData() -> strBuffer = PING :orwell.freenode.net ERROR :Closing Link: 127.0.0.1 (Connection Timed Out) 1164616937 -> SendToIRC() -> strSendBuffer = PONG orwell.freenode.net ERROR :Closing Link: 127.0.0.1 (Connection Timed Out)Ç´↕ *** Process returned 128 *** Press any key to continue...