c语言服务器收发文件,C语言写的一个分布式文件传输服务器

这是一个用C语言编写的分布式文件分享系统服务器程序。它监听指定端口,接受客户端连接,处理不同类型的命令,如创建、显示和退出。服务器可以接收来自多个客户端的连接,并通过`select`和`socket`系统调用来管理并发连接。当接收到特定命令时,服务器会向所有客户端广播消息。
摘要由CSDN通过智能技术生成

从开源中国里拿来的,学习学习吧,看着还好吧!

Distributed File Sharing System.zip:

else if(argv[1][0] == 's')

{

int opt = TRUE,master_socket , addrlen , new_socket , client_socket[30], activity, i , valread , sd,j,k =9,l = 0,m,max_sd,eff,kk,fee,effd,PORT;

struct sockaddr_in address;

char buffer[1025],buf[25],prtn[30],ptnumb[30], sln[4],slchar[4],msgdis[100];

fd_set readfds,connfs;

for (i = 0; i < max_clients; i++)

{

client_socket[i] = 0;

}

if( (master_socket = socket(AF_INET , SOCK_STREAM , 0)) == 0)

{

perror("socket failed");

exit(EXIT_FAILURE);

}

if( setsockopt(master_socket, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(opt)) < 0 )

{

perror("setsockopt");

exit(EXIT_FAILURE);

}

PORT = atoi(argv[2]);

address.sin_family = AF_INET;

address.sin_addr.s_addr = INADDR_ANY;

address.sin_port = htons( PORT );

strcpy(masteraddr,"128.205.36.8");

serverip[0].setvalues(ntohs(address.sin_port),masteraddr,0);//correct here

szls = 1;

if (bind(master_socket, (struct sockaddr *)&address, sizeof(address))<0)

{

perror("bind failed");

exit(EXIT_FAILURE);

}

printf("Listener on port %d \n", PORT);

if (listen(master_socket, 3) < 0)

{

perror("listen");

exit(EXIT_FAILURE);

}

addrlen = sizeof(address);

puts("Waiting for connections ...");

printf("Please enter your option :\nPlease note that you can enter only HELP, CREATOR, DISPLAY AND QUIT for the server\n");

HELP();

while(TRUE)

{

FD_ZERO(&readfds);

FD_SET(master_socket, &readfds);

FD_SET(STDIN, &readfds);

max_sd = master_socket;

if(STDIN > max_sd)

{ max_sd = STDIN;

}

for ( i = 0 ; i < max_clients ; i++)

{

sd = client_socket[i];

if(sd > 0)

FD_SET( sd , &readfds);

if(sd > max_sd)

max_sd = sd;

}

activity = select( max_sd + 1 , &readfds , NULL , NULL , NULL);

if ((activity < 0) && (errno!=EINTR))

{

printf("select error");

}

if(FD_ISSET(STDIN, &readfds))

{

fgets(buf,40,stdin);

buf[strlen(buf)-1]='\0';

if(strcmp(buf, "HELP") == 0)

{

HELP();

}

else if(strcmp(buf, "CREATOR") == 0)

{

CREATOR();

}

else if(strcmp(buf, "DISPLAY") == 0)

{

DISPLAY(PORT);

}

else if(strcmp(buf, "QUIT") == 0)

{

int nkk;

printf("Quitting Server\n");

setbuffer();

for (nkk = 0; nkk < max_clients; nkk++)

{

if(client_socket[nkk] > 0)

{

if( send(client_socket[nkk], message, strlen(message), 0) != strlen(message) )

{

perror("send");

}

}

}

close(master_socket);

for (nkk = 0; nkk < max_clients; nkk++)

{

sd = client_socket[nkk];

close(sd);

}

exit(0);

}

else

{

printf("Enter a valid option from the list of commands, type HELP to get the List of commands\n");

}

printf("Please enter your option :\n");

}

if (FD_ISSET(master_socket, &readfds)) {

if ((new_socket = accept(master_socket, (struct sockaddr *)&address, (socklen_t*)&addrlen))<0)

{

perror("accept");

exit(EXIT_FAILURE);

}

int n1,n2;char bur[50];

bzero(bur,256);

n1 = read(new_socket,bur,255);

if (n1 < 0) printf("ERROR reading from socket");

printf("New connection,ip is : %s\n",inet_ntoa(address.sin_addr));

n2 = atoi(bur);

for (i = 0; i < max_clients; i++)

{

if( client_socket[i] == 0 )

{

client_socket[i] = new_socket;

serverip[i+1].setvalues(n2,inet_ntoa(address.sin_addr),i+1);

printf("----------------------\n");

for(eff = 0; eff <= i+1; eff++)

{

serverip[eff].listm();

}

if(szls < eff)

{

szls = eff;

}

break;

}

}

setbuffer();

for (kk = 0; kk < max_clients; kk++)

{

if(client_socket[kk] > 0)

{

if( send(client_socket[kk], message, strlen(message), 0) != strlen(message) )

{

perror("send");

}

}

}

}

for (i = 0; i < max_clients; i++)

{

sd = client_socket[i];

if (FD_ISSET( sd , &readfds))

{

valread = read( sd , buffer, 1024);

if (valread == 0)

{

getpeername(sd , (struct sockaddr*)&address , (socklen_t*)&addrlen);

for(fee = 0; fee <= szls; fee++)

{

if(strcmp(inet_ntoa(address.sin_addr), serverip[fee].ipa) == 0)

{

strcpy(serverip[fee].ipa,"-2");

}

}

close( sd );

client_socket[i] = 0;

setbuffer();

for (kk = 0; kk < max_clients; kk++)

{

if(client_socket[kk] > 0)

{

if( send(client_socket[kk], message, strlen(message), 0) != strlen(message) )

{

perror("send");

}

}

}

}

else if(strncmp(buffer, "TERMINATE", 9) == 0)

{

for(effd = 0; effd < szls; effd++)

{

sprintf(slchar,"%d",serverip[effd].slno);

if(buffer[10] == slchar[0])

{

strcpy(serverip[effd].ipa,"-2");

sd = client_socket[effd-1];

strcpy(msgdis,"Client has been remotely disconnected\n");

if(send(client_socket[effd-1], msgdis, strlen(msgdis), 0) != strlen(msgdis) )

{

perror("send");

}

close(sd);

client_socket[effd-1] = 0;

break;

}

}

setbuffer();

for (kk = 0; kk < max_clients; kk++)

{

if(client_socket[kk] > 0)

{

if( send(client_socket[kk], message, strlen(message), 0) != strlen(message) )

{

perror("send");

}

}

}

}

else if(strncmp(buffer, "QUIT", 4) == 0)

{

close( sd );

client_socket[i] = 0;

strcpy(serverip[i+1].ipa,"-2");

setbuffer();

for (kk = 0; kk < max_clients; kk++)

{

if(client_socket[kk] > 0)

{

if( send(client_socket[kk], message, strlen(message), 0) != strlen(message) )

{

perror("send");

}

}

}

}

else

{

}

}

}

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值