2012-10-17 88 views
0
#include <winsock2.h> 
#include <stdio.h> 

const int PORT = 6667; 
const char *SERVER = "irc.freenode.org"; 
const char *CHAN = "#channela"; 
const char *NICK = "loveMilk"; 

const int MAX_BUFF_SIZE = 512; 

int sock_conn(SOCKET *socketn, const char *HOST, int portn); 
int sock_send(SOCKET *socketn, char* msg, ...); 

int main(int argc, char *argv[]) 
{ 
    WSADATA wsadata; 
    char buff[MAX_BUFF_SIZE]; 
    char oBuff[MAX_BUFF_SIZE]; 
    int buffRec; 

    if (WSAStartup(MAKEWORD(2,2), &wsadata) != 0) 
     return 0; 

    SOCKET sock; 

    if(sock_conn(&sock, SERVER, PORT) != 0) 
    { 
     WSACleanup(); 
     return 0; 
    } 

    printf("connected.\n"); 

    sock_send(&sock, "USER %s \"\" \"127.0.0.1\" :%s\r\n", NICK, NICK); 
    sock_send(&sock, "NICK %s\r\n", NICK); 
    Sleep(100); 

    sock_send(&sock, "JOIN %s\r\n", CHAN); 
    printf("Joined channel.\n"); 

    while(1) 
    { 
     memset(buff, 0, MAX_BUFF_SIZE); 
     memset(oBuff, 0, MAX_BUFF_SIZE); 

     buffRec = recv(sock, buff, MAX_BUFF_SIZE, 0); 
     if((buffRec == 0) || (buffRec == SOCKET_ERROR)) break; 

     if(buff[0] != ':') 
     { 
      strcpy(oBuff, "PONG :"); 
      printf("PONG"); 
      sock_send(&sock, oBuff); 
     } 
     else 
     { 
      if(strstr(buff, "PRIVMSG")) 
      { 
       int i, num = 0; 
       for(i = 0; i < strlen(buff); ++i) if(buff[i] = ' ') ++num; 
       char** parts = malloc(sizeof(char*) * num); 
       char *p; 
       p = strtok(buff, " "); 
       int j = 0; 
       while(p != NULL) 
       { 
        parts[j] = p; 
        j++; 
        p = strtok(NULL, " "); 
       } 

       free(parts); 
      } 
     } 
    } 
    closesocket(sock); 
    return 1; 
} 

int sock_conn(SOCKET *socketn, const char *HOST, int portn) 
{ 
    WSADATA wsadata; 
    SOCKADDR_IN sockA; 
    LPHOSTENT hostE; 

    if(WSAStartup(MAKEWORD(2,2), &wsadata) == -1) return -1; 
    if(!(hostE = gethostbyname(HOST))) 
    { 
     WSACleanup(); 
     return -1; 
    } 
    if ((*socketn = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) 
    { 
     WSACleanup(); 
     return -1; 
    } 

    sockA.sin_family = AF_INET; 
    sockA.sin_port = htons(portn); 
    sockA.sin_addr = *((LPIN_ADDR)*hostE->h_addr_list); 

    if(connect(*socketn, (LPSOCKADDR)&sockA, sizeof(struct sockaddr)) == SOCKET_ERROR) 
    { 
     WSACleanup(); 
     return -1; 
    } 
} 

int sock_send(SOCKET *socketn, char* msg, ...) 
{ 
    char buff[MAX_BUFF_SIZE]; 
    va_list va; 
    va_start(va, msg); 
    vsprintf(buff, msg, va); 
    va_end(va); 
    send(*socketn, buff, strlen(buff), 0); 
    return 1; 
} 

如果我試圖在if(strstr(buff, "PRIVMSG"))之後打印buff它會崩潰。C-irc bot骨架

strtok同時將不起作用,如果我試圖達到parts[0]它崩潰。

我試圖打印parts[0]但沒有顯示任何內容,試圖在while循環中打印,什麼也沒有顯示。 爲什麼?

回答

0

你不會終止你的字符串!

編輯,因爲這將接收部:

buffRec = recv(sock, buff, MAX_BUFF_SIZE, 0); 
if((buffRec == 0) || (buffRec == SOCKET_ERROR)) break; 

/* New line: Terminate buffer as a string */ 
buff[buffRec] = '\0'; 
+0

仍然所有的零件都是空的。 –

+0

某人?請幫忙.. –

0

作爲其它答案所指出的,一個字符數組必須以「\ 0」端被認爲是一個字符串。我認爲C沒有區分這兩者,但是你需要'\ 0'來表示字符串的結尾。這可能是爲什麼strstr(buff, "PRIVMSG"))沒有返回任何東西。它可能默認爲null(因此不會滿足您的if),因爲它不認爲它已經傳遞了一個字符串。

'strtok(字符串,分隔符)'使用分隔符將輸入字符串分爲標記。在這裏,你已經將NULL作爲字符串和「」作爲分隔符。我不熟悉許多字符串函數(仍然學習C自己),但我認爲這是您的代碼中不正確的用法。

parts[]似乎沒有在您提供的代碼中定義。它的第一個用途是您嘗試在內存中存儲數據的位置,用於循環內部的while。該程序是否還有其他部分未顯示?