我寫了簡單的TCP/IP多線程ANSI C服務器(客戶端是C sharp),一切正常,除非服務器沒有從客戶端接收到合適的信號時它不會結束線程並且關閉它的套接字(例如,當客戶端崩潰時)。如果這些線程累積起來,最終可能會出現問題。
我有存儲在鏈接列表中的線程 - 遍歷它們不是問題。然而,默認情況下,它們都被recv()阻塞,並且因爲死的客戶端不會發送任何它們卡在內存中的東西。ANSI C TCP/IP服務器在線客戶端列表
維護在線客戶列表的正確方法是什麼? (或者如何檢測連接斷開的線程)。
struct tListItem {
pthread_t thisThread;
char* name;
int c_sockfd;
int run;
tListItem* next;
tListItem* prev;};
struct tList{
tListItem* head;
int count;};
碼螺紋:
while(param->run)
{
bzero(&buf, sizeof(buf));
if ((readLen = recv(param->c_sockfd, buf, BUFFSIZE, 0)) == -1)
{
perror("Read error");
param->run = 0;
}
else if (readLen > 0) {
printf("%s: %s \n", param->name, buf);
parseIncoming(param->c_sockfd, param, buf);}}
,這裏是我的嘗試檢測連接中斷,但是這將導致服務器終止與無消息:
void* maintenance() {
tListItem *item;
char buf[4] = "PNG";
while(1)
{
usleep(2000000);
item= threadList->head;
while(item != 0)
{
if ((send(item->c_sockfd, buf, 3, NULL)) == -1)
{
perror("Write error");
item->run = 0;
}
item = item->next;
}
}
}
我建議發佈一些實際的代碼。我想,這將有助於更好的反應。 –