我是新來的套接字編程,我試圖使用gcc編譯器在Linux中的服務器 - 客戶端連接。服務器和客戶端,這兩個代碼都在不同的C文件中。我通過用戶輸入向服務器發送字符,服務器遞增字符並將其返回給客戶端。客戶端應該保持連接狀態,直到我從字符'Q'用戶。我在維護連接時遇到問題。在這裏,我正在粘貼客戶端代碼。當我不使用while循環並只發送一個字符時,它可以正常工作,但是如果我一再想要通過同一連接發送字符,並且連接只會在用戶輸入Q時關閉。那麼,在循環的第一次迭代它要求字符,併成功地從服務器獲取增加的字符,但第二次它說「傳輸端點已連接」。請幫助我理解這一點。瞭解客戶端 - 服務器連接
int main(int argc, char *argv[])
{
int sockfd;
int len, port;
struct sockaddr_in address;
int result;
char ch;
port = atoi(argv[1]);
sockfd = socket(AF_INET, SOCK_STREAM, 0);
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr("127.0.0.1");
address.sin_port = port;
len = sizeof(address);
while (1){
printf("Enter Character To Send The Server OR Q/q To End The Connection:");
scanf("%c", &ch);
fflush(stdin);
if (connect(sockfd, (struct sockaddr *)&address, len) == -1) {
perror("oops: client failed to connect");
return 1;
}
if (ch == 'Q' || ch == 'q'){
printf("Connection Closed");
break;
}
write(sockfd, &ch, 1);
read(sockfd, &ch, 1);
printf("Incremented character from server = %c\n", ch);
} close(sockfd);
return 0;
}
的消息說,這一切:你想'connect'一個已經連接的套接字(在你的第二個和後面的迭代)。在TCP中,一旦建立連接,它將保持打開狀態,直到您手動關閉連接。只需將'connect'呼叫移出'while'循環。 – szczurcio
@szczurcio是的我試圖通過在循環之前的連接,在這種情況下,這裏是輸出。異常終止。 輸入字符發送服務器或Q/q要結束連接:從服務器A 遞增計數字符= B 輸入字符發送服務器或Q/Q結束的 連接:從服務器遞增計數字符= 輸入字符發送服務器或Q/q結束連接:K 「程序終止 –