当前位置: 技术问答>linux和unix
问个recv函数的问题
来源: 互联网 发布时间:2016-03-21
本文导语: 想实现通过socket来发送命令,即服务器端每次收到命令处理后继续等待客户端发送来的命令,用了seng、recv函数,这两函数都是阻塞的。 客户端有程序: ...... if (connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr)...
想实现通过socket来发送命令,即服务器端每次收到命令处理后继续等待客户端发送来的命令,用了seng、recv函数,这两函数都是阻塞的。
客户端有程序:
......
if (connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr))==-1)
{
perror("connect");
exit(1);
}
if ((sendbytes=send(sockfd,buf,6,0))==-1)
{
perror("send");
exit(1);
......
服务器端程序:
if ((new_sock = accept(serv_sock, (struct sockaddr *)&their_addr, &sin_size)) == -1)
{
exit_fatal("accept");
}
......
while(1)
{
......
if((recvbytes = recv(new_sock,buf,6,0))==-1)
{
exit_fatal("recv");
}
......
}
......
但最后测试的结果却是客户端发送一次后,如命令字是AAAAAA,服务器端却会连续的调用recv函数接受到AAAAAA
即最后结果是
AAAAAA
AAAAAA
AAAAAA
AAAAAA
......
怎么会出现这种情况呢,如何修改才能使服务器端收到一个AAAAAA后等待客户端继续发送命令呢。
谢谢
客户端有程序:
......
if (connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr))==-1)
{
perror("connect");
exit(1);
}
if ((sendbytes=send(sockfd,buf,6,0))==-1)
{
perror("send");
exit(1);
......
服务器端程序:
if ((new_sock = accept(serv_sock, (struct sockaddr *)&their_addr, &sin_size)) == -1)
{
exit_fatal("accept");
}
......
while(1)
{
......
if((recvbytes = recv(new_sock,buf,6,0))==-1)
{
exit_fatal("recv");
}
......
}
......
但最后测试的结果却是客户端发送一次后,如命令字是AAAAAA,服务器端却会连续的调用recv函数接受到AAAAAA
即最后结果是
AAAAAA
AAAAAA
AAAAAA
AAAAAA
......
怎么会出现这种情况呢,如何修改才能使服务器端收到一个AAAAAA后等待客户端继续发送命令呢。
谢谢
|
同楼上,或者把你的exit_tatal("recv")换成break;也行。
|
man recv
RETURN VALUE
These calls return the number of bytes received, or -1 if an error occurred. The return value will be 0
when the peer has performed an orderly shutdown.
对方已经关了socket,所以你这个应该是正常的.你不能要求你的服务器还是一直阻塞的当你的客户端都已经关掉了socket的时候.
RETURN VALUE
These calls return the number of bytes received, or -1 if an error occurred. The return value will be 0
when the peer has performed an orderly shutdown.
对方已经关了socket,所以你这个应该是正常的.你不能要求你的服务器还是一直阻塞的当你的客户端都已经关掉了socket的时候.
|
用下面的这个RECV函数应该可以,需要指定等待时间
int recvlen(int iSocketID,char *buf,int length){/***接收指定长度数据***/
int nTotalLen;
int nSubLen;
int nShouldLen;
int iRc;
iRc=nTotalLen=nSubLen=nShouldLen=0;
nShouldLen=length;
while(nTotalLen
int recvlen(int iSocketID,char *buf,int length){/***接收指定长度数据***/
int nTotalLen;
int nSubLen;
int nShouldLen;
int iRc;
iRc=nTotalLen=nSubLen=nShouldLen=0;
nShouldLen=length;
while(nTotalLen