服务器端给出了分段错误:核心转储

时间:2013-12-01 00:04:06

标签: c sockets

我正在尝试多线程程序...它的编译file.bind和accept函数也可以工作。但在打印“printf(”with thread%lu \ n“,(unsigned long int)threadID);”错误来自分裂错误。 从客户端我给文件名下载如果服务器端保持该文件打开该文件并发送到客户端我在HandleTCPClien函数中完成此操作。

代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
//#include "Practical.h"

void DieWithError(char *errorMessage)
{
  perror(errorMessage);
  exit(1);
}
void DieWithUserMessage(const char *msg, const char *detail)
{
  fputs(msg, stderr);
  fputs(": ", stderr);
  fputs(detail, stderr);
  fputc('\n', stderr);
  exit(1);
}

void DieWithSystemMessage(const char *msg)
{
  perror(msg);
  exit(1);
}

void *ThreadMain(void *threadArgs); //main program of Thread
// structure of arguments to pass to client thread
struct ThreadArgs
{
  int clntSock;    // Socket descriptor from client
};

int main(int argc, char *argv[])
{

  if (argc != 2) // Test for correct number of arguments
    DieWithUserMessage("Parameter(s)", "<Server Port>");

  in_port_t servPort = atoi(argv[1]); // First arg:  local port

  int servSock; // Socket descriptor for server
  // Create socket for incoming connections
  servSock = SetupTCPServerSocket(argv[1]); // Socket descriptor for server
  if (servSock < 0)
    DieWithUserMessage("SetupTCPServerSocket() failed", "unable to establish");

  for (;;)
  { // Run forever

    int clntSock = AcceptTCPConnection(servSock); // new connection creates a client socket

    // create separate memory for client argument
    struct ThreadArgs *threadArgs = (struct ThreadArgs *) malloc(
        sizeof(struct ThreadArgs));
    if (threadArgs == NULL )
      DieWithSystemMessage("malloc() failed");
    threadArgs->clntSock = clntSock;
    // create client thread 
    pthread_t threadID;
    int returnValue = pthread_create(&threadID, NULL, ThreadMain, threadArgs);
    if (returnValue != 0)
      DieWithUserMessage("pthread_create() failed", strerror(returnValue));
    printf("with thread %lu\n", (unsigned long int) threadID);

  }
  // NOT REACHED
}
void *ThreadMain(void *threadArgs)
{
  // guranntees that thread resources are dellocated upon return

  pthread_detach(pthread_self());
  //extract socket file descriptor from argument
  int clntSock = ((struct ThreadArgs *) threadArgs)->clntSock;
  HandleTCPClient(clntSock);
}
void HandleTCPClient(int clntSocket)
{
  FILE *fp;
  char echoBuffer[200]; /* Buffer for echo string */
  //char Buffer[2048];        /* Buffer for echo string */
  echoBuffer[200] = '\0';
  memset(echoBuffer, 0, sizeof(echoBuffer));
  ssize_t recvMsgSize; /* Size of received message */
  ssize_t numBytesSent;
  /* Receive message from client */
  if ((recvMsgSize = recv(clntSocket, echoBuffer, sizeof(echoBuffer), 0)) < 0)
    DieWithError("recv() failed");

  printf("Server asked file name from Client side:: %s\n", echoBuffer);
  fp = fopen(echoBuffer, "r"); //open the file
  if (fp)
  {

    while (fgets(echoBuffer, sizeof(echoBuffer), fp))
    {
      //usleep(200*1000);
      printf("%s\n", echoBuffer);
      numBytesSent = send(clntSocket, echoBuffer, strlen(echoBuffer), 0);
    }

    if (numBytesSent < 0)
      DieWithSystemMessage("send() failed");
    else if (numBytesSent != strlen(echoBuffer))
      DieWithUserMessage("send()", "sent unexpected number of bytes");

  }
  if (!fp)
  {
    printf("\nit failed!\n");
    //return 1;
  }

  recvMsgSize = 0; //exit connection of this client
  fclose(fp);
  close(clntSocket); /* Close client socket */
}

0 个答案:

没有答案