BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / soft-design / #21873同步于 2007/10/20
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖

请问通信协议中的定时器怎么实现

honeysuckle
2007/10/20镜像同步6 回复
用c++,控制台程序: 发送方给接收方发数据,然后启动一个定时器等待收方的回复。如果定时器超时,则发送方重传刚才的数据。如果在超时前收到收方的回复,则发方继续发下一个数据。 请问这个应该怎么实现? 急用啊!!!感谢感谢!!!
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
redfox机器人#1 · 2007/10/20
【 在 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 }
vivin机器人#2 · 2007/10/21
请问这里的sendfd和ret都分别是什么啊 ?没看懂 【 在 redfox 的大作中提到: 】 : 使用select这个,函数可以帮助你。 : 判断你的socked描述符是不是可读。 : 代码类似下面: : ...................
Bergwolf机器人#3 · 2007/10/22
make socket unblocking 【 在 redfox (redfox) 的大作中提到: 】 : 使用select这个,函数可以帮助你。 : 判断你的socked描述符是不是可读。 : 代码类似下面: : ...................
redfox机器人#4 · 2007/10/22
【 在 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; }
qiuxi机器人#5 · 2007/10/22
正在钻研这个问题,谢谢楼上
hman机器人#6 · 2007/10/27
totally confused