簡體   English   中英

C套接字編程中的持久連接

[英]Persistent Connection in C socket programming

我已經編寫了一個客戶端代碼來創建套接字並向客戶端發送請求,並且由於HTTP 1.1默認使用Connection:Alive仍會關閉連接。我該如何創建持久連接,以便服務器偵聽每個請求直到連接已關閉。客戶端代碼為:

#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;
}

問題是您使用fgets從用戶讀取輸入以形成請求。

它的問題是如何使用它,即讀取作為請求發送到服務器的一行 然后,您立即轉到read調用並等待響應,而無需發送完整的請求及其標頭。

由於尚未收到完整的請求,因此這將導致服務器超時並關閉連接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM