2014-11-23 99 views
-1

这里是我的服务器代码,不知道我是如何得到我的Mac上错误的选择():无效的参数

failed to select : Invalid argument 

其做工精细,但不能在Linux上。 有人能告诉我我做错了吗?

我只是新的begynniner在C编程。

server.c

int server(int port){ 

int request_sd, newfd; 
socklen_t clientaddrlen; 
fd_set masterList; 
fd_set readFd; 


int bind_adress = 0, listen_connect = 0; 
int fd_max; 
int select_client, i; 
struct sockaddr_in server_adr; 
struct sockaddr_in client_adr; 

if (!getcwd(root_path, PATH_LEN)) 
{ 
    perror("set path"); 
} 


request_sd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); 

if (request_sd < 0) 
{ 
    perror("failed: "); 
    return -1; 
}else printf("create new socket i complete: %d\n", request_sd); 

memset(&server_adr, 0 , sizeof (struct sockaddr_in)); 

server_adr.sin_family = AF_INET; 
server_adr.sin_addr.s_addr = INADDR_ANY; 
server_adr.sin_port = htons(port); 



int activate = 1; 
if (setsockopt(request_sd, SOL_SOCKET, SO_REUSEADDR, &activate, sizeof(int)) == -1) 
{ 
    perror("setsockopt: "); 
    return -1; 
} 

bind_adress = bind(request_sd, (struct sockaddr*) &server_adr, sizeof(struct sockaddr_in)); 
if (bind_adress < 0) 
{ 
    perror("failed to bind : "); 
    return -1; 
} 

listen_connect = listen(request_sd, 10); 
if (listen_connect <0) 
{ 
    perror("failed to listen : "); 
    return -1; 
} 

printf("\nListening for connections on port: %d\n\n", port); 

fflush(stdout); 
FD_ZERO(&masterList); 
FD_ZERO(&readFd); 
FD_SET(request_sd, &masterList); 

fd_max = request_sd; 
while(1){ 


    readFd = masterList; 
    if((select_client = select(fd_max+1, &readFd, NULL, NULL, NULL)) < 0){ 
     perror("FAILED TO SELECT"); 
    } 

    for (i = 0; i <= fd_max; i++) 
    { 
     if(FD_ISSET(i,&readFd)) 
     { 
      if(i == request_sd) 
      { 
       newfd = accept(request_sd, (struct sockaddr*) &client_adr, 
        (socklen_t *) &clientaddrlen); 
       if (newfd == -1) 
       { 
        perror("failed to accept :"); 
        return -1; 
       } 
       FD_SET(newfd, &masterList); 
       if (newfd > fd_max) 
       { 
        fd_max = newfd; 
       } 
+0

在'-Wall -Wextra -pedantic'上编译所有警告。你得到了什么? – alk 2014-11-23 15:02:40

+0

Filtjener.c:88:5:警告:(这将只在每个输入文件中报告一次) Filtjener.c:函数'ls_handler'中: Filtjener.c:106:警告:ISO C90禁止混合声明和代码 Filtjener.c:103:警告:未使用的参数'包' Filtjener.c:在函数'cd_handler'中: Filtjener.c:127:警告:未使用的参数'包' Filtjener.c:在函数'info_handler'中: Filtjener.c:200:警告:ISO C90禁止混合声明和代码 – TKP 2014-11-23 15:23:00

+0

Filtjener.c:在函数'cat_handler'中: Filtjener.c:250:警告:在有符号和无符号整数表达式之间进行比较 Filtjener.c:230:warning :未使用的参数'currentPath' Filtjener.c:在函数'action'中: Filtjener.c:319:警告:ISO C90禁止混合声明和代码 Filtjener.c:函数'server'中: Filtjener.c:408:警告:ISO C90禁止混合声明和代码 Filtjener.c:463:警告:ISO C90禁止混合声明和代码 – TKP 2014-11-23 15:23:28

回答

1

由于select()抱怨不好的参数,而你只传递两个参数给它,这意味着要么fd_max无效或readFd无效。所述documentation状态:

EINVAL
NFDs的是负或包含超时内的值是无效的。

既然你不使用timeout参数,看看你的fd_max变量,确保你不会溢出了。

除此之外,您应该在支持它的平台上使用fd_copy()而不是readFd = masterList

FD_COPY(&masterList, &readFd); 

一个更好的选择是使用poll()epoll(),而不是select()。管理起来比较容易,它会告诉你确切的插座满足等待,所以你不必为它们寻找。