2017-07-21 35 views
1

我寫了一個客戶端代碼來創建套接字並向客戶端發送請求,並且由於HTTP 1.1使用Connection:Alive默認情況下仍然連接關閉。如何創建持久連接該服務器監聽,直到連接每個請求是閉上的客戶端代碼:C套接字編程中的持久連接

#include <stdio.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <netdb.h> 

void error(char *msg){ 
perror(msg); 
exit(0); 
} 

int main(int argc, char *argv[]) 
{ 
int sockfd, portno, n,i; 
int Max_Requests; 
struct sockaddr_in serv_addr; 
struct hostent *server; 

char buffer[256]; 
if (argc < 3) { 
    fprintf(stderr,"usage %s hostname port\n", argv[0]); 
    exit(0); 
} 
Max_Requests=atoi(argv[3]); 
portno = atoi(argv[2]); 
sockfd = socket(AF_INET, SOCK_STREAM, 0); 

if (sockfd < 0) 
    error("ERROR opening socket"); 

server = gethostbyname(argv[1]); 
if (server == NULL) { 
    fprintf(stderr,"ERROR, no such host\n"); 
    exit(0); 
} 

bzero((char *) &serv_addr, sizeof(serv_addr)); 
serv_addr.sin_family = AF_INET; 
bcopy((char *)server->h_addr,(char *)&serv_addr.sin_addr.s_addr,server->h_length); 
serv_addr.sin_port = htons(portno); 
if (connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)) < 0) 
    error("ERROR connecting"); 

i=0; 
while(i<Max_Requests){ 
    printf("Please enter the message: "); 
    bzero(buffer,256); 
    fgets(buffer,255,stdin); 
    n = write(sockfd,buffer,strlen(buffer)); 
    if (n < 0) 
     error("ERROR writing to socket"); 

    bzero(buffer,256); 
    n = read(sockfd,buffer,255); 
    if (n < 0) 
     error("ERROR reading from socket"); 

    printf("%s\n",buffer); 
    i++; 
} 
return 0; 
} 
+0

首先,在'argv'數組中的* first *參數是什麼索引?考慮到'argv [0]'是命令名,並且第一個參數直接跟在... –

+1

1)它是'Connection:Keep-Alive'和2)服務器不需要遵守。你只是聲明你可以支持保持連接,如果它決定使用它。 – spectras

+0

你有什麼*發送*到服務器?請向我們顯示請求,*逐字*。 –

回答

1

的問題是你的fgets使用從用戶讀取輸入,形成的請求。

它的問題在於如何使用它,即將單行作爲請求發送給服務器。然後您立即轉到read調用並等待響應,但未發送完整請求及其標題。

這將導致服務器超時並關閉連接,因爲它沒有收到完整的請求。