2012-10-17 57 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。该程序是否还有其他部分未显示?