Linux網路程式設計 select實現多點連線的回射

2021-08-04 18:50:41 字數 2511 閱讀 6565

server.c

#include #include #include #include #include #include #include #include #define max_login 20     //設定客戶端連線的最大數量

#define buflen 1024 //設定快取的大小

#define port 5000 //設定電腦埠

ssize_t readn(int fd,void *buf,size_t count);

ssize_t writen(int fd,void *buf,size_t count);

void ehandle(char *mesg);

int main()

fd_zero(&rfds);

fd_zero(&readfds);

fd_set(listenfd,&readfds);

maxfd = listenfd;

while(1)

while(nready < 0 && eintr == errno); //避免因為其他中斷引起select異常

if(-1 == nready)

ehandle("select");

if(fd_isset(listenfd,&rfds)) //處理監聽到的客戶端套接字

}if(--nready <=0) //nready 減一,優化程式

continue;

} for(i = 0;i 0)

if(fd_isset(clifd[i],&rfds)) //因為用了兩個集合,rfds和readfds,而這裡一定要用rfds,錯了就會只能與第乙個鏈結成功的客戶端通訊。

else //正常處理

if(--nready <= 0) //nready 減一,如果不為零,則繼續處理其他的,同時被啟用的客戶端

break;

}} }

close(listenfd);

return 0;

}void ehandle(char *mesg) //錯誤處理

ssize_t readn(int fd,void *buf,size_t count) // 讀取固定位元組數函式,避免粘包問題,這種處理方式效率不高

else if(0 == nread)

break;

nleft -= nread;

pbuf += nread;

} return (count - nleft);

}ssize_t writen(int fd,void *buf,size_t count) //寫入固定位元組數函式,避免粘包問題,這種處理方式效率不高

else if(0 == nwrite)

continue;

nleft -= nwrite;

pbuf += nwrite;

} return (count - nleft);

}

client.c

#include #include #include #include #include #include #include #include #define port 5000

#define ip "127.0.0.1"

#define buflen 1024

void ehandle(char *mesg)

ssize_t readn(int fd,void* buf,size_t count)

else if (0 == nread)

break;

nleft -= nread;

pbuf += nread;

} return (count -nleft);

}ssize_t writen(int fd,void *buf,size_t count)

else if(0 == nwrite)

continue;

nleft -= nwrite;

pbuf += nwrite;

} return (count - nleft);

}int main()

if(fd_isset(myfd,&readfds))

printf("receive :%s",strbuf);

}} }

/* while(1)

printf("receive :%s\n",strbuf);

}*/

close(myfd);

return 0;

}

ps:1 在debian 7上進行過簡單測試,成功。

2 如果客戶端或者伺服器端用readn 和writen函式,則伺服器端或客戶端也必須用這個兩個函式,否則不能正常回射。

linux 網路程式設計 select

include include include include include include include include include include include include typedef struct st fd def 將fd接收套接字描述符放入到fd陣列中 int add f...

Linux網路程式設計之select

使用select多路復用技術的非阻塞模型 select多路復用通常具有很好的跨平台性,也能提供不錯的併發效能,但是在通常情況下有最大監聽檔案描述符的限制 通常1024 如果不需要達到c10k這種前端高效能伺服器的要求,採用select nonblocking的方式能降低程式設計的難度 用到的介面 f...

Linux網路程式設計 select函式詳解

作用 select函式是用來監視乙個或多個檔案控制代碼的狀態變化的,可阻塞也可不阻塞。函式原型 int select int nfds,fd set readfds,fd set writefds,fd set exceptfds,struct timeval timeout 函式引數意義 fd m...