借助于網上他人文章,研究 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,如需轉載請自行聯系原作者