bad file descriptor-使用线程的TCP回射服务端和客户端运行时错误

问题描述

使用线程的TCP回射服务端和客户端运行时错误

服务端serv.c:

 #include "unp.h"
#include <pthread.h>

void str_echo(int sockfd)
{
    char buf[MAXLINE];
    int n;
    while(( n = read(sockfd,buf,sizeof(buf)))>=0)
    {
        if (n ==0)
        {
            printf("client EOF,its use shutdown sockfdn");
            exit(0);
        }
        write(sockfd,buf,sizeof(buf));
    }
    if (n < 0)
    {
        perror("read data from sockfd error");
        exit(1);
    }
}
static void *doit(void *arg)
{
    pthread_detach(pthread_self());
    str_echo((int) arg);
    close((int)arg);
    return 0;
}

int main(int argc, char const *argv[])
{
    int listenfd,connfd;
    int on = 1;
    pthread_t tid;
    struct sockaddr_in seraddr;
    struct sockaddr_in cliaddr;
    socklen_t len;

    bzero(&seraddr,sizeof(seraddr));
    seraddr.sin_family = AF_INET;
    seraddr.sin_port = htons(SERV_PORT);
    seraddr.sin_addr.s_addr = htonl(INADDR_ANY);
    len = sizeof(seraddr);

    listenfd = socket(AF_INET,SOCK_STREAM,0);
    if (listenfd < 0)
    {
        perror("creat listenfd error");
        exit(1);
    }
    setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));
    if (bind(listenfd,(SA*)&seraddr,len) <0)
    {
        perror("bind error");
        exit(1);
    }
    if (listen(listenfd,10) < 0)
    {
        perror("listen error");
        exit(1);
    }
    for (; ;)
    {
        connfd = accept(listenfd,NULL,NULL);
        if (pthread_create(&tid,NULL,doit,(void *)&connfd) != 0)
        {
            perror("pthread_create error");
            exit(1);
        }
    }
    return 0;
}

客户端client.c:

 #include "unp.h"
#include <pthread.h>

void *copyto(void *arg);

static int sockfd;
static FILE *fp;

void str_cli(FILE *fp_arg,int sockfd_arg)
{
    char recvbuf[MAXLINE];
    int readn;
    pthread_t tid;

    sockfd = sockfd_arg;
    fp = fp_arg;
    if (pthread_create(&tid,NULL,copyto,NULL) != 0)
    {
        perror("pthread_create error");
        exit(1);
    }

    while((readn = read(sockfd,recvbuf,sizeof(recvbuf))) >0)
    {
        recvbuf[readn+1] =0;
        fputs(recvbuf,stdout);
    }
    if (readn ==0)
    {
        printf("server terminate, read 0n");
    }
}

void *copyto(void *arg)
{
    char sendbuf[MAXLINE];
    int writen;
    while(fgets(sendbuf,sizeof(sendbuf),stdin) != NULL)
    {
        writen = write(sockfd,sendbuf,sizeof(sendbuf));
        if (writen < 0)
        {
            perror("write sockfd error");
        }
    }
    // use shotdown,when fgets return null
    shutdown(sockfd,SHUT_WR);
    return NULL;
}

int main(int argc, char const *argv[])
{
    struct sockaddr_in servaddr;

    if (argc != 2)
    {
        printf("Usage exe serveripn");
        exit(1);
    }
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(SERV_PORT);
    inet_pton(AF_INET,argv[1],&servaddr.sin_addr.s_addr);

    sockfd = socket(AF_INET,SOCK_STREAM,0);
    if (sockfd < 0)
    {
        perror("creat sockfd error");
        exit(1);
    }
    if (connect(sockfd,(SA*)&servaddr,sizeof(servaddr)) < 0)
    {
        perror("connect error");
        exit(1);
    }
    str_cli(stdin,sockfd);
    return 0;
}

编译均在正确通过,但是服务端启动后,在启动客户端,服务端返回:read data from sockfd error: Bad file descriptor
求大神帮忙解决

解决方案

调试下,看看是不是连接被你关闭了

解决方案二:

还有这个http://zhanyonhu.blog.163.com/blog/static/16186044201061214436331/

时间: 2024-09-17 07:54:39

bad file descriptor-使用线程的TCP回射服务端和客户端运行时错误的相关文章

tcp协议 udp协议-C#服务端请求客户端数据

问题描述 C#服务端请求客户端数据 我想在客户端安装一个服务后,能够向客户端请求数据,返回数据给服务器,这样用什么协议要好,socket行吗?服务端怎么发起这个请求,麻烦各位大神帮帮忙? 我不清楚的地方,如果用socket,保存客户端连接后,我要请求客户端数据,只能是客户端请求服务端,而我换成服务端请求客户端好像只能是客户端请求后服务端回复. 如果是UDP的话好定义请求和回复问题吗? 解决方案 ok,既然是.net,就有.net的最佳做法,wcf双工通讯或signalr.我在论坛都分享过例子.

c++-libuv客户端开发,通过TCP/IP连接服务端出错!

问题描述 libuv客户端开发,通过TCP/IP连接服务端出错! 使用libuv进行客户端开发,在Linux下测试没有问题,当移植到win7下面就报错了,错误信息如下: 具体代码: ....... void uv_write_cb(uv_write_t *req,int status) { if(status == -1) { cout<<"error on_write_end"<<endl; return; } //cout<<"writ

UNIX网络编程:TCP回射服务器/客户端程序

下面通过最简单的客户端/服务器程序的实例来学习socket API. serv.c 程序的功能是从客户端读取字符然后直接回射回去: #include<stdio.h> #include<sys/types.h> #include<sys/socket.h> #include<unistd.h> #include<stdlib.h> #include<errno.h> #include<arpa/inet.h> #inclu

设备端用一个tcp socket调用服务端的web service,这个流程应该怎样的?

问题描述 如题... 解决方案 解决方案二:你在相关决策中处于什么身份?遇到了什么问题?是有人要拖延时间,还是有人特别热爱重新发明火车轮子,还是有人特别有闲钱但是热爱编程?这基本上相当于你让一个程序园员开发一个网站,你提出说希望网站不要在1000用户并发访问时显得太慢,然后你的程序员回答你说"好的,我们先要花2个月时间(实际上可能要1年)自己重写一个window文件系统,这样就能自己'保证'性能了(以后还要提出什么学术性的想法,以后再说)".如果不是编程环境异常恶劣,那么这想法在开发中

《UNIX网络编程 卷1:套接字联网API(第3版)》——8.15 使用select函数的TCP和UDP回射服务器程序

8.15 使用select函数的TCP和UDP回射服务器程序 现在,我们把第5章中的并发TCP回射服务器程序与本章中的迭代UDP回射服务器程序组合成单个使用select来复用TCP和UDP套接字的服务器程序.图8-24是该程序的前半部分. 创建监听TCP套接字14~22 创建一个监听TCP套接字并捆绑服务器的众所周知端口,设置SO_REUSEADDR套接字选项以防该端口上已有连接存在. 创建UDP套接字23~29 还创建一个UDP套接字并捆绑与TCP套接字相同的端口.这里无需在调用bind之前设

C#TCP通信时模拟客户端断开后服务端的CPU使用率从45%上升到80%-90%

问题描述 我使用C#的TCPlistener写了一个TCP服务端的程序,用来向连接到服务端的客户端发送数据的,客户端发送不同的请求就发送相应的数据,没有请求数据就什么也不发送:发送的数据是从另一个端口接收到的UDP的报文解析后的数据服务端程序包括接收及解析UDP报文,和TCPlistener监听(有连接请求就建立一个线程为这个连接服务,连接断开就终止线程)现在当服务端程序启动,就开始接收UDP报文并解析,如果有连接请求,就创建线程并为连接服务,当模拟器客户端断开连接,CPU使用率就会迅速增长到8

scoket tcp ip 报文-Java 的 Socket服务端客户端以tcp/ip协议发送接收报文

问题描述 Java 的 Socket服务端客户端以tcp/ip协议发送接收报文 代码谁有模板,比如给你一个login报文,logout报文!!急急急!!! 解决方案 Android Socket 编程(WIFI 和 ADB) 有了发送数据的功能,再发送文件还需要分包等协议. 解决方案二: 这个不知道是不是你要的答案, 解决方案三: http://blog.csdn.net/u013301192/article/details/46336719 解决方案四: 网页上的1楼回复应该对你有用,祝你好运

linux系统编程基础(三)文件描述符file descriptor与inode的相关知识

每个进程在Linux内核中都有一个task_struct结构体来维护进程相关的 信息,称为进程描述符(Process Descriptor),而在操作系统理论中称为进程控制块 (PCB,Process Control Block).task_struct中有一个指针(struct files_struct *files; )指向files_struct结构体,称为文件 描述符表,其中每个表项包含一个指向已打开的文件的指针,如下图所示. 用户程序不能直接访问内核中的文件描述符表,而只能使用文件描述

利用MFC写一个Tcp程序,基于事件选择机制建立一个回射服务器(直接把收到的客户端消息发回给客户端)

问题描述 利用MFC写一个Tcp程序,基于事件选择机制建立一个回射服务器(直接把收到的客户端消息发回给客户端) 刚开始学习window套接字编程,很多东西还不大熟,想请高手帮忙写出这个程序作为我学习相关理论的模板 解决方案 http://pan.baidu.com/s/1hs2hKEg分享给你这个视频教程 跟着视频一步一步做可以做一个局域网聊天室 同时学习mfc编程与socket编程