0

これが私の最初の質問です。だから、私はCでIRCクライアントを作ろうとしています。サーバーからのすべての情報はバッファーに送られ、whileループですべてをターミナルに出力します。

#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

const char \
    *bot_owner = "Arbarbarabas",
    *nick = "Abuditaragas",
    *serv = "irc.omnitel.net",
    *chan = "#any";

int main() {
    int ret;
    char buf[512];
    char msg[100];
    pid_t pid;
#ifdef _WIN32
    SOCKET sock;
    struct WSAData* wd = (struct WSAData*)malloc(sizeof(struct WSAData));
    ret = WSAStartup(MAKEWORD(2, 0), wd);
    free(wd);
    if (ret) { puts("Error loading Windows Socket API"); return 1; }
#else
    int sock;
#endif
    struct addrinfo hints, *ai;
    memset(&hints, 0, sizeof(struct addrinfo));
    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;
    if (ret = getaddrinfo(serv, "6667", &hints, &ai)) {
        puts(gai_strerror(ret));
        return 1;
    }
    sock = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
    if (ret = connect(sock, ai->ai_addr, ai->ai_addrlen)) {
        puts(gai_strerror(ret));
        return 1;
    }
    freeaddrinfo(ai);
    sprintf(buf, "USER %s 0 * :%s\r\n", nick, bot_owner);
    send(sock, buf, strlen(buf), 0);
    sprintf(buf, "NICK %s\r\n", nick);
    send(sock, buf, strlen(buf), 0);


    while(1){

        scanf("+inute %s", msg);
        sprintf(buf, "PRIVMSG %s :Someone just spoke to me! %s \r\n", chan, msg);
        send(sock, buf, strlen(buf), 0);

            while (recv(sock, buf, 512, 0) > 0) {
                fputs(buf, stdout);
                if (!strncmp(buf, "PING ", 5)) {
                    buf[1] = 'O';
                    send(sock, buf, strlen(buf), 0);
                    sprintf(buf, "PRIVMSG %s :Asked me PING :O \r\n", chan);
                    send(sock, buf, strlen(buf), 0);
                }
                    if (buf[0] != ':') continue;
                    if (!strncmp(strchr(buf, ' ') + 1, "001", 3)) {
                    sprintf(buf, "MODE %s +B\r\nJOIN %s\r\n", nick, chan);
                    send(sock, buf, strlen(buf), 0);
                } else if (!strncmp(strchr(buf, ' ') + 1, "PRIVMSG", 7)) {
                    if (strncmp(strchr(buf + 1, ':') + 1, nick, strlen(nick))) continue;
                    sprintf(buf, "PRIVMSG %s :Someone just spoke to me!\r\n", chan);
                    send(sock, buf, strlen(buf), 0);
                }
            }
    }

    WSACleanup();

    close(sock);
    return 0;
}

whileループとメッセージの書き込みを同時に停止しないようにするにはどうすればよいですか?

編集:コード全体を追加しました。

4

0 に答える 0