2017-04-11 44 views
-1

我試圖讓用C存儲將客戶端發送到服務器的結構陣列的數據TCP套接字服務器存儲值。那麼,迄今爲止,那麼好。當我打印結構的值,只有最後一個值(鍵)存儲在陣列結構的所有位置! 這是爲什麼?提前致謝!不能在結構(在C socket編程服務器)

客戶端代碼: INT主(INT的argc,字符* argv的[]){

int sock; 
struct sockaddr_in server; 


//Create socket 
sock = socket(AF_INET , SOCK_STREAM , 0); 

char *p; 
server.sin_addr.s_addr = inet_addr(argv[1]); 
int port = strtol(argv[2], &p, 10); 
server.sin_port = htons(port); 
server.sin_family = AF_INET; 
//Connect to remote server 
if (connect(sock , (struct sockaddr *)&server , sizeof(server)) < 0) 
{ 
    perror("connect failed. Error"); 
    return 1; 
} 
write(sock , argv[3] ,strlen(argv[3])+1); //send the 3rd argument(which is the input key) 
close(sock); 
return 0; 
} 

服務器代碼: 結構key_store { 字符*鍵; }店[1024];

int STORED=0; 

void handler(int socket_desc) 
{ 
    int client_sock; 
    char client_message[1024]; 

    client_sock = accept(socket_desc, (struct sockaddr *) NULL, NULL); 
    printf("Connection accepted\n"); 
    while(read(client_sock , client_message , 100) > 0) 
    { 
     store[STORED].key=client_message; 
     STORED++; 
    } 
    close(client_sock); 
} 


int main(int argc , char *argv[]) 
{ 
int socket_desc; 
struct sockaddr_in server; 

server.sin_port = htons(8888); 

//Create socket 
socket_desc = socket(AF_INET , SOCK_STREAM , 0); 
if (socket_desc == -1) 
{ 
    printf("Could not create socket"); 
} 
printf("Socket created\n"); 

//Prepare the sockaddr_in structure 
server.sin_addr.s_addr = inet_addr("127.0.0.1"); 
server.sin_family = AF_INET; 

//Bind 
if(bind(socket_desc,(struct sockaddr *)&server , sizeof(server)) < 0) 
{ 
    //print the error message 
    perror("bind failed. Error"); 
    return 1; 
} 
printf("bind done\n"); 

//Listen 
listen(socket_desc , 5); 

int count =0; 
while(count < 3) 
{ 
    handler(socket_desc); 
    count++; 
} 

close(socket_desc); 

for (int i=0;i<STORED;i++) 
{ 
    printf("KEY --> %s\n",store[i].key); //print the store keys 
} 

return 0; 
} 

輸入:

./client 127.0.0.1 8888 123456 
./client 127.0.0.1 8888 testkey 
./client 127.0.0.1 8888 2017 

輸出:

./server 
Socket created 
bind done 
Connection accepted 
Connection accepted 
Connection accepted 
KEY --> 2017 
KEY --> 2017 
KEY --> 2017 
+0

該行需要改變to:store [i] .key = strdup(key);爲什麼要存儲++? for循環中不需要break語句。 –

+0

您的問題無關,與插座或服務器,而不是非常符合結構做。 – immibis

回答

1

你存儲一個指針在store到client_message。下一條消息將覆蓋該緩衝區。你必須讓郵件的副本,你保存它

嘗試

put(strdup(client_message)); 

你有各種其他問題之前,但是這至少會打動你前進

+0

感謝您的解釋! :d –