2017-07-21 32 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调用并等待响应,但未发送完整请求及其标题。

这将导致服务器超时并关闭连接,因为它没有收到完整的请求。