读书人

关于socket编程,该怎么解决

发布时间: 2012-03-24 14:00:46 作者: rapoo

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

读书人网 >C语言

热点推荐