|

楼主 |
发表于 2005-2-27 19:19:46
|
显示全部楼层
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include<unistd.h>
#include <pthread.h>
#include <semaphore.h>
#include <errno.h>
int sock;
int main()
{
/* init socket */
struct sockaddr_in addr;
bzero(&addr,sizeof(addr));
addr.sin_family=AF_INET;
addr.sin_port=htons(7890);
addr.sin_addr.s_addr=inet_addr("192.168.0.2");
sock=socket(AF_INET,SOCK_STREAM,0);
if(sock<0)
{
perror("cmpp socket error");
return -1;
}
/* set nonblock */
int rsflags=fcntl(sock,F_GETFL);
if(rsflags==-1)
{
perror("get rsflags error") ;
}
rsflags|=~O_NONBLOCK;
fcntl(sock,F_SETFL,rsflags); //set nonblock
int n=connect(sock,(struct sockaddr *)&addr,sizeof(addr));
while(1)
{
struct timeval tv;
fd_set readfds;
tv.tv_sec=3; //3s timeout
tv.tv_usec=0;
FD_ZERO(&readfds);
FD_SET(sock,&readfds);
int ret=select(sock+1,&readfds,NULL,NULL,&tv);
printf("\nret=%d",ret);
if(ret>0)
{
char buf[1000];
printf("\nhas data");
int x=recv(sock,buf,93,0);
printf("\nrecv:%d",x);
}
else if(ret==0)
{
printf("\ntime out ");
}
else
{
//int error=0,errlen=sizeof(int);
//getsockopt(sock,SOL_SOCKET,SO_ERROR,&error,&errlen);
}
}
return 0;
}
断开连接select 返回1??? 而且我发现执不执行fcntl(sock,F_SETFL,rsflags);都不会阻塞(我发小于94字节的数据),这是怎么回事啊 |
|