socket,select数据转发问题

young_wind 2002-05-20 06:45:29
while(1)
{
FD_ZERO(&set);
FD_SET(in,&set);
FD_SET(out,&set);
....
if(select(...)<0){
...
}

if(FD_ISSET(in, &set)){
read(in,...);
....
write(out...);
}

if(FD_ISSET(out, &set)){
read(out,...);
....
write(in...);
}
...
}


第一次从out读时是正确的,再循环读时报错内容是:Connection reset by peer

请教是什么原因,谢!

...全文
90 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhukejun 2002-05-21
  • 打赏
  • 举报
回复
是我的服务器段程序,客户端运行一点问题没有。
wwwunix 2002-05-21
  • 打赏
  • 举报
回复
这是你的服务端程序吗?如果是的话,则
if((n = readsockfd,line,MAXLINE)) == 0)
{
printf("%s\n",line);
close(sockfd);

会造成服务端主动关闭。则此时客户端就会报错:Connection reset by peer
zhukejun 2002-05-21
  • 打赏
  • 举报
回复
你把其中的printf()换成你的write就可以了
zhukejun 2002-05-21
  • 打赏
  • 举报
回复
我的监听程序,保证OK!
#include "local.h"
#define OPEN_MAX 10

int main()
{
int i,maxi,maxfd,listenfd,connfd,sockfd;
int nready,client[FD_SETSIZE];
ssize_t n;
fd_set rset,allset;
char line[MAXLINE];
socklen_t clilen;
struct sockaddr_in cliaddr,servaddr;

if((listenfd = socket(AF_INET,SOCK_STREAM,0)) < 0)
{
perror("create socket error");
exit(0);
}

bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(TCP_PORT);
if((bind(listenfd,(SA *)&servaddr,sizeof(servaddr))) < 0)
{
perror("bind error");
exit(0);
}

if(listen(listenfd,5) < 0)
{
perror("listen error");
exit(0);
}

maxfd = listenfd; /*initialize*/
maxi = -1; /*index into client array*/
for(i = 0;i < FD_SETSIZE;i++)
client[i] = -1; /*-1 indicates available entry*/
FD_ZERO(&allset);
FD_SET(listenfd,&allset);
printf("I am going to listening...\n");
for(;;)
{
rset = allset;
if((nready = select(maxfd+1,&rset,NULL,NULL,NULL)) < 0)
{
printf("select error\n");
}

if(FD_ISSET(listenfd,&rset))
{
clilen = sizeof(cliaddr);
if((connfd = accept(listenfd,(SA *)&cliaddr,&clilen)) < 0)
{
printf("accept error\n");
}

for(i = 0;i < FD_SETSIZE; i++)
if(client[i] < 0)
{
client[i] = connfd;
break;
}
if(i == FD_SETSIZE)
{
perror("too many clients");
exit(0);
}
FD_SET(connfd,&allset);
if(connfd > maxfd)
maxfd = connfd;
if(i > maxi)
maxi = i;
if(--nready <= 0)
continue;
}
for(i = 0;i <= maxi;i++)
{
if((sockfd = client[i]) < 0)
continue;
if(FD_ISSET(sockfd,&rset))
{
if((n = read(sockfd,line,MAXLINE)) == 0)
{
printf("%s\n",line);
close(sockfd);
FD_CLR(sockfd,&allset);
client[i] = -1;
}
if(--nready <= 0)
break;
}
}
}
}
growup 2002-05-21
  • 打赏
  • 举报
回复
所以你应该先判断你要写入的描述符是否可写,因为我觉得这个程序很可能写导致写失败。
wwwunix 2002-05-21
  • 打赏
  • 举报
回复
再循环读时报错内容是:Connection reset by peer
好象是连接的问题。你看看你out连接的服务端是否关闭了。
young_wind 2002-05-21
  • 打赏
  • 举报
回复
是为了实现数据转发啊

从in里面读写到out
从out读写到in啊
growup 2002-05-21
  • 打赏
  • 举报
回复
select分读、写集,不知你的select是如何用的。
而且你只用FD_ISSET(in,&set)判断了"in"可读时,为什么要向"out"写入呢?

19,612

社区成员

发帖
与我相关
我的任务
社区描述
系统使用、管理、维护问题。可以是Ubuntu, Fedora, Unix等等
社区管理员
  • 系统维护与使用区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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