#define WIN32_LEAN_AND_MEAN #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); if(connect(theSocket, (LPSOCKADDR)&serverInfo, sizeof(struct sockaddr)) == SOCKET_ERROR) { WSACleanup(); return 1; } 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, 3072, 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)); memset(strSource, 0, sizeof(strSource)); 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("strCommand -> !%s!\n", strCommand); // printf("strParameters -> !%s!\n", strParameters); printf("CMD -> %s\n", strBuffer); if(strcmp(strCommand, "PING") == 0) { SubStr(strParameters, 1, strlen(strParameters), strSource); SendToIRC("PONG %s", strSource); } return; } void SendToIRC(char * strMessage, ...) { char strBuffer[3072]; va_list va; va_start(va, strMessage); vsprintf(strBuffer, strMessage, va); va_end(va); strcat(strBuffer, "\r\n"); printf("t-> %s", strBuffer); send(theSocket, strBuffer, strlen(strBuffer), 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 == 0 || iPos == -1) return; strncpy(strReturn, strString+(iPos), iLength - iPos); strcat(strReturn, "\0"); return; }