首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

关于socket编程,该怎么解决

2012-03-24 
关于socket编程在进行socket编程的时候在连接前我将socket套接字为阻塞模式(默认的),连接成功之后我设置为

关于socket编程
在进行socket编程的时候   在连接前我将socket套接字为阻塞模式(默认的),连接成功之后   我设置为   非阻塞模式   这样的设计方法   好么  

我的代码:
while(1)
{
            char   send_str[100]={0};
    char   recv_str[100]={0};
    int     acceptvalue,f_value,nSelectRet;

    WSADATA                         wsadata;
            DWORD                             wversion;
            SOCKET                           client;

    struct   sockaddr_in   client_addr,clientIP_addr;

    strcpy(send_str, "192168test ");//发送数据

    wversion=MAKEWORD(2,2);
            WSAStartup(wversion,&wsadata);//winsock版本号


          client=socket(AF_INET,SOCK_STREAM,0);//创建socket套接字
                                                                                     
                                                                             

//本地绑定
      clientIP_addr.sin_family=AF_INET;
      clientIP_addr.sin_addr.S_un.S_addr   =inet_addr( "192.168.1.90 ");//本地ip地址
      clientIP_addr.sin_port   =htons(5000);
              bind(client,(struct   sockaddr*)&clientIP_addr,sizeof(clientIP_addr));
   


      struct   timeval   tv;
      tv.tv_sec=3;
              tv.tv_usec=120;
              fd_set   sk_fd;
              FD_ZERO(&sk_fd);
              FD_SET   (client,&sk_fd);

//目标绑定
            client_addr.sin_family=AF_INET;
    client_addr.sin_addr.S_un.S_addr   =inet_addr( "192.168.1.16 ");
    client_addr.sin_port   =htons(9999);


    f_value=   connect(client,(const   sockaddr   *)&client_addr,sizeof(client_addr));
            printf( "f_value=%d\n ",f_value);

   
         
    if(f_value   ==   0)//连接成功
    {  


        ULONG   nonBlock   =   1;
                int   dd=ioctlsocket(client,   FIONBIO,   &nonBlock);//设置为非组塞模式
                        printf( "%d\n ",dd);

                        f_value=send(client,send_str,strlen(send_str),0);  


printf( "sendf_value=%d\n ",f_value);

                        if(f_value   ==-1)//发送失败
{
f_value=send(client,send_str,strlen(send_str),0);  
        printf( "sendf_value=%d\n ",f_value);
}

  nSelectRet   =     select(acceptvalue+1,&sk_fd,NULL,NULL,&tv);
                if(nSelectRet==0)//超时发生,无可读数据  
{      
printf( "超时发生,无可读数据\n ");
}

                        f_value=recv(client,recv_str,sizeof(recv_str),0);
                        printf( "recvf_value=%d\n ",f_value);
                        printf( "recv_str=%s\n ",recv_str);
     
    }
    else//连接失败
    {
                      printf( "连接失败\n ");
    }

   
            closesocket(client);
            Sleep(5000);
          printf( "=======================================================================\n ");
           
}        


[解决办法]
不好


你程序的send recv會立刻返回, 而數據並沒有發送出去
[解决办法]
你应该用个循环把select 和send recv关联起来,让他把数据发送接收完
[解决办法]
为什么要这样。。。。
[解决办法]
select超時
或者setsockopt 設置RCVTIMEO

热点排行