qq_37351259 2020-07-20 15:26 采纳率: 100%
浏览 96
已采纳

关于设置套接字,运行结果出现appect:文件描述符错误的问题

服务端:
//线程

//线程
void *net_thread(void * fd)
{   
    recv_package recv;
    pthread_detach(pthread_self());
    int new_fd=*((int *)fd);
    while(1)
    {   
        //读取recv.seg的值
       if(-1 == read(new_fd,&recv,sizeof(recv)))
        {
            perror("read3");
            exit(9);
        }
        switch(recv.seg)
        {
            case 1:
                 login_1(new_fd);
                 break;    //登录
            case 2:
                 regist_1(new_fd);   //注册
                 break;
            case 3:
                 drop_out_1(new_fd);
                 printf("用户已退出\n");
                 return 0;
        }
    }
    //close(new_fd);   //关闭连接socket描述符
}
//主函数
int main(void)
{
    printf("☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★\n");
    printf("★                             ☆\n");
    printf("☆        1:首次登录           ★\n");
    printf("★        2:非首次登录         ☆\n");
    printf("☆                             ★\n");
    printf("★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆\n");
    int sel;
    printf("        ○ 请确认您的选择:\n");
    scanf("%d",&sel);
    switch(sel)
    {
    case 1:
           create_db();
           break;
    case 2:
           printf("表已建立成功\n");
           break;
    }
    //新建套接字
    int sockfd = socket(AF_INET,SOCK_STREAM,0);
    if( -1 == sockfd)
    {
        perror("socket");
        exit(1);
    }
    //套接字建立好之后,将主机IP和端口号等地址信息与套接字绑定
    struct sockaddr_in server_addr;   //定义一个常用地址结构变量
    server_addr.sin_family = AF_INET;  //将地址族确定为ipv4
    server_addr.sin_port = htons(portnum);  //字节序的短整型转换
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);  //IP地址号
    //进行连接,设置最大连接数
    if( -1 == bind(sockfd,(struct sockaddr*)&server_addr,sizeof(struct sockaddr_in)))
    {
        perror("bind");
        exit(2);
    }
    //进行监听
    if(-1 == listen(sockfd,5))
    {
        perror("listen");
        exit(3);
    }
    while(1)
    {

        //等待客户端连接,未连接是accept阻塞
        struct sockaddr_in client_addr;
        //客户端地址信息大小,accept()传入size的地址
        int size = sizeof(struct sockaddr_in);
        int new_fd = 0;
        new_fd = accept(sockfd,(struct sockaddr *)&client_addr,&size);
        if(-1 == new_fd)
        {
            perror("accept");           
            exit(4);
        }
        printf("accept IP :%s\n",inet_ntoa(client_addr.sin_addr));
        printf("accept portnum:%d\n",client_addr.sin_port);
        int ret;
        int pthread_id;
        pthread_create((pthread_t *)&pthread_id,NULL,net_thread,(void *)&new_fd);
        if(-1 == ret)
        {
            perror("pthread_create");
            close(new_fd);
            continue;
        }

    }
    /* 关闭套接字文件描述符 */  
    close(sockfd);   
    return 0;   
}

客户端

int main(void)
{
    //输入主机名或者IP地址
    printf("please input hostname:\n");
    //获得主机名对应的IP信息
    char name[40];
    scanf("%s",name);
    struct hostent *h = gethostbyname(name);
    if(NULL == h)
    {
        perror("gethostbyname");
        exit(1);
    }
    //新建socket
    int sockfd = socket(AF_INET,SOCK_STREAM,0);
    if(-1 == sockfd)
    {
        perror("socket");
        exit(2);
    }
    //设置服务器绑定的IP地址和端口等属性
    struct sockaddr_in server_addr;
    server_addr.sin_family = AF_INET;    //选择ipv4
    server_addr.sin_port = htons(portnum);  //端口号
    server_addr.sin_addr = *((struct in_addr *)h->h_addr);//注意格式转换*((struct in_addr *)h->h_addr_list[0])
    if(-1 == connect(sockfd,(struct sockaddr *)&server_addr,sizeof(struct sockaddr_in)))
    {
        perror("connect");//对服务器进行连接
        exit(3);
    }
    printf("The connection was successful! \n");//连接成功
    //执行函数
    menu(sockfd);
    // close(sockfd);
    return 0;
}

运行结果:
图片说明
4和-1是我打印服务端new_fd的值,为什么第二次为-1,appect直接进入非阻塞状态,这是为什么?
有没有大佬帮我解惑!

  • 写回答

1条回答 默认 最新

  • 关注
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能