我正在爲學校開發一個程序,並且在套接字方面存在一些問題。因爲我認爲這是問題,所以我粘貼了我的程序中的寫入和讀取命令。該程序應採取明文文件並使用提供的密鑰對其進行加密。使用套接字發送和接收數據c
我的問題:當我使用「client [plaintext] [key] [port]」執行程序時,程序返回「從客戶端讀取數據 - 140字節」,然後掛起。我可以點擊ctrl-c,程序爲ptext和ktext輸出正確的輸出,並將37個字節發送回客戶端(這是正確的字節數)。我覺得加密文本應該打印,但它不會。
兩個問題:
1)爲什麼程序掛起?
2)爲什麼看起來數據是從服務器寫入客戶端,但客戶端不讀取任何數據?
非常感謝您提供的任何幫助。
CLIENT
n = write(sockfd,ptext,strlen(ptext));
bzero(crypt_text, BUF_MAX);
bzero(buffer, BUF_MAX);
while((n = read(sockfd,buffer,BUF_MAX))>0){
printf("Reading data from Server -- %d bytes\n",n);
strcat(crypt_text, buffer);
bzero(buffer,BUF_MAX);
}
if (n < 0){
error("ERROR reading from socket");
}
printf("%s", crypt_text);
服務器
while((n = read(newsockfd,buffer,512))>0){
printf("Reading data from client -- %d bytes\n",n);
strcat(full_text, buffer);
bzero(buffer,BUF_MAX);
}
if (n < 0){
error("ERROR reading from socket");
}
bzero (ptext,BUF_MAX);
bzero (ktext, BUF_MAX);
strcpy(ptext, strtok(full_text,"["));
strcpy(ktext, strtok(NULL, "["));
printf("ptext length ==%s %d\n\n",ptext,strlen(ptext)); //Prints the correct plain text
printf("ktext length ==%s %d\n\n",ktext,strlen(ktext)); //prints the correct key
crypt_text = encrypt(ptext, ktext);
n = write(newsockfd,crypt_text,strlen(crypt_text));
printf("WRITE TO CILENT ==== %d",n); //This returns the correct number of bytes that should be sent back to client
if (n < 0){
error("ERROR writing to socket");
}
您是否嘗試過調試器? 「爲什麼我的程序不能正常工作?」問題在SO上不鼓勵。 –
要回答2)您的程序正在從服務器讀取數據到緩衝區,它不會直接讀取您的程序。有選項可以「刷新」緩衝區並關閉緩衝區。那麼你可能會看到你的輸出。 – amza
'read()'是阻塞I/O的一部分。 IIRC你不能像這樣使用'read()'。它會一直阻止ie.keep等待客戶端再次寫入內容 –