這是一個簡單的代碼,我寫了。服務器響應端口2923,2924和2925上的連接。MultiSocket偵聽Linux套接字編程
當我運行該程序時,服務器只支持來自端口2923的CONNECTION。有人可以幫助我。 Thanku
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/time.h>
void handle_client(int cliend_fd)
{
int ret = accept(cliend_fd, NULL, 0);
if (ret < 0)
{
printf("Accept Error\n");
}
else
{
printf("Client Accepted\n");
shutdown(ret, 2);
}
}
int main()
{
int count = 3;
int PORT = 2923;
struct sockaddr_in address;
int MasterSocket[count];
int i = 0;
fd_set readfds;
int maxfd;
maxfd = -1;
int SelectSession;
struct timespec TimeOut;
TimeOut.tv_sec = 2;
TimeOut.tv_nsec = 2;
for (i = 0; i < count; i++)
{
MasterSocket[i] = socket(AF_INET, SOCK_STREAM, 0);
}
for (i = 0; i < count; i++)
{
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr("127.0.0.1");
address.sin_port = PORT + i;
if (bind(MasterSocket[i], (struct sockaddr *) &address, sizeof(address))
< 0)
{
perror("Bind\n");
getchar();
}
printf("SockerDesriptor %d---bind %d\n", MasterSocket[i], PORT + i);
}
for (i = 0; i < count; i++)
{
if (listen(MasterSocket[i], 4) < 0)
{
perror("Listen");
getchar();
//return 1;
}
else
{
printf("Listening on Port %d---\n", PORT + i);
}
}
while (1)
{
FD_ZERO(&readfds);
int status;
for (i = 0; i < count; i++)
{
FD_SET(MasterSocket[i], &readfds);
if (MasterSocket[i] > maxfd)
{
maxfd = MasterSocket[i];
}
printf("%d Added to FD_SET Descriptor %d \n\n", PORT + i,
MasterSocket[i]);
}
//status = 0;
printf("############Waiting for Connection\n");
status = pselect(maxfd + 1, &readfds, NULL, NULL, &TimeOut, NULL);
if (status < 0)
{
perror("Status");
getchar();
return 1;
}
else if (status == 0)
{
printf("TimeOut occured\n");
}
else
{
//printf("Status %d\n", status);
SelectSession = -1;
for (i = 0; i < count; i++)
{
//printf("Checking Set %d\n", i);
if (FD_ISSET(MasterSocket[i], &readfds))
{
//printf("Matching Set %d\n", i);
SelectSession = MasterSocket[i];
printf("SelectSession %d\n", MasterSocket[i]);
if (SelectSession == -1)
{
//shutdown (MasterSocket[i], 2);
//continue;
break;
}
else
{
printf("In Handle\n");
handle_client(SelectSession);
getchar();
}
}
else
{
printf("Not in FD_ISSET\n");
}
}
}
/*for (i=0; i<count; i++)
{
shutdown (MasterSocket[i], 2);
}
*/
}
return 0;
}
集'SO_REUSEADDR' – sujin
你在程序執行過程中爲bind(),listen(),pselect()和/或accept()提供任何錯誤? – alk
@alk no我沒有 –