返回信息流用c++,控制台程序:
发送方给接收方发数据,然后启动一个定时器等待收方的回复。如果定时器超时,则发送方重传刚才的数据。如果在超时前收到收方的回复,则发方继续发下一个数据。
请问这个应该怎么实现?
急用啊!!!感谢感谢!!!
这是一条镜像帖。来源:北邮人论坛 / soft-design / #21873同步于 2007/10/20
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖
请问通信协议中的定时器怎么实现
honeysuckle
2007/10/20镜像同步6 回复
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
【 在 honeysuckle 的大作中提到: 】
: 用c++,控制台程序:
: 发送方给接收方发数据,然后启动一个定时器等待收方的回复。如果定时器超时,则发送方重传刚才的数据。如果在超时前收到收方的回复,则发方继续发下一个数据。
: 请问这个应该怎么实现?
: ...................
使用select这个,函数可以帮助你。
判断你的socked描述符是不是可读。
代码类似下面:
fd_set set;
struct timeval time;
......
write(sendfd, buff, strlen(buff));
FD_ZERO(&set);
FD_SET(sendfd, &set);
time.tv_sec = 20; //20秒超时
time.tv_usec = 0;
//sendfd 是通信的socket描述符。
select(sendfd+1, &set, NULL, NULL, &time);
if(FD_IDDET(sendfd, &ret))
{
//接受方接到数据
}
else
{
//超时,send the data again
}
请问这里的sendfd和ret都分别是什么啊
?没看懂
【 在 redfox 的大作中提到: 】
: 使用select这个,函数可以帮助你。
: 判断你的socked描述符是不是可读。
: 代码类似下面:
: ...................
make socket unblocking
【 在 redfox (redfox) 的大作中提到: 】
: 使用select这个,函数可以帮助你。
: 判断你的socked描述符是不是可读。
: 代码类似下面:
: ...................
【 在 honeysuckle 的大作中提到: 】
: 用c++,控制台程序:
: 发送方给接收方发数据,然后启动一个定时器等待收方的回复。如果定时器超时,则发送方重传刚才的数据。如果在超时前收到收方的回复,则发方继续发下一个数据。
: 请问这个应该怎么实现?
: ...................
//server.c
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
int main(int argc, char**argv)
{
int listenfd, connfd;
socklen_t clilen;
struct sockaddr_in servaddr, cliaddr;
char line[1024] = {0};
int n;
listenfd = socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = inet_addr("10.1.131.7");
servaddr.sin_port = htons(6666);
if(bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr))<0)
{
perror("bind");
}
if(listen(listenfd, 10)<0)
{
perror("listen");
}
printf("server run...\n");
printf("waiting for connect...\n");
printf("ready for read...\n");
clilen = sizeof(cliaddr);
connfd = accept(listenfd, (struct sockaddr*)&cliaddr, &clilen);
while(1)
{
n = read(connfd, line, 1024);
printf("receive data %s\n", line);
if(n == 0)
{
break;
}
//sleep(2);
printf("write data %s\n", line);
write(connfd, line, n);
bzero(line, 1024);
}
close(connfd);
return 0;
}
//client with no select
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
int main(int argc, char**argv)
{
int serverfd;
socklen_t clilen;
struct sockaddr_in servaddr, cliaddr;
char *line = "hello world\n";
char rn[1024] = {0};
int n;
serverfd = socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = inet_addr("10.1.131.7");
servaddr.sin_port = htons(6666);
if(connect(serverfd, (struct sockaddr*)&servaddr, sizeof(servaddr))<0)
{
perror("connect error:");
}
int opt = fcntl(serverfd, F_GETFL);
if(fcntl(serverfd, F_SETFL, opt|O_NONBLOCK)<0)
{
perror("nonblock");
}
printf("client run...\n");
write(serverfd, line, strlen(line));
int flag = 0;
while(1)
{
int n = read(serverfd, rn, 1024);
if(n < 0)
{
if(errno == EAGAIN)
{
flag++;
if(flag == 10)
{
flag = 0;
printf("time out,send data again\n");
write(serverfd, line, strlen(line));
continue;
}
sleep(1);
printf("no data to read\n");
continue;
}
}
else
{
printf("read data %s", rn);
bzero(rn, 1024);
write(serverfd, line, strlen(line));
flag = 0;
}
}
close(serverfd);
return 0;
}
//client with select
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/time.h>
int main(int argc, char**argv)
{
int serverfd;
socklen_t clilen;
struct sockaddr_in servaddr, cliaddr;
char *line = "hello world\n";
char rn[1024] = {0};
int n;
serverfd = socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = inet_addr("10.1.131.7");
servaddr.sin_port = htons(6666);
if(connect(serverfd, (struct sockaddr*)&servaddr, sizeof(servaddr))<0)
{
perror("connect error:");
}
int opt = fcntl(serverfd, F_GETFL);
if(fcntl(serverfd, F_SETFL, opt|O_NONBLOCK)<0)
{
perror("nonblock");
}
//select
fd_set ret;
struct timeval tv;
int retval;
FD_ZERO(&ret);
FD_SET(serverfd, &ret);
tv.tv_sec = 5;
tv.tv_usec = 0;
printf("client run...\n");
write(serverfd, line, strlen(line));
while(1)
{
retval = select(serverfd+1, &ret, NULL, NULL, &tv);
if(retval == -1)
perror("select");
else if(retval)
{
int n = read(serverfd, rn, 1024);
if(n < 0)
{
if(errno == EAGAIN)
{
printf("no data to read\n");
continue;
}
}
else
{
printf("read data %s", rn);
bzero(rn, 1024);
write(serverfd, line, strlen(line));
}
}
else
{
printf("time out send data again\n");
write(serverfd, line, strlen(line));
}
tv.tv_sec = 5;
tv.tv_usec = 0;
}
close(serverfd);
return 0;
}