服务器程序为何接收不到空格

至善者善之敌 2011-05-11 02:19:41
以下是程序

while(1)
{
SOCKADDR_IN addrClient;

int len=sizeof(SOCKADDR);
SOCKET recv_socket=((RECVPARAM*)lpParameter)->sock_refer;
HWND hwnd=((RECVPARAM*)lpParameter)->hwnd;
//delete lpParameter;

SOCKET sockConn=accept(recv_socket,(SOCKADDR*)&addrClient,&len);//等待客户请求到来;当请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept)
if(sockConn==SOCKET_ERROR)
{
AfxMessageBox("数据接收失败!");
//error=WSAGetLastError();
closesocket(sockConn);
return 0;
}
char recvBuf[1000];
memset(recvBuf,'\0',1000);
recv(sockConn,recvBuf,1000,0);
if(recvBuf[0]=='H'&&recvBuf[1]=='E'&&recvBuf[2]=='L'&&recvBuf[3]=='P')
{
char recvdataram[1000];
int i;
mode=1;
::PostMessage(hwnd,WM_RECVDATA,0,0);
remoteram[0]=0;
while(!remoteram[0])
Sleep(100);
send(sockConn,remoteram,100,0);//用返回的套接字和客户端进行通讯
memset(recvdataram,'\0',1000);
database[0]='\0';
for(i=0;i<6;i++)
{
int recvret=recv(sockConn,recvdataram,1000,0);
if(recvret==SOCKET_ERROR)
{
AfxMessageBox("数据接收失败!");
closesocket(sockConn);
return 0;
}
strcat(database,recvdataram);
database[(i+1)*1000]='\0';
}

for(i=0;i<6000;i=i+2)
{
if(database[i]>'9')
database[i]=database[i]-0x37;
else
database[i]=database[i]-0x30;
if(database[i+1]>'9')
database[i+1]=database[i+1]-0x37;
else
database[i+1]=database[i+1]-0x30;
database[(i/2)]=database[i]*16+database[i+1];
}
closesocket(sockConn);
mode=3;
::PostMessage(hwnd,WM_RECVDATA,0,0);
mode=2;
::PostMessage(hwnd,WM_RECVDATA,0,0);
}
else
{

DWORD dwAddress=ntohl(addrClient.sin_addr.S_un.S_addr);
char OK[]="OK";
int Length_ok=strlen(OK);
int send_ok=send(sockConn,OK,Length_ok,0);//用返回的套接字和客户端进行通讯
if(send_ok==SOCKET_ERROR)
AfxMessageBox("发送过程中发生一个错误!",NULL,MB_OK);
// closesocket(sockConn);
mode=0;
::PostMessage(hwnd,WM_RECVDATA,(WPARAM)dwAddress,(LPARAM)recvBuf);
}
}



当ACCEPT接收客户端其它字符串数据的话没有问题,但一旦客户端发送空格(ASCII 为20)的话就无限阻塞接收不到了
...全文
162 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
至善者善之敌 2011-05-12
  • 打赏
  • 举报
回复
想了个折中的办法,用了setsockopt ,问题解决,结贴
mudunke775 2011-05-11
  • 打赏
  • 举报
回复
2个线程,一个accept,一个recv
多线程都是这么处理的
ouyh12345 2011-05-11
  • 打赏
  • 举报
回复
accept后,开线程处理收、发
至善者善之敌 2011-05-11
  • 打赏
  • 举报
回复
真的没人来帮一下了
至善者善之敌 2011-05-11
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 lirg8405 的回复:]
你的问题肯定是在客户端发送完第一次字符串后,调用了closesocket,这样的话,你再怎么发肯定是不行的了,肯定是阻塞在accept,因为没有新的客户端调用connect

假设如果客户端中断了,重新连接,那么还想继续按原连接处理,那么可以把处理写成一个类,把得到的socket传进去处理,这时,你必需定一个协议,让服务器知道,这个新的连接需要按上一次旧的连接处理,也就是替换掉旧的连接
[/Quote]

你这个应该不是好的思路,因为客户端新的连接后我只能通过 SOCKET sockConn=accept(recv_socket,(SOCKADDR*)&addrClient,&len); 来SEND或RECEIVE ,头痛如何解决呢?
至善者善之敌 2011-05-11
  • 打赏
  • 举报
回复
???,没人回答我了
lirg8405 2011-05-11
  • 打赏
  • 举报
回复
你的问题肯定是在客户端发送完第一次字符串后,调用了closesocket,这样的话,你再怎么发肯定是不行的了,肯定是阻塞在accept,因为没有新的客户端调用connect

假设如果客户端中断了,重新连接,那么还想继续按原连接处理,那么可以把处理写成一个类,把得到的socket传进去处理,这时,你必需定一个协议,让服务器知道,这个新的连接需要按上一次旧的连接处理,也就是替换掉旧的连接
至善者善之敌 2011-05-11
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 fishion 的回复:]
把accept放到循环体外面
[/Quote]

是个方法,可是要是客户端那边中断连接,从新向服务器发送数据,并且客户端的IP也变了,改如何解决
fishion 2011-05-11
  • 打赏
  • 举报
回复
把accept放到循环体外面
至善者善之敌 2011-05-11
  • 打赏
  • 举报
回复
感谢楼上两位作答,如果我不想关闭closesocket(sockConn); 那应该如何来写?
ouyh12345 2011-05-11
  • 打赏
  • 举报
回复
对于用一个客户端,不需要accept多次
无言猪 2011-05-11
  • 打赏
  • 举报
回复
你的客户端程序是怎么写的?第一遍发送完成后的socket是closesocket之后20秒再次connect->send->closesocket?如果你只是等20秒再次send,服务器的accept肯定阻塞啊。
至善者善之敌 2011-05-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ouyh12345 的回复:]
recv没有返回?
[/Quote]

recv返回没有问题!
再描述一遍我的问题吧,当服务器端接收第一遍字符时候没有问题,服务器返回OK,然后客户端每隔20秒发送一个空格我这边就阻塞在ACCEPT这块了,接收不到!
ouyh12345 2011-05-11
  • 打赏
  • 举报
回复
recv没有返回?

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧