天天看點

繼續研究 SO_KEEPALIVE 問題

借助于網上他人文章,研究 SO_KEEPLIVE 問題:http://www.iteye.com/topic/1118643

client端加了 setsockopt 函數調用。看看能否在伺服器端未啟動時,或下線時候,一直等待兩小時左右。

複制代碼

#include <sys/types.h>                        

#include <sys/socket.h>                        

#include <stdio.h>                        

#include <netinet/in.h>                        

#include <arpa/inet.h>                        

#include <unistd.h>                        

#include <stdlib.h>                        

int main(){                        

   int sockfd;                        

   int len;                        

   struct sockaddr_in address;                        

   int result;                        

   int i,byte;                        

   char char_recv,char_send;

   int optval;                        

   socklen_t optlen = sizeof(optval); 

   if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1){                        

           perror("socket");                        

           exit(EXIT_FAILURE);                        

   }                        

   /* Set the option active */                        

   optval = 1;                        

   optlen = sizeof(optval);                        

   if(setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, &optval, optlen) < 0){ 

      perror("setsockopt()");                        

      close(s);                        

      exit(EXIT_FAILURE);                        

   address.sin_family = AF_INET;                        

   address.sin_addr.s_addr = inet_addr("127.0.0.1");                        

   address.sin_port = 8080;                        

   len = sizeof(address);                        

   if((result = connect(sockfd,(struct sockaddr *)&address,len)) == -1){ 

            perror("connect");                        

            exit(EXIT_FAILURE);                        

   printf("please enter the context you want to send to server :"); 

   scanf("%c",&char_send);                        

   if(byte = send(sockfd,&char_send,1,0) == -1){                        

           perror("send");                        

   if(byte = recv(sockfd,&char_recv,1,0) == -1){                        

           perror("recv");                        

   printf("receive from server %c\n",char_recv); 

   close(sockfd);                        

   exit(0);                        

}                        

伺服器端邏輯不變:

#include <sys/types.h>                

#include <sys/socket.h>                

#include <stdio.h>                

#include <netinet/in.h>                

#include <arpa/inet.h>                

#include <unistd.h>                

#include <stdlib.h>                              

char dict(char temp){                

   if(temp == 'Z'){                

         return 'A';                

   }                

   return temp+1;                

}              

int main(){                

      int server_sockfd,client_sockfd;                

      int server_len,client_len;                

      struct sockaddr_in server_address;                

      struct sockaddr_in client_address;                

      int i,btye;                

      char char_recv,char_send;                

      server_address.sin_family = AF_INET;                

      server_address.sin_addr.s_addr = inet_addr("127.0.0.1");                

      server_address.sin_port = 8080;                

      server_len = sizeof(server_address);                

      server_sockfd = socket(AF_INET,SOCK_STREAM,0);

      bind(server_sockfd,(struct sockaddr *)&server_address,server_len);  

      listen(server_sockfd,5);                

      printf("server waiting for connect\n"); 

      client_len = sizeof(client_address);                

      client_sockfd = accept(server_sockfd,

         (struct sockaddr *)&client_address,(socklen_t *)&client_len);

      if(btye = recv(client_sockfd,&char_recv,1,0) == -1){                

             perror("recv");                

             exit(EXIT_FAILURE);                

      }        

      printf("receive from client is %c\n",char_recv);                

      char_send = dict(char_recv);                

      if(btye = send(client_sockfd,&char_send,1,0) == -1){                

             perror("send");                

      }       

      shutdown(client_sockfd,2);                

      shutdown(server_sockfd,2);                 

      return 0;                

}                

試驗結果表明,SO_KEEPLIVE 設定,對此情形無效。

本文轉自健哥的資料花園部落格園部落格,原文連結http://www.cnblogs.com/gaojian/archive/2012/08/16/2641985.html,如需轉載請自行聯系原作者

繼續閱讀