我是 C 语言编程的新手。我尝试了基本的套接字编程。它运行良好,但我的问题是我创建了一个链表来存储发送和接收的消息。当我打印链表时,只显示发送的消息(ptr3->请求),而我收到的消息(ptr3->响应)是空的。
我认为参数的传递是我犯错误的地方。但是,在这两种情况下,我都只传递地址。我真的无法弄清楚错误。
代码片段:
#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 to 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 are you?\n";
printf("%s",message);
send_receive(message,socket_desc);
a++;
sleep(10);
printf("\nCLIENT:");
message = "Are you busy?\n";
printf("%s",message);
send_receive(message,socket_desc);
a++;
sleep(10);
printf("\nCLIENT:");
message = "Process my 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 could not be sent");
}
read(socket_desc,server_reply,sizeof(server_reply));
printf("server:%s",server_reply);
reply = &server_reply[0];
insert(msg,reply); /* passing of two addresses as arguments */
}
有人能帮帮我吗?
最佳答案
每次调用 insert
时,都会传入在堆栈上分配的缓冲区地址,即 server_reply
,并将其保存在列表中。然后,当 send_receive
存在时,该内存指向垃圾。
而不是这样做:
new_node->request= send;
new_node->response = receive;
这样做:
new_node->request= strdup(send);
new_node->response = strdup(receive);
这会在新分配的缓冲区中复制发送/接收的数据。清理时请确保 free()
所有内存。
关于C套接字编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31274676/