当前位置: 技术问答>linux和unix
做一个server端怎么办才能收发数据
来源: 互联网 发布时间:2015-10-17
本文导语: 想做个server端,client连上了之后,如果我这里有数据发给client端就能send,如果client有数据过来就读,现在我只能读完了之后立刻回复一条,不能直接就给client发,有没有个小demo看看,这个是我accept之后做的事情 ...
想做个server端,client连上了之后,如果我这里有数据发给client端就能send,如果client有数据过来就读,现在我只能读完了之后立刻回复一条,不能直接就给client发,有没有个小demo看看,这个是我accept之后做的事情
while(1)
{
timeout.tv_sec = 120;
timeout.tv_usec = 0;
FD_ZERO(&readset);
FD_SET(socket,&readset);
if(select(socket+1,&readset,NULL,NULL,&timeout) is_stop = 1;
return 0;
}
mylen=recv(socket,&buf,sizeof(buf),0);
if(mylen==-1)
{
puts("recv error");
return 0;
}
if(mylen>0)
{
puts("recv");
puts(buf);
readmsg(buf);
}
strcpy(sendbuf,"123");
len=strlen(sendbuf);
if(send(socket,&sendbuf,len,0) == -1)
{
close(socket);
trans->is_stop = 1;
return 0;
}
}
while(1)
{
timeout.tv_sec = 120;
timeout.tv_usec = 0;
FD_ZERO(&readset);
FD_SET(socket,&readset);
if(select(socket+1,&readset,NULL,NULL,&timeout) is_stop = 1;
return 0;
}
mylen=recv(socket,&buf,sizeof(buf),0);
if(mylen==-1)
{
puts("recv error");
return 0;
}
if(mylen>0)
{
puts("recv");
puts(buf);
readmsg(buf);
}
strcpy(sendbuf,"123");
len=strlen(sendbuf);
if(send(socket,&sendbuf,len,0) == -1)
{
close(socket);
trans->is_stop = 1;
return 0;
}
}
|
一般accept后都开一个线程
|
你上面得代码最好放在一个线程内。加一个发送缓冲链表,select时在加一个writeset,判断为可写时就从发送缓冲链表内取一项发送出去,循环...
|
你的select只有读队列,在client没有传信息来之前就阻塞住了,当然不能先往client写了。
建议开两个进程,一个专门读,一个专门写,进程间通过ipc通讯。
建议开两个进程,一个专门读,一个专门写,进程间通过ipc通讯。