我正在創建服務器/客戶端回顯程序。客戶端讀取一個字符串,發送到服務器,服務器將字符串發送回客戶端。pthreads問題的套接字
數據結構:
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進行調試時看到了這一點。
這個問題已經開始出現就在我已經添加了線程,當它在它的工作就好了一個進程中運行
首先,在打開的文件中調用'fflush'是未定義的行爲......即使它沒有可怕的崩潰,它也不會做你想要的。誰教你使用'fflush'這樣的? –
@R:好點!不過,我相信它會設置「errno」(EBADF?)。不確定它是否真的未定義。無論如何,我認爲這是一個真正的答案。 – jweyrich
7.19.5.2:「如果流指向輸出流或未輸入最近操作的更新流,則fflush函數會將該流的所有未寫入數據傳遞到主機環境以寫入文件;否則,行爲是不確定的。「 –