C 错误:尝试接受来自客户端的连接时参数无效

C 错误:尝试接受来自客户端的连接时参数无效,c,tcp,C,Tcp,我正在尝试使用TCP将客户端连接到服务器。我想我的客户机工作正常,但服务器无法接受连接。 这是我的密码: 服务器: int main(int argc, char *argv[]) { int port, sock, newsock, thread_pool_size, queue_size; struct sockaddr_in server, client; struct sockaddr *serverptr = ( struct sockaddr * )&

我正在尝试使用TCP将客户端连接到服务器。我想我的客户机工作正常,但服务器无法接受连接。 这是我的密码:

服务器:

int main(int argc, char *argv[])
{
    int port, sock, newsock, thread_pool_size, queue_size;
    struct sockaddr_in server, client;
    struct sockaddr *serverptr = ( struct sockaddr * )&server;
    struct sockaddr *clientptr = ( struct sockaddr * )&client;
    struct hostent *rem;
    socklen_t clientlen;
    pthread_t thr;
    int i, err, status;

    if(argc != 7)
    {
        printf("Usage: ./dataServer -p <port> -s <thread_pool_size> -q <queue_size>\n");
        exit(1);
    }

    for(i=1; i<argc; i++)
    {
        if(strcmp(argv[i], "-p") == 0)
        {
            port = atoi(argv[++i]);
        }

        else if(strcmp(argv[i], "-s") == 0)
        {
            thread_pool_size = atoi(argv[++i]);
        }

        else if(strcmp(argv[i], "-q") == 0)
        {
            queue_size = atoi(argv[++i]);
        }

        else
        {
            printf("Wrong Input < %s >\n", argv[i]);
            exit(1);
        }
    }

    printf("%d %d %d\n", port, thread_pool_size, queue_size);

    /* Create socket */
    if((sock = socket(PF_INET, SOCK_STREAM, 0)) < 0)
    {
        perror_exit("socket");
    }

    server.sin_family = AF_INET;       /* Internet domain */
    server.sin_addr.s_addr = htonl(INADDR_ANY);
    server.sin_port = htons(port);      /* The given port */

    /* Bind socket to address */
    if(bind(sock, serverptr, sizeof(server)) < 0)
    {
        perror_exit("bind");
    }

    /* Listen for connections */
    if(listen(sock, 5) < 0)
    {
        perror_exit("listen");
    }

    printf("Listening for connections to port %d\n", port);

    while(1)
    {
        /* accept connection */
        if((newsock = accept(sock, clientptr, &clientlen)) < 0)
        {
            //HERE IS THE PROBLEM
            perror_exit("accept");
        }

        if((rem = gethostbyaddr((char *) &client.sin_addr.s_addr, sizeof(client.sin_addr.s_addr), client.sin_family)) == NULL)
        {
            herror("gethostbyaddr");
            exit(1);
        }

        printf("Accepted connection from %s\n", rem->h_name);

        close(sock);

        if((err = pthread_create(&thr, NULL, (void*)thread_f, (int *)newsock)))
        {
            perror_exit("pthread_create");
            exit(1); 
        }

        if((err = pthread_join(thr, (void **) &status)))
        {
            perror_exit("pthread_join");
            exit(1); 
        }

        close(newsock);
    }

    return 0;
}
intmain(intargc,char*argv[])
{
int端口、sock、newsock、线程池大小、队列大小;
服务器、客户端中的结构sockaddr_;
结构sockaddr*服务器ptr=(结构sockaddr*)&server;
结构sockaddr*clientptr=(结构sockaddr*)&客户端;
结构宿主*rem;
socklen_t clientlen;
pthread_t thr;
int i,err,status;
如果(argc!=7)
{
printf(“用法:./dataServer-p-s-q\n”);
出口(1);
}
用于(i=1;ih_名称);
关闭(袜子);
if((err=pthread\u create(&thr,NULL,(void*)thread\u f,(int*)newsock)))
{
perror_exit(“pthread_create”);
出口(1);
}
if((err=pthread_join(thr,(void**)和status)))
{
perror_exit(“pthread_join”);
出口(1);
}
关闭(新闻组);
}
返回0;
}
客户:

int main(int argc, char *argv[])
{
    int port, sock, i;
    char buf[30];
    struct sockaddr_in server;
    struct sockaddr *serverptr = (struct sockaddr*)&server;
    struct hostent *rem;
    char server_ip[15];

    if(argc != 7)
    {
        printf("Usage: ./remoteClient -i <server_ip> -p <server_port> -d <directory>\n");
        exit(1);
    }

    for(i=1; i<argc; i++)
    {
        if(strcmp(argv[i], "-i") == 0)
        {
            strcpy(server_ip, argv[++i]);
        }

        else if(strcmp(argv[i], "-p") == 0)
        {
            port = atoi(argv[++i]);
        }

        else if(strcmp(argv[i], "-d") == 0)
        {
            strcpy(buf, argv[++i]);
        }

        else
        {
            printf("Wrong Input < %s >\n", argv[i]);
            exit(1);
        }
    }

    printf("%s %d %s\n", server_ip, port, buf);

    /* Create socket */
    if((sock = socket(PF_INET, SOCK_STREAM, 0)) < 0)
    {
        perror_exit("socket");
    }

    /* Find server address */
    if((rem = gethostbyname(server_ip)) == NULL)
    {   
        herror("gethostbyname"); exit(1);
    }

    server.sin_family = AF_INET;
    memcpy(&server.sin_addr, rem->h_addr, rem->h_length);
    server.sin_port = htons(port);

    /* Initiate connection */
    if(connect(sock, serverptr, sizeof(server)) < 0)
    {
        perror_exit("connect");
    }

    if (write(sock, buf, sizeof(buf)) < 0)
    {
        perror_exit("write");
    }

    close(sock);

    printf("ok\n");

    return 0;
}
intmain(intargc,char*argv[])
{
int端口,sock,i;
char-buf[30];
服务器中的结构sockaddr_;
结构sockaddr*服务器ptr=(结构sockaddr*)&server;
结构宿主*rem;
字符服务器_ip[15];
如果(argc!=7)
{
printf(“用法:./remoteClient-i-p-d\n”);
出口(1);
}
对于(i=1;ih_addr,rem->h_length);
server.sin_port=htons(端口);
/*启动连接*/
if(connect(sock、serverptr、sizeof(server))<0)
{
perror_出口(“连接”);
}
if(写入(sock、buf、sizeof(buf))<0)
{
perror_退出(“写入”);
}
关闭(袜子);
printf(“ok\n”);
返回0;
}
如果要运行它们,请执行以下操作:

./dataServer-p1250-s2-q2

./remoteClient-i localhost-p 12500-d./dir/file\u 1

不要介意我的代码的其余部分。
你能帮忙吗?提前谢谢

接受
(我的重点)

addrlen参数是一个值结果参数:调用方必须 初始化它以包含指向的结构的大小(字节) 按地址发送至;返回时,它将包含对等的实际大小 地址

传入未初始化的变量。您需要对此进行初始化,以提供缓冲区的大小
clientptr
指向

socklen_t clientlen = sizeof(client);
在这之后,你应该移动这条线

close(sock);

超过
while
循环的末尾。您的下一个错误是由于在已关闭的句柄上操作循环的第二次迭代造成的。

我初始化了clientlen,现在出现另一个错误:“错误的文件描述符”。奇怪的是,我的程序首先打印“接受来自本地主机的连接”,然后向我显示错误。它是如何继续运行然后停止的?不相关的注释,但我必须说,看到带有一些错误处理的代码是很好的:)