我正在实现一个简单的套接字。但是,服务器程序出现了分段故障问题,我发现在调用Accept((函数后,服务器套接字描述符被更改为错误的值。我附上了下面代码的一部分。我找不到通过Accept((函数更改套接字描述符值的原因。我的代码有什么问题?谢谢。
while(1)
{
readFdSet = allFdSet;
// Call the select() function to check the change of input stream
if(select(maxFd+1, &readFdSet, NULL, NULL, NULL) == -1)
{
printf("Fail to select the fdn");
exit(1);
}
// Check the connection request to serverSocket
if(FD_ISSET(serverSocket, &readFdSet))
{
// Accept the connection request from the client
clientAddrSize = sizeof(clientAddr);
// It prints 'serverSocket: 3'
printf("serverSocket: %dn", serverSocket);
clientSocket = accept(serverSocket, (struct sockaddr *)&clientSocket, &clientAddrSize);
// It prints 'serverSocket: 16777343'
printf("serverSocket: %dn", serverSocket);
if(clientSocket == -1)
{
printf("Fail to accept a clientn");
exit(1);
}
else
printf("Accept a client, fd = %dn", clientSocket);
// Add the fd of clientSocket into allFdSet
FD_SET(clientSocket, &allFdSet);
if(clientSocket > maxFd)
{
maxFd = clientSocket;
}
continue;
}
for(int i=0; i<=maxFd; i++)
{
clientSocket = i;
if(FD_ISSET(clientSocket, &readFdSet))
{
// Read the message from the client
memset(buff, 0, BUFF_SIZE);
while(read(clientSocket, buff, BUFF_SIZE)>0)
{
printf("%s", buff);
memset(buff, 0, BUFF_SIZE);
}
close(clientSocket);
FD_CLR(clientSocket, &allFdSet);
if(maxFd == clientSocket)
maxFd--;
printf("Close the connectionn");
}
}
}
clientSocket = accept(serverSocket, (struct sockaddr *)&clientSocket, &clientAddrSize);
问题在这里。clientSocket
是FD,而不是sockaddr
,它没有大小,即sizeof(clientAddr)
。因此,accept()
将在clientSocket
之前或之后损坏任何可能是serverSocket
或其他任何东西。
应该是:
clientSocket = accept(serverSocket, (struct sockaddr *)&clientAddr, &clientAddrSize);
@christurner首先暗示。