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后尝试打印。if(strstr(buff, "PRIVMSG"))

strtok如果我尝试达到它,则while将无法正常工作parts[0]

我试图打印parts[0],但什么也没显示,在 while 循环期间尝试打印,什么也没显示。为什么?

4

2 回答 2

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';
于 2012-10-17T07:01:33.767 回答
0

正如另一个答案指出的那样,字符数组必须以 '\0' 结尾才能被视为字符串。我认为 C 不区分两者,但你需要 '\0' 来表示字符串的结尾。这可能就是为什么strstr(buff, "PRIVMSG"))不返回任何东西的原因。它可能默认为 null (因此不满足您的if),因为它认为它没有被传递一个字符串。

'strtok(string, delimiter)' 使用分隔符将输入字符串分解为标记。在这里,您已将 NULL 作为其字符串传递给它,并将 " " 作为其分隔符。我不熟悉许多字符串函数(我自己还在学习 C),但我认为这是您代码中的错误用法。

parts[]您提供的代码中似乎没有定义。它的第一个用途是您尝试在其中存储数据以供内部while循环使用。程序中是否还有其他未显示的部分?

于 2013-09-04T18:44:03.710 回答