我正在TCP中構建一個基本的客戶端和服務器。它的工作除非密鑰變得很大。它只是發送來回鍵直到時間結束。當它變得更大(aka 4096)時,read()語句將隨機得到一個null值,然後將該關鍵字分解爲兩個消息,然後中斷循環。read()函數中的隨機空字符
我真的不確定它爲什麼這樣做,服務器代碼正在工作,因爲它已經與其他客戶端進行了測試,所以我的客戶端出了問題。任何想法(這是很短):
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#define BUFFER_LENGTH 5120
// Error message taken from reference
void error(const char *msg)
{
printf("%s\n", msg);
exit(0);
}
int main(int argc, char *argv[])
{
int sockfd, portNumber, n;
struct sockaddr_in serv_addr;
struct hostent *server;
// Invalid arguments
if (argc < 4)
exit(0);
else if (atoi(argv[3]) < 1 || atoi(argv[3]) > 4096)
exit(0);
char buffer[BUFFER_LENGTH];
bzero(buffer, BUFFER_LENGTH);
char buffer2[BUFFER_LENGTH];
bzero(buffer2, BUFFER_LENGTH);
strcpy(buffer2, "Connect. Key length: ");
strcpy(buffer, strcat(buffer2, argv[3]));
portNumber = atoi(argv[2]); // Get port number in int format
sockfd = socket(AF_INET, SOCK_STREAM, 0); // Create socket connection to server using internet constants
// Did we open the socket succesfully?
if (sockfd < 0)
error("Error opening socket.");
// Is the IP Address valid?
server = gethostbyname(argv[1]);
if (server == NULL)
error("Could not connect to server. Terminating.");
// Initialize to zero and then set
// Taken from reference
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(portNumber);
if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0)
error("Could not connect to server. Terminating.");
short connected = 1;
do
{
// Send initial request on first pass
// Afterwards send the resposne we were given
printf("Sending: %s\n", buffer);
printf("Length of msg: %d\n", (strlen(buffer) + 1));
n = write(sockfd, buffer, strlen(buffer) + 1);
if (n < 1)
error("Failed to send Message. Terminating.");
// Get session key response
bzero(buffer, BUFFER_LENGTH);
n = read(sockfd, buffer, BUFFER_LENGTH);
if (n < 1)
error("Could not fetch result. Terminating.");
// Stop
if (strcmp(buffer, "Invalid session key. Terminating.") == 0)
break;
printf("%s\n", buffer);
sleep(1);
} while (connected == 1);
// Done (this should never be reached in this client)
error("Could not fetch result. Terminating.");
close(sockfd);
return 0;
}
我應該能夠告訴服務器正在發送什麼?預計它是一個有效的字符串? (中間沒有空值) – altendky
服務器預計將與「會話密鑰:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX」響應(其中X是隨機的字符,其中多達4096) – MasterGberry
和'讀取結果()'告訴你有多少個字符讀。 @altendky:'NULL'是一個空*指針*常量;使用它來引用空字符/字節是不正確的。 –