socket编程,服务器端收到数据后,立即向客户端发送数据,但客户端收不到?代码贴出,帮我分析一下。

gomoney 2006-03-17 06:50:48
socket编程,服务器端收到数据后,立即向客户端发送数据,但客户端收不到?代码贴出,帮我分析一下。
这是服装器端代码:

FD_ZERO (&fdR0);
FD_SET (sockfd, &fdR0);

while(socketstat!=SOCK_ERR)
{
switch(socketstat)
{
case SOCK_RECV:
fdR1 = fdR0;
timeout.tv_sec = 10;
timeout.tv_usec = 500000;
switch (select (FD_SETSIZE, &fdR1, NULL, NULL, &timeout))
{
case 0: //timeout
printf ("select time out!\n");
socketstat = SOCK_ERR;
break;
case -1: //error
printf ("select error!\n");
socketstat = SOCK_ERR;
break;
default:
if (FD_ISSET (sockfd, &fdR1))
{
memset(recvbuffer,0x00,sizeof(recvbuffer));
if ((len =recv (sockfd, recvbuffer,1024,0)) == -1)
{
fprintf (stderr, "Read Error:%s\n", strerror(errno));
socketstat = SOCK_ERR;
}
//printf("len=%d",len);
if (len > 0)
{
len=send(sockfd,"abc",3,0);
printf("%s , recvlen=%d\n ",recvbuffer,len);
socketstat = SOCK_SEND;
}
else
{
socketstat = SOCK_ERR;
}
}
}
break;
case SOCK_SEND:
memset(readbuffer,0x00,sizeof(readbuffer));
getimage(openfile,readbuffer,&buffersize);
printf("ok %d\n",buffersize);
sendlen=0;
do{
len=send(sockfd,readbuffer+sendlen,buffersize-sendlen,0);
//len=send(sockfd,"abc",3,0);
if(len<=0)
{
printf("send error!\n");
break;
}
else
{
printf("send %d \n ",len);
}
sendlen+=len;
break;
}
}while(sendlen<buffersize);
socketstat=SOCK_ERR;
break;
}
}
close(sockfd);
fclose(openfile);
return 0;
}

这边send的返回值是正确的,但是客户端报错 Connection reset by peer!
...全文
272 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
gomoney 2006-03-28
  • 打赏
  • 举报
回复
字节,怎么说?
不过这应该是另一个问题了,做人要厚道,先结贴,再开个贴子问吧.
cqgaoke 2006-03-28
  • 打赏
  • 举报
回复
是不是字节方面有问题。
gomoney 2006-03-24
  • 打赏
  • 举报
回复
谢谢 threadpaper(便桶超人)

不过这段程序只能在PC上的Linux测试通过,但我在ARM+Linux2.4上,却出现我原来说的情况,ARM板发送,PC端收不到,但连接成功。
晕死了,这两者有什么区别吗?
threadpaper 2006-03-19
  • 打赏
  • 举报
回复
我试了下,客户端可以收到的
下面的source,稍做改动,希望对你有帮助

#include <stdio.h>
#include <memory.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/errno.h>
#include <sys/socket.h>
#include <signal.h>
#include <netdb.h>
#include <netinet/in.h>
#include <unistd.h>
#include <errno.h>
#define SOCK_ERR -1
#define SOCK_RECV 1
#define SOCK_SEND 0



void OUT(int a)
{
exit(0);
}
int main(void)
{
int socketstat = SOCK_RECV;
fd_set fdR0, fdR1;
int sockfd, srcfd;
int len, sendlen, buffersize;
int i;
char recvbuffer[1024], readbuffer[1024];
struct sockaddr_in ssin;
struct timeval timeout;


/*设置TCP环境 */
if ( (srcfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0 )
{
fprintf(stderr, "socket error,[%s]\n", strerror(errno));
return(-1);
}

bzero((char*)&ssin, sizeof(ssin));
ssin.sin_family = AF_INET;
ssin.sin_addr.s_addr = INADDR_ANY;
ssin.sin_port = htons(atoi("2233"));
if ( bind(srcfd, (struct sockaddr *)&ssin, sizeof(ssin)) < 0 )
{
close(srcfd);
fprintf(stderr, "bind error,[%s]\n", strerror(errno));
return(-1);
}
i = sizeof(ssin);
if ( getsockname(srcfd, (struct sockaddr *)&ssin, &i) < 0 )
{
close(srcfd);
fprintf(stderr, "getsockname error,[%s]\n", strerror(errno));
return(-1);
}

if ( listen(srcfd, SOMAXCONN) < 0 )
{
close(srcfd);
fprintf(stderr, "listen error,[%s]\n", strerror(errno));
return(-1);
}
/*常驻进程 */
signal(SIGCLD, SIG_IGN);
signal(SIGTERM, OUT);
if( (fork()) > 0 )
{
sleep(1);
exit(0);
}

for(;;)
{
sockfd = accept(srcfd, (struct sockaddr *)&ssin, &i);
if (sockfd < 0)
{
fprintf(stderr, "accept error,[%s]\n", strerror(errno));
return -1;
}
if ((i = fork()) > 0)
{
/* 父进程关通讯套接字 继续等待连接 */
close(sockfd);
}
else if (i < 0)
{
fprintf(stderr, "fork error,[%s]\n", strerror(errno));
close(srcfd);
close(sockfd);
exit(0);
}
else
{
/* 子进程处理事务 */
close(srcfd);
FD_ZERO (&fdR0);
FD_SET (sockfd, &fdR0);

while(socketstat!=SOCK_ERR)
{
switch(socketstat)
{
case SOCK_RECV:
fdR1 = fdR0;
timeout.tv_sec = 10;
timeout.tv_usec = 500000;
switch (select (FD_SETSIZE, &fdR1, NULL, NULL, &timeout))
{
case 0://timeout
printf ("select time out!\n");
socketstat = SOCK_ERR;
break;
case -1://error
printf ("select error!\n");
socketstat = SOCK_ERR;
break;
default:
/* 套接口可读 */
if (FD_ISSET (sockfd, &fdR1))
{
memset(recvbuffer,0x00,sizeof(recvbuffer));
if ((len =recv (sockfd, recvbuffer,1024,0)) == -1)
{
fprintf (stderr, "Read Error:%s\n", strerror(errno));
socketstat = SOCK_ERR;
}
if (len > 0)
{
printf("[%s], recvlen=%d\n ",recvbuffer,len);
socketstat = SOCK_SEND;
}
else
{
socketstat = SOCK_ERR;
}
}
}
break;
case SOCK_SEND:
memset(readbuffer,0x00,sizeof(readbuffer));
/* 测试数据 */
strcpy(readbuffer, "048 111111111111112222222222222222233333333333334444");
buffersize = strlen(readbuffer);
sendlen=0;
/* 发送指定长度数据 */
do
{
len=send(sockfd,readbuffer+sendlen,buffersize-sendlen,0);
if(len<=0)
{
printf("send error!\n");
break;
}
else
{
printf("send %d \n ",len);
}
sendlen+=len;
}while(sendlen<buffersize);
socketstat=SOCK_ERR;
break;
}
}
/* 发送数据后end while 连接断开 子进程退出*/
close(sockfd);
exit(0);
}
}
}

threadpaper 2006-03-18
  • 打赏
  • 举报
回复
粗略看下,服务端程序没看出问题
Connection reset by peer 一般是由于客户端在收数据时连接断掉
gomoney 2006-03-18
  • 打赏
  • 举报
回复
但是客户端程序正常啊,我把客户端跟别的程序调试了一下,运转正常的。

23,116

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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