C Socket programming -
i new c programming. tried basic socket programming. working problem created linked list store sent , received messages. when print linked list sent messages(ptr3->request) displayed , received message (ptr3->response) empty.
i think passing of arguments making mistake. but, in both case passing address only. cannot figure out mistake.
code snippet:
#include<stdio.h> #include<string.h> #include<sys/socket.h> #include<arpa/inet.h> #include<time.h> #include<errno.h> #include<stdlib.h> void create(char*,char*); void insert(char*,char*); void send_receive(char*,int); void display(); struct packet_details { char *request; char *response; struct packet_details *next; }; typedef struct packet_details details; details *head = null ,*temp = null; void create(char *send,char *receive) { details *new_node; new_node= (details*)malloc(sizeof( details)); if(null == new_node) { printf("cannot allocate requested memory %d %s %s",__line__,__file__,__function__); } else { new_node->request= send; new_node->response = receive; new_node->next = null; head = temp = new_node; } } void insert(char *send,char *receive) { details *new_node; if(null == head) { create(send,receive); return; } new_node= (details*)malloc(sizeof( details)); new_node->request = send; new_node->response = receive; new_node->next = null; temp->next = new_node; temp = new_node; } void display() { details *ptr3; ptr3 = head; while(null != ptr3) { printf("\n**********************************\n"); printf("\n**********************************\n"); printf("\n%s",ptr3->request); printf("\n%s",ptr3->response); printf("\n***********************************\n"); printf("\n***********************************\n"); ptr3=ptr3->next; } } int main() { int socket_desc,a=0; struct sockaddr_in server; char *message; //create socket socket_desc = socket(af_inet , sock_stream , 0); if (socket_desc == -1) { printf("could not create socket! %s\n",strerror(errno)); } server.sin_addr.s_addr = inet_addr("127.0.0.1"); server.sin_family = af_inet; server.sin_port = htons(7887); //connect server if (connect(socket_desc , (struct sockaddr *)&server , sizeof(server)) < 0) { printf("connect error ! %s\n",strerror(errno)); return 1; } puts("connected\n"); while(a < 5 ) { printf("\nclient:"); message = "hello server\n"; printf("%s",message); send_receive(message,socket_desc); a++; sleep(10); printf("\nclient:"); message = "how you?\n"; printf("%s",message); send_receive(message,socket_desc); a++; sleep(10); printf("\nclient:"); message = "are busy?\n"; printf("%s",message); send_receive(message,socket_desc); a++; sleep(10); printf("\nclient:"); message = "process request\n"; printf("%s",message); send_receive(message,socket_desc); a++; sleep(10); printf("\nclient:"); message = "bye\n"; printf("%s",message); send_receive(message,socket_desc); a++; } close(socket_desc); return 0; } void send_receive(char *msg,int socket_desc) { char server_reply[2000]; char *reply; if(write(socket_desc,msg,strlen(msg))<0) { printf("\n data not sent"); } read(socket_desc,server_reply,sizeof(server_reply)); printf("server:%s",server_reply); reply = &server_reply[0]; insert(msg,reply); /* passing of 2 addresses arguments */ } could me please?
every time call insert, you're passing in address of buffer allocated on stack, i.e. server_reply, , saving in list. then, when send_receive exist, memory points garbage.
instead of doing this:
new_node->request= send; new_node->response = receive; do this:
new_node->request= strdup(send); new_node->response = strdup(receive); that makes copy of sent/recieved data in newly allocated buffer. sure free() of memory when clean up.
Comments
Post a Comment