IRC客户端while循环和scanf()

IRC客户端while循环和scanf(),c,loops,while-loop,scanf,irc,C,Loops,While Loop,Scanf,Irc,这是我的第一个问题。所以,我试着用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.

这是我的第一个问题。所以,我试着用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;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
常量字符\
*bot_owner=“arbarabas”,
*nick=“Abuditaragas”,
*serv=“irc.omnitel.net”,
*chan=“#任何”;
int main(){
int ret;
char-buf[512];
char-msg[100];
pid_t pid;
#ifdef_WIN32
插座;
struct WSAData*wd=(struct WSAData*)malloc(sizeof(struct WSAData));
ret=WSAStartup(MAKEWORD(2,0),wd);
免费(wd);
if(ret){put(“加载Windows套接字API时出错”);返回1;}
#否则
int袜子;
#恩迪夫
结构addrinfo提示,*ai;
memset(&hints,0,sizeof(struct addrinfo));
hits.ai_family=AF_unsec;
hits.ai_socktype=SOCK_流;
hits.ai_protocol=IPPROTO_TCP;
if(ret=getaddrinfo(serv,“6667”&提示和ai)){
看跌期权(gai_strerror(ret));
返回1;
}
sock=socket(ai->ai_族,ai->ai_socktype,ai->ai_协议);
if(ret=connect(sock,ai->ai_addr,ai->ai_addrlen)){
看跌期权(gai_strerror(ret));
返回1;
}
freeaddrinfo(ai);
sprintf(buf,“用户%s 0*:%s\r\n”,尼克,机器人所有者);
发送(sock、buf、strlen(buf)、0);
sprintf(buf,“尼克%s\r\n”,尼克);
发送(sock、buf、strlen(buf)、0);
而(1){
scanf(“+inute%s”,msg);
sprintf(buf,“PRIVMSG%s:有人刚刚和我说话!%s\r\n”,chan,msg);
发送(sock、buf、strlen(buf)、0);
而(recv(sock,buf,512,0)>0){
FPUT(buf、标准输出);
如果(!strncmp(buf,“PING”,5)){
buf[1]=“O”;
发送(sock、buf、strlen(buf)、0);
sprintf(buf,“PRIVMSG%s:询问我PING:O\r\n”,chan);
发送(sock、buf、strlen(buf)、0);
}
如果(buf[0]!=':')继续;
如果(!strncmp(strchr(buf',)+1,“001”,3)){
sprintf(buf,“模式%s+B\r\n连接%s\r\n”,nick,chan);
发送(sock、buf、strlen(buf)、0);
}如果(!strncmp(strchr(buf,)+1,“PRIVMSG”,7)){
如果(strncmp(strchr(buf+1’:')+1,nick,strlen(nick)))继续;
sprintf(buf,“PRIVMSG%s:有人刚刚和我说话!\r\n”,chan);
发送(sock、buf、strlen(buf)、0);
}
}
}
WSACleanup();
关闭(袜子);
返回0;
}
我应该怎么做才能在循环和写消息的同时不停下来


编辑:添加了完整的代码。

我建议您阅读更多的套接字服务器教程,阅读更多关于非阻塞套接字以及如何轮询输入的内容。看起来好像您在示例代码中遗漏了一些内容—大括号和缩进在第8行不匹配。你能给我们看看你的实际代码吗?谢谢你的回答,我添加了整个程序的代码。如果可能的话,请给我解释一下dummy的一切,因为这是我第一次使用C和套接字。我有一个任务,我应该尽快完成。没有人会为你做你的工作。说到阅读,这里有一个很好的开始:我不是要求做我的工作,我想要的是有人在同一时刻向我解释如何使用loop和scanf。。。他们应该彼此独立工作。否则我正在努力思考如何解决这个问题。