socket 中recv只能接收一次,下次就不能接收数据了,百思不得其解。

lovelyzuzu 2006-07-26 06:02:48
函数如下:

DWORD HandleWebRequest()
{
SOCKET sLiten,client;
struct sockaddr_in tcpaddr,from;
int fromlen,port=6000 ;
int pktlen;
u_long flags=1;
char Buffer[1024];

fromlen = sizeof(from);

char* HttpHead=" Pass customer's Request";
int HttpHeadlength=strlen(HttpHead);
char* HttpData="this is data,Begin transfer";
int HttpDatalength=strlen(HttpData);
sLiten=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

if (sLiten == INVALID_SOCKET)
goto ErrorExit;
///////////////////////////////
tcpaddr.sin_family=AF_INET;
tcpaddr.sin_addr.s_addr =INADDR_ANY;
tcpaddr.sin_port=htons(port);
if (bind(sLiten,(struct sockaddr*)&tcpaddr,sizeof(tcpaddr))==SOCKET_ERROR)
goto ErrorExit;

if (listen(sLiten,6) == SOCKET_ERROR)
goto ErrorExit;

while(1)
{
client = accept(sLiten, (struct sockaddr *)&from,&fromlen);
if(client==INVALID_SOCKET)
goto ErrorExit;
memset(Buffer,0,sizeof(Buffer));
if ((pktlen = recv(client,Buffer,1024,0))<=0) //第一次能成功,第二次就失败了。
{
int errorNo=WSAGetLastError(); // errorNo=10054.
closesocket(client);
break;
}
if(strlen(Buffer)>0)
{
if(strstr(Buffer,"Request data")!=NULL)
{
send(client,HttpHead,HttpHeadlength,0);
closesocket(client);
}
else if(strstr(Buffer,"Transfer Data")!=NULL)
{
send(client,HttpData,HttpDatalength,0);
closesocket(client);
}
}
}
closesocket(sLiten);
ErrorExit:
{
fprintf(stderr,"failed with error %d\n",WSAGetLastError());
return -1;
}
return 0L;
}


错在什么地方了?
...全文
1098 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xzhuihui 2006-07-28
  • 打赏
  • 举报
回复
if ((pktlen = recv(client,Buffer,1024,0))<=0) //第一次能成功,第二次就失败了。
{
int errorNo=WSAGetLastError(); // errorNo=10054.
closesocket(client);
break;
}

这处代码的意思是不是说当读取数据出错或者是读取到EOF之后才关闭套接口

如果读取正常的话,你在下一轮循环是重新Accept了
这个函数应该是有新的连接到来,才会返回的,而你的已经连接上
没有新的连接到来,会一直阻塞在Accept函数

不知道是不是这个问题,请各位大大指教

你可以用
while ((pktlen = recv(client,Buffer,1024,0))>0) //第一次能成功,第二次就失败了。
{
.....
}
看是否可以解决这个问题
Analyst 2006-07-28
  • 打赏
  • 举报
回复
呵呵,是我把strstr看成是strcmp了。
believe_me 2006-07-28
  • 打赏
  • 举报
回复
还有if(strstr(Buffer,"Request data")!=NULL)这句其实是在判断Buffer!="Request data",错误百出啊。

------------------------------------------------------

这个应该是判断Buffer中是否存在"Request data"子串吧!
sunj_study 2006-07-28
  • 打赏
  • 举报
回复
那你的客户端每次发数据之前要重新connect了
LOWGUN 2006-07-26
  • 打赏
  • 举报
回复
难道不是发送完数据就关闭连接吗?
LOWGUN 2006-07-26
  • 打赏
  • 举报
回复
关键是我后面新的连接又建立起来了啊,有什么问题?
Analyst 2006-07-26
  • 打赏
  • 举报
回复
to chenyulin
不好意思,我不太上CSDN,可能是没注意吧。
chenyulin 2006-07-26
  • 打赏
  • 举报
回复
Analyst() ( ) 大虾说得对!!!!
只从上次大虾帮我解决完问题,以后的问题怎么老没有你的回答?
Analyst 2006-07-26
  • 打赏
  • 举报
回复
还有if(strstr(Buffer,"Request data")!=NULL)这句其实是在判断Buffer!="Request data",错误百出啊。
Analyst 2006-07-26
  • 打赏
  • 举报
回复
你调用了closesocket(client);把连接关了,当然不能再接收了。

18,363

社区成员

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

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