Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
错误:函数的参数太多‘;STRCACMP’&引用;首字母C“;_C - Fatal编程技术网

错误:函数的参数太多‘;STRCACMP’&引用;首字母C“;

错误:函数的参数太多‘;STRCACMP’&引用;首字母C“;,c,C,我试图从O'Reilly的Head First C中获得Internet敲打协议服务器,但是当我试图编译它时,我收到以下错误 ikkp_server.c:106:4: error: too many arguments to function ‘strcasecmp’ ikkp_server.c:111:6: error: too many arguments to function ‘strcasecmp’ 这些线对应于这些线 if(strcasecmp("Who's there?", bu

我试图从O'Reilly的Head First C中获得Internet敲打协议服务器,但是当我试图编译它时,我收到以下错误

ikkp_server.c:106:4: error: too many arguments to function ‘strcasecmp’
ikkp_server.c:111:6: error: too many arguments to function ‘strcasecmp’
这些线对应于这些线

if(strcasecmp("Who's there?", buf,12))
if(strcasecmp("Oscar who?", buf,10))
完整的代码是

#include <sys/socket.h>
#include <arpa/inet.h>
#include <errno.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

void error(char *msg){
    fprintf(stderr, "\n\t\t%s: %s\n\n", msg, strerror(errno));
    exit(errno);
}

int catch_signal(int sig, void (*handler)(int)){
    struct sigaction action;
    action.sa_handler = handler;
    sigemptyset(&action.sa_mask);
    action.sa_flags = 0;
    return sigaction(sig, &action, NULL);
}

int read_in(int socket, char *buf, int len){
    char *s = buf;
    int slen = len;
    int c = recv(socket, s, slen, 0);
    while ((c > 0) && (s[c-1] != '\n')){
        s += c; slen -= c;
        c = recv(socket, s, slen, 0);
    }
    if ( c < 0)
        return c;
    else if (c == 0)
        buf[0] = '\0';
    else
        s[c -1] = '\0';
    return len - slen;
}

int open_listener_socket(){
    int s = socket(PF_INET, SOCK_STREAM, 0);
    if (s == -1)
        error("Open Socket Error");
    return s;
}

void bind_to_port(int socket, int port){
    struct sockaddr_in name;
    name.sin_family = PF_INET;
    name.sin_port = (in_port_t)htons(port);
    name.sin_addr.s_addr = htonl(INADDR_ANY);
    int reuse = 1;
    if(setsockopt(socket, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse, sizeof(int)) == -1)
        error("Error reusing socket.");
    int c = bind( socket, (struct sockaddr *) &name, sizeof(name));
    if (c == -1)
        error("Error binding socket.");

}

int say(int socket, char *s){
    int result = send(socket, s, strlen(s), 0);
    if (result == -1)
        error("Can't send message");
    return result;
}

int listener_d;

void handle_shutdown(int sig){
    if (listener_d)
        close(listener_d);
    fprintf(stderr, "\n\t\tServer Closed.\n\n");
    exit(0);
}

int main(){

    //catch sig
    if(catch_signal(SIGINT, handle_shutdown) == -1)
        error("Signal Error");

    //create listener socket..
    listener_d = open_listener_socket();

    //bind listener.
    bind_to_port(listener_d, 3098);

    if(listen(listener_d, 10) == -1)
        error("Can't Listen.");

    struct sockaddr_storage client_addr;
    unsigned int address_size = sizeof(client_addr);

    puts("Waiting for Connection.");

    char buf[255];
    while(1){
        int connect_d = accept(listener_d, (struct sockaddr *)&client_addr, &address_size);
        if( connect_d == -1)
            error("Client Connect Error.");

        //begin knock knock joke.
        if(say(connect_d,"Internet Knock Knock Protocol Server\r\nVersion 1.0\r\n\nKnock! Knock!\r\n"   ) != -1){
            read_in(connect_d, buf, sizeof(buf));
            if(strcasecmp("Who's there?", buf,12))
                say(connect_d,"You should say 'Who's there?'\r\n");
            else {
                if(say(connect_d,"Oscar.") != -1){
                    read_in(connect_d, buf, sizeof(buf));
                    if(strcasecmp("Oscar who?", buf,10))
                        say(connect_d, "You should say 'Oscar who?'\r\n");
                    else
                        say(connect_d, "Oscar silly question, get a silly answer!\r\n");
                }
            }
        }

        close(connect_d);

    }

    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
无效错误(字符*消息){
fprintf(stderr,“\n\t\t%s:%s\n\n”,msg,strerror(errno));
出口(errno);
}
int catch_信号(int sig,void(*handler)(int)){
结构动作;
action.sa_handler=处理程序;
sigemptyset(和action.sa_mask);
action.sa_标志=0;
返回sigaction(sig,&action,NULL);
}
int read_in(int socket,char*buf,int len){
char*s=buf;
int-slen=len;
int c=recv(插座,s,slen,0);
而((c>0)&(s[c-1]!='\n')){
s+=c;slen-=c;
c=recv(插座,s,slen,0);
}
if(c<0)
返回c;
else如果(c==0)
buf[0]='\0';
其他的
s[c-1]='\0';
返回len-slen;
}
int open_listener_socket(){
int s=套接字(PF_INET,SOCK_STREAM,0);
如果(s==-1)
错误(“打开套接字错误”);
返回s;
}
无效绑定到端口(int套接字,int端口){
名称为struct sockaddr_;
name.sin_family=PF_INET;
name.sin_port=(in_port_t)htons(port);
name.sin_addr.s_addr=htonl(INADDR_ANY);
int=1;
if(setsockopt(socket,SOL_socket,SO_REUSEADDR,(char*)&reuse,sizeof(int))=-1)
错误(“重用套接字时出错”);
int c=bind(socket,(struct sockaddr*)&name,sizeof(name));
如果(c==-1)
错误(“绑定套接字时出错”);
}
int-say(int-socket,char*s){
int result=send(套接字,s,strlen,0);
如果(结果==-1)
错误(“无法发送消息”);
返回结果;
}
int-listener\u d;
无效手柄关闭(int sig){
如果(侦听器d)
关闭(侦听器d);
fprintf(stderr,“\n\t\t服务器已关闭。\n\n”);
出口(0);
}
int main(){
//捕获信号
if(捕捉信号(信号,手柄关闭)=-1)
错误(“信号错误”);
//创建侦听器套接字。。
listener_d=打开_listener_套接字();
//绑定侦听器。
将_绑定到_端口(侦听器_d,3098);
如果(侦听(侦听器,10)=-1)
错误(“无法收听”);
结构sockaddr\u存储客户端\u addr;
无符号整数地址\u size=sizeof(客户端地址);
puts(“等待连接”);
char-buf[255];
而(1){
int connect\u d=accept(侦听器(struct sockaddr*)和客户端地址,以及地址大小);
如果(连接d==-1)
错误(“客户端连接错误”);
//开始敲打笑话。
如果(例如(连接?“Internet敲打协议服务器\r\n版本1.0\r\n\nKnock!敲打!\r\n”)!=-1){
读入(连接d、buf、尺寸(buf));
如果(strcasecmp(“谁在那里?”,buf,12))
说(连接“你应该说‘谁在那里?’”\r\n);
否则{
如果(说(连接“奥斯卡”)!=-1){
读入(连接d、buf、尺寸(buf));
如果(strcasecmp(“奥斯卡谁?”,buf,10))
说(连接“你应该说‘奥斯卡是谁?’”\r\n);
其他的
说(连接“奥斯卡愚蠢的问题,得到愚蠢的答案!\r\n”);
}
}
}
关闭(连接d);
}
返回0;
}
曼斯捷克姆普说它应该起作用

int strncasecmp(常量字符*s1,常量字符*s2,大小n)


我遗漏了什么?

您遗漏了
strNcasecmp
中的
n
。(为强调起见,请在实际函数名中使用小写字母
n
)谢谢,即使在查看stracecmp:P的手册页时,我也没有意识到有两个不同的函数名