linux编程 - Unix/Linux socket编程的一个问题?

查看:139
本文介绍了linux编程 - Unix/Linux socket编程的一个问题?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

服务端提供一个返回时间的服务,客户端使用telnet去访问

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <time.h>
#include <strings.h>

#define PORTNUM 13000
#define HOSTLEN 256
#define oops(msg) {perror(msg); exit(1);}

int main()
{
    struct sockaddr_in saddr;
    struct hostent *hp;
    char hostname[HOSTLEN];
    int sock_id, sock_fd;
    FILE *sock_fp;
    char *ctime();
    time_t thetime;

    sock_id = socket(PF_INET, SOCK_STREAM, 0);
    if( sock_id == -1 )
        oops("scoket");
    
    bzero((void*)&saddr, sizeof(saddr));

    gethostname(hostname, HOSTLEN);
    hp = gethostbyname(hostname);

    bcopy((void*)hp->h_addr, (void*)&saddr.sin_addr, hp->h_length);
    saddr.sin_port = htons(PORTNUM);
    saddr.sin_family = AF_INET;
    
    if( bind(sock_id, (struct sockaddr*)&saddr, sizeof(saddr)) != 0  )
        oops("bind");

    if( listen(sock_id, 1) != 0 )
        oops("listen");

    while(1) {
        sock_fd = accept(sock_id, NULL, NULL);
        printf("Wow! got a call\n");
        if( sock_fd == -1 )
            oops("accept");
        
        sock_fp = fdopen(sock_id, "w");
        if (sock_fp == NULL)
            oops("fdopen");
        thetime = time(NULL);

        fprintf(sock_fp, "The time here is...");
        fprintf(sock_fp, "%s", ctime(&thetime));
        fclose(sock_fp);
    }
}

运行结果:

deweixudeMBP:socket deweixu$ ./timeserv.out &
[1] 32999
deweixudeMBP:socket deweixu$ hostname
deweixudeMBP.lan
deweixudeMBP:socket deweixu$ telnet deweixudeMBP.lan 13000
Trying 192.168.199.205...
Wow! got a call
Connected to deweixudembp.lan.
Escape character is '^]'.
Wow! got a call
accept: Bad file descriptor
Connection closed by foreign host.
[1]+  Exit 1                  ./timeserv.out
deweixudeMBP:socket deweixu$ 

为什么会 accept: Bad file descriptor ?

解决方案

    sock_fd = accept(sock_id, NULL, NULL);
    printf("Wow! got a call\n");
    if( sock_fd == -1 )
        oops("accept");
    
    sock_fp = fdopen(sock_id, "w");

sock_fp = fdopen(sock_id, "w");
换成
sock_fp = fdopen(sock_fd, "w");

这篇关于linux编程 - Unix/Linux socket编程的一个问题?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆