2012-10-17 1 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; 
} 

다음에 buff을 인쇄하려고하면 충돌이 발생합니다.C - irc bot skeleton

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

여전히 모든 부품이 null입니다. –

+0

누군가? 도와주세요.. –

0

다른 답변이 지적한 것처럼, 문자 배열은 '\ 0'로 끝나야은 문자열로 간주합니다. 나는 C가 둘을 구별하지 않는다고 생각하지만, 문자열의 끝을 나타내는 '\ 0'이 필요하다. 이것은 strstr(buff, "PRIVMSG"))이 아무 것도 반환하지 않는 이유가 될 수 있습니다. 문자열이 전달 된 것으로 생각하지 않으므로 기본값은 null (따라서 if을 만족하지 않을 수 있음) 일 수 있습니다.

'strtok (문자열, 구분 기호)'는 구분 기호를 사용하여 입력 문자열을 토큰으로 나눕니다. 여기서 문자열을 NULL로, ""를 분리 문자로 전달했습니다. 나는 많은 문자열 함수에 익숙하지 않다. (아직도 C 자신을 배우고있다.) 그러나 이것은 당신의 코드에서 잘못된 사용이라고 생각한다.

parts[] 코드에서 정의하지 않은 것 같습니다. 처음 사용하면 내부 루프 while 루프에 데이터를 저장하려고합니다. 프로그램에 표시되지 않은 다른 부분이 있습니까?