linux socket accept和connect都直接返回,根本没连上

1.先打开服务端,服务端accept直接返回-1,紧接着read返回bad fd错误
2.打开客户端,connect也是直接返回0, 非法IP也能返回0...
用sudo ufw status查看防火墙确定关闭了。请问是什么原因?

const int MAXFD = 20;
const int MAXLINE = 100;
int main()
{
    int listenfd,connfd,sockfd,maxfd;
    int nready,i,maxi;
    ssize_t n;
    socklen_t clilen;
    int client[MAXFD];
    char buf[MAXLINE];
    fd_set rset,allset;
    for(i=0;i<MAXFD;++i)
        client[i] = -1;
    sockaddr_in servaddr,cliaddr;
    listenfd = socket(AF_INET,SOCK_STREAM,0);
    bzero(&servaddr,sizeof(servaddr));
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(9878);
    int bret=bind(listenfd,(sockaddr*)&servaddr,sizeof(servaddr));
    cout<<bret<<endl;//bret =0;
    int lret= listen(listenfd,100);
    cout<<lret<<endl;//lret = 0;
    cout<<"server start     fd  =  "<<listenfd<<endl;//listenfd = 3;
    cout<<inet_ntoa(servaddr.sin_addr)<<"   "<<ntohs(servaddr.sin_port)<<endl;
    for(;;){
        clilen = sizeof(cliaddr);
        connfd  = accept(sockfd,(sockaddr*)&cliaddr,&clilen);
        cout<<"connection from "<<inet_ntoa(cliaddr.sin_addr)<<"   port   "<<ntohs(cliaddr.sin_port)<<endl;
       if((n=read(connfd,buf,MAXLINE))<0){
            cout<<strerror(errno)<<endl;
            exit(0);
        }else if(n==0){
            cout<<"finish"<<endl;
            close(connfd);
        }else
            write(connfd,buf,n);
    }
        return 0;
        }

忽略前面一些无关量,最初用的是非阻塞IO,失败之后用了简单的阻塞IO 用于测试,才找到问题。

1.先看下网络状态:netstat -an | grep XXX 其中:XXX表示服务器监听的端口号;
2.防止低级错误,accept的各个参数是否都对了,特别是socket出的fd是不是对的;
3.保证服务器运行正常后,在终端使用telnet Server_IP server_port 连下,若连的上,再看下网络状态;
4.若前3都对,在看防火墙;

图片说明你的socket监听的变量是listenfd,accept使用的是sockfd;肯定accept失败啊。

 int main()
{
    int sockfd;
    sockaddr_in servaddr;
    char buf2[MAXLINE];
    ssize_t n;
    sockfd = socket(AF_INET,SOCK_STREAM,0);
    cout<<sockfd<<endl;
    bzero(&servaddr,sizeof(servaddr));
    servaddr.sin_port = htons(9878);
    inet_pton(AF_INET,"127.0.0.1",&servaddr.sin_addr);
    int ret = connect(sockfd,(sockaddr*)&servaddr,sizeof(servaddr));
    cout<<ret<<endl;
    for(;;){}
    exit(0);
}

客户端代码,connect函数直接返回0,非法IP也返回0...怎么回事

你的servaddr差一个协议家族赋值:servaddr.sin_family = AF_INET;