網路超時 -- 採取 SO_RCVTIMEO套接字選項設定 ( recv / recvfrom)
阿新 • • 發佈:2018-11-08
#include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include <fcntl.h> #include <sys/shm.h> #include <error.h> #include <errno.h> #define MYPORT 8887 #define QUEUE 20 #define BUFFER_SIZE 1024 int main() { ///定義sockfd int server_sockfd = socket(AF_INET,SOCK_STREAM, 0); struct timeval tv; tv.tv_sec = 5; tv.tv_usec = 0; setsockopt(server_sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); ///定義sockaddr_in struct sockaddr_in server_sockaddr; server_sockaddr.sin_family = AF_INET; server_sockaddr.sin_port = htons(MYPORT); server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY); ///bind,成功返回0,出錯返回-1 if(bind(server_sockfd,(struct sockaddr *)&server_sockaddr,sizeof(server_sockaddr))==-1) { perror("bind"); exit(1); } printf("監聽%d埠\n",MYPORT); ///listen,成功返回0,出錯返回-1 if(listen(server_sockfd,QUEUE) == -1) { perror("listen"); exit(1); } ///客戶端套接字 char buffer[BUFFER_SIZE]; struct sockaddr_in client_addr; socklen_t length = sizeof(client_addr); printf("等待客戶端連線\n"); ///成功返回非負描述字,出錯返回-1 int conn = accept(server_sockfd, (struct sockaddr*)&client_addr, &length); if(conn<0) { perror("connect"); exit(1); } printf("客戶端成功連線\n"); while(1) { memset(buffer,0,sizeof(buffer)); int len = recv(conn, buffer, sizeof(buffer),0); if (len < 0) { if (errno == EWOULDBLOCK) { printf("socket timeout.\n"); continue; } else { printf("recv error.\n"); } } //客戶端傳送exit或者異常結束時,退出 if(strcmp(buffer,"exit\n")==0 || len<=0) break; printf("來自客戶端資料:%s\n",buffer); send(conn, buffer, len, 0); printf("傳送給客戶端資料:%s\n",buffer); } close(conn); close(server_sockfd); return 0; }