关于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