C:memcpy segfault与void*指针
代码--主循环:C:memcpy segfault与void*指针,c,segmentation-fault,malloc,memcpy,C,Segmentation Fault,Malloc,Memcpy,代码--主循环: int handleClient (struct clientData* clientData) { void* Buffer = malloc (INET_BUFFER_SIZE); <-- VOID* BUFFER FOR RECV() int listenSocket = clientData->listenSocket; struct sockaddr_in clientAddress = clientData->clientA
int handleClient (struct clientData* clientData)
{
void* Buffer = malloc (INET_BUFFER_SIZE); <-- VOID* BUFFER FOR RECV()
int listenSocket = clientData->listenSocket;
struct sockaddr_in clientAddress = clientData->clientAddress;
printf("Received connection from client %s:%d.\n", inet_ntoa(clientAddress.sin_addr), ntohs(clientAddress.sin_port));
while (1)
{
int packetSize;
if ((packetSize = recv(listenSocket, &Buffer, INET_BUFFER_SIZE, 0)) > 0)
{
if (packetSize == ECHO_SIZE)
{
handleEchoPacket(Buffer);
continue;
}
if (packetSize == MESSAGE_SIZE) <---THIS IS TRIGGERED BECAUSE OF PACKET SIZE
{
handleMessagePacket(Buffer);
continue;
}
}
}
int-handleClient(struct-clientData*clientData)
{
void*Buffer=malloc(INET\u Buffer\u SIZE);listenSocket;
clientAddress=clientData->clientAddress中的struct sockaddr_;
printf(“从客户端%s接收到连接:%d。\n”、inet\u ntoa(clientAddress.sin\u addr)、ntohs(clientAddress.sin\u port));
而(1)
{
国际包装尺寸;
如果((packetSize=recv(listenSocket和Buffer,INET\u Buffer\u SIZE,0))>0)
{
if(packetSize==回音大小)
{
手袋(缓冲器);
继续;
}
if(packetSize==消息大小)发生的情况如下:当您将缓冲区的地址传递给recv
时,接收到的数据被放置在分配给堆栈上的缓冲区地址的空间中。当您随后调用handleMessagePacket
时,传递的地址不再有效:它已被recv写入代码>
从调用recv
中删除与应可解决此问题:
if ((packetSize = recv(listenSocket, Buffer, INET_BUFFER_SIZE, 0)) > 0)
// ^^ No ampersand
一般来说,这样的情况最好使用内存探查器(如valgrind)进行诊断。该工具会立即告诉您,缓冲区写入的堆栈区域无效,并且随后将接收到的数据作为指针取消引用(现在导致SIGSEGV的问题)无效读取。您需要使用recv(listenSocket,Buffer,INET\u Buffer\u SIZE,0);
--在缓冲区之前没有&
。我10秒前就意识到了这一点。这让我忙了一段时间。小步。谢谢您的回复!
Program received signal SIGSEGV, Segmentation fault.
__memcpy_sse2_unaligned () (.....) <--Tells me it doesn't have source files, not relevant to the problem.
if ((packetSize = recv(listenSocket, Buffer, INET_BUFFER_SIZE, 0)) > 0)
// ^^ No ampersand