Я создаю серверную / клиентскую эхо-программу.Клиент читает строку, отправляет на сервер, а сервер отправляет строку обратно клиенту.
Структуры данных:
typedef struct writeStruct
{
FILE *wsock;
int sockfd;
} writeStruct;
typedef struct readStruct
{
FILE *rsock;
int sockfd;
} readStruct;
Часть основной функции:
main()
{
writeStruct *writeData;
readStruct *readData;
writeData = malloc(sizeof(writeData));
readData = malloc(sizeof(readData));
pthread_t write;
pthread_t read;
FILE *rsock, *wsock;
int sockfd;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
rsock = fdopen(sockfd, "r");
wsock = fdopen(sockfd, "w");
writeData->wsock = wsock;
readData->rsock = rsock;
writeData->sockfd = sockfd;
readData->sockfd = sockfd;
pthread_create(&write, NULL, writeProcess, (void*)writeData);
pthread_create(&read, NULL, readProcess, (void*)readData);
pthread_join(write, NULL);
pthread_join(read, NULL);
}
И функции:
Функция записи:
void *writeProcess(void *writeData)
{
FILE *wsock = ((writeStruct*)writeData)->wsock;
int sockfd = ((writeStruct*)writeData)->sockfd;
int success = 0;
char *buf = malloc(sizeof(char) * MAXDATASIZE);
while(fgets(buf, MAXDATASIZE, stdin) != NULL)
{
fputs(buf, wsock);
fflush(wsock);
}
fputs(buf, wsock);
free(buf);
shutdown(sockfd, SHUT_WR);
}
Функция чтения:
void *readProcess(void *readData)
{
FILE *rsock = ((readStruct*)readData)->rsock;
int sockfd = ((readStruct*)readData)->sockfd;
char *rcv, *rcvAux;
rcv = malloc(sizeof(char) * MAXDATASIZE);
rcvAux = malloc(sizeof(char) * MAXDATASIZE);
rcvAux = fgets(rcv, MAXDATASIZE, rsock);
while(rcvAux != NULL)
{
fflush(rsock);
numCharsRcv += strlen(rcv);
numLinesRcv++;
printf("%s", rcv);
rcvAux = fgets(rcv, MAXDATASIZE, rsock);
}
printf("%s", rcv);
free(rcv);
}
Бывает, что writeProcess () работает нормально, но readProcess ()нет, очевидно, rsock получает неверный адрес памяти, и я получаю ошибку сегментации.
Извините, я пропустил некоторые части кода, это было бы очень долго.
На самом делеЯ подключаю сокет и функция записи работает, но когда он входит в функцию чтения, указатель файла теряет свою ссылку, по крайней мере, я видел это при отладке с помощью GDB.
Эта проблема имеетначал происходить сразу после того, как я добавил потоки, когда он работал на одном процессе, он работал просто отлично