我给服务器发信息 然后服务器就给我回一个信息 我就接受程序可以连接成功 发送函数 send也返回了正确的字符长度
但继续执行recv函数时 程序老半天没反应了
代码如下 请大家帮看看是什么问题
SOCKET m_hSock;
m_hSock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(m_hSock!=INVALID_SOCKET)
{
BOOL sopt = TRUE;
setsockopt(m_hSock, IPPROTO_TCP, TCP_NODELAY,
(char *)&sopt, sizeof(BOOL));
SOCKADDR_IN sockaddr;
memset(&sockaddr, 0, sizeof(SOCKADDR_IN));
....
....
if(bConnect==SOCKET_ERROR)
{
MessageBox(NULL,"连接失败","警告",NULL);
}
else
{
char send_buf[]={"ereyev"}; //字符串正确
int bytesSend=send(m_hSock,send_buf,strlen(send_buf),0); //已经发送成功了 //问题在这下面
int bytesRecv = SOCKET_ERROR;
char recv_buf[1024]="";
memset(&recv_buf,0,sizeof(recv_buf));
while( bytesRecv == SOCKET_ERROR )
{
bytesRecv = recv( m_hSock, recv_buf, strlen(recv_buf), 0 );
if ( bytesRecv == 0 || WSAGetLastError() == WSAECONNRESET )
{
AfxMessageBox( "Connection Closed.\n");
break;
}
else
{
AfxMessageBox(bytesRecv);
}
}
}
但继续执行recv函数时 程序老半天没反应了
代码如下 请大家帮看看是什么问题
SOCKET m_hSock;
m_hSock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(m_hSock!=INVALID_SOCKET)
{
BOOL sopt = TRUE;
setsockopt(m_hSock, IPPROTO_TCP, TCP_NODELAY,
(char *)&sopt, sizeof(BOOL));
SOCKADDR_IN sockaddr;
memset(&sockaddr, 0, sizeof(SOCKADDR_IN));
....
....
if(bConnect==SOCKET_ERROR)
{
MessageBox(NULL,"连接失败","警告",NULL);
}
else
{
char send_buf[]={"ereyev"}; //字符串正确
int bytesSend=send(m_hSock,send_buf,strlen(send_buf),0); //已经发送成功了 //问题在这下面
int bytesRecv = SOCKET_ERROR;
char recv_buf[1024]="";
memset(&recv_buf,0,sizeof(recv_buf));
while( bytesRecv == SOCKET_ERROR )
{
bytesRecv = recv( m_hSock, recv_buf, strlen(recv_buf), 0 );
if ( bytesRecv == 0 || WSAGetLastError() == WSAECONNRESET )
{
AfxMessageBox( "Connection Closed.\n");
break;
}
else
{
AfxMessageBox(bytesRecv);
}
}
}
因为客户端在等待服务器端发送数据过来,所以端口一直在监听有没有数据发送过来,处于阻塞状态~~
对了,你的服务器端发送部分的代码贴出来看看,有可能是服务器端发送数据出错,使得客户端一直在等待数据~~~
是啊 我的程序就是堵在recv这里 没反应了
用Getlasterror()都不能获取错误号
程序执行始终阻塞到以上这行,不往下走.我这边的代码好象没有什么问题啊?
各位有意见就提一下啊
recv要从套接口m_hSock中读取strlen(recv_buf)长的数据到recv_buf中,你定义的recv_buf是1024,最好检查一下服务器发回的字节数够不够1024,如果不够,没意外中断情况下recv要阻塞到读完1024为止才返回。
我又重新想了一边 可不可能是我发的指令里有错 导致服务器没回执指令
结果我用抓包软件一看的确和要求发的指令 有点不同就是
发的内容都一样的 但是服务器接受的指令里还有个结束符 但这个结束我不知道怎么发过去啊
要求发的指令:
content 包信息
:000450000008A4 3A 30 30 30 34 35 30 30 30 30 30 30 38 41 34 0D 0A
(这个0D 0A是祯结束符)
但我是这样发的char send_buf[]={":000450000008A4\0"};
发的信息截下来是这样的:
content 包信息
:000450000008A4 3A 30 30 30 34 35 30 30 30 30 30 30 38 41 34 00 00 请问我怎么才能把这个贞结束符给发出去 和他要求的指令一样呢?
谢谢各位给的建议 非常谢谢啊 分不够可以再加
如果不是必须要的,你可以:strcat( send_buf, "\r\n" );如果是必须要的,你可以:
char *send_buf;
int i = strlen(":000450000008A4");
send_buf = (char*)malloc( i+3 );
ZeroMemory( send_buf, i+3 );
strcpy( send_buf, ":000450000008A4" );
send_buf[i+1] = '\r';
send_buf[i+2] = '\n';
...
...
int bytesSend=send(m_hSock,send_buf,i+3,0);
...
...
//最后别忘了释放
free( send_buf );