我在使用 select 实现的简单 TCP 客户端时遇到了问题。
问题是,在第二个 printf 处,它仅在到达 connect() 函数之前显示,然后等待用户输入。连接是否会阻止程序的其余部分,直到我发送一些内容? (TCP服务器也是用select实现的,不过我没发现有什么问题) 我在网上搜索过,但找不到原因,或者也许我没有搜索到正确的东西..
#include <includes.h>
int main()
{
int sfd;
fd_set rset;
char buff[1024]=" ";
char playerName[20]="";
int nameSet=0;
struct sockaddr_in server;
sfd= socket(AF_INET,SOCK_STREAM,0);
if(sfd<0)
{ printf("socket not created\n"); return 0; }
bzero(&server,sizeof(struct sockaddr_in));
server.sin_family=AF_INET;
server.sin_port=htons(2020);
inet_aton("127.0.0.1",&server.sin_addr);
//here is the problem after %d which calls the connect() function
printf("Conexion returned:%d \n Name:",connect(sfd,(struct sockaddr *)&server,sizeof(server)));
for(;;)
{
bzero(buff,1024);
FD_ZERO(&rset);
FD_SET(0,&rset);
FD_SET(sfd,&rset);
if(select(sfd+1,&rset,NULL,NULL,NULL)<0)
{
printf("con-lost!\n");
break;
}
if(FD_ISSET(0,&rset))
{
printf("Talk: \n");
scanf("%s",buff);
if(nameSet==0)
{
strcpy(playerName,buff);
nameSet=1;
printf("Hi:%s\n",playerName);
}
if(write(sfd,buff,strlen(buff)+10)<0)
{
break;
}
}
if(FD_ISSET(sfd,&rset)>0)
{
if(read(sfd,buff,1024)<=0)
{
printf("con is off!\n");
break;
}
printf("msg rcd %s\n",buff);
}
} //endfor
close(sfd);
return 0;
} //endmain
connect
函数在阻塞套接字上会阻塞,直到连接操作成功或失败。
您应该注意,将
select
与阻塞套接字一起使用(这就是您的程序所做的)并不能确保您的程序不会阻塞。当您获得 select
命中时,并不能保证 future 操作不会阻塞。
strlen(buff)+10
+10
背后的原因是什么?