- 論壇徽章:
- 0
|
目的:
建立一個tcp server,使用select多路復(fù)用處理用戶新建連接以及以及建立的連接的數(shù)據(jù)讀操作
思路:
1.建立server socket
2.把server socket加入select的讀數(shù)組
3.客戶端建立的連接加入select的讀數(shù)組
4.處理新的連接以及以及建立的連接的數(shù)據(jù)
代碼:
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <netinet/in.h> // struct sockaddr_in
#include <sys/select.h> // select()
#define SERVER_PORT 3361
#define BUFF_SIZE 512
#define MAX_TCP_CONNECTION 10
int main()
{
int ServerFd, ClientFd[MAX_TCP_CONNECTION];
int ClientAddrLen, Bytes, MaxClientIndex=0, i;
struct sockaddr_in ServerAddr, ClientAddr;
char Buf[BUFF_SIZE];
fd_set readset;
ServerFd = socket(AF_INET, SOCK_STREAM, 0);
memset(&ServerAddr, 0, sizeof(struct sockaddr_in));
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons(SERVER_PORT);
ServerAddr.sin_addr.s_addr = htonl(INADDR_ANY);
bind (ServerFd, (struct sockaddr*)&ServerAddr, sizeof(struct sockaddr));
listen(ServerFd, 5);
while(1)
{
FD_ZERO(&readset);
FD_SET(ServerFd, &readset);
for(i=0;i<MaxClientIndex;i++)
FD_SET(ClientFd[i], &readset);
if (MaxClientIndex)
select(ClientFd[MaxClientIndex]+1, &readset, NULL, NULL, NULL);
else
select(ServerFd+1, &readset, NULL, NULL, NULL);
if (FD_ISSET(ServerFd, &readset))
{
ClientFd[MaxClientIndex] = accept(ServerFd, (struct sockaddr*)&ClientAddr, &ClientAddrLen);
printf("Ah, new connection < %d 0x%.8x:%d > established!\n", ClientFd[MaxClientIndex], ClientAddr.sin_addr.s_addr, ClientAddr.sin_port);
MaxClientIndex++;
printf("MAX Connection: %d\n", MaxClientIndex);
}
else
{
for(i=0;i<MaxClientIndex;i++)
{
if (!FD_ISSET(ClientFd[i], &readset))
continue;
Bytes = read(ClientFd[i], Buf, BUFF_SIZE-1);
if (Bytes<=0)
continue;
Buf[Bytes] = '\0';
printf("CONNECTION(%d) %s", ClientFd[i], Buf);
}
}
}
close(ServerFd);
return 0;
}
|
現(xiàn)象:
客戶端可以建立到服務(wù)器的連接,但是以及建立連接的客戶端發(fā)送的數(shù)據(jù)服務(wù)器端收不到,使用gdb調(diào)試發(fā)現(xiàn)阻塞在select調(diào)用沒有返回。
問題:
如何處理accept還要處理read操作,謝謝。 |
|