1

selectを使用して実装された単純なTCPクライアントで問題が発生しました。

問題は、2番目のprintfで、connect()関数に到達する前にのみ表示され、ユーザー入力を待機することです。connectは、何かを送信するまでプログラムの残りの部分をブロックしますか?(TCPサーバーもselectを使用して実装されていますが、問題は見つかりませんでした)Webで検索したところ、原因が見つからなかったか、正しいものを検索できなかった可能性があります。

#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
4

1 に答える 1

1

このconnect関数は、ブロッキングソケットで、接続操作が成功または失敗するまでブロックします。

selectプログラムが行うブロッキングソケットを使用しても、プログラムがブロックされないことを保証するものではないことに注意してください。ヒットした場合、それは将来の操作がブロックselectされないことを保証するものではありません。

strlen(buff)+10

の背後にある理由は何+10ですか?

于 2013-01-20T18:25:32.337 に答える