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;