⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 server.c

📁 linux 下简单的网络通信例子(包括客户端和服务端源文件)。
💻 C
字号:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
#include <stdarg.h>
#define fileSize 2048
int count;

int readfile(const char *fileName,char *fileBuf)
{
	FILE *pFile;
	pFile=fopen(fileName,"r");
	if(pFile==NULL)
	{
		printf("No such file! \n");
		return 0;
	}
	else
	{
		char ch=fgetc(pFile);
		count=0;
		while(ch!=EOF)
		{
			fileBuf[count++]=ch;
			ch=fgetc(pFile);
			if(count==fileSize)
			{
				printf("erorr!Size of file is too large\n");
				break;
			}
		}
		fileBuf[count]='\0';
	}
	fclose(pFile);
	return 1;
}

int selectprotocol()
{
	int p;
	while(1)
	{
		printf("selcet protocol\n");
		printf("put in 0(tcp) or 1(udp)\n");
		scanf("%d",&p);
		if(p==0)
			return 0;
		else if(p==1)
			return 1;
		else 
		{
			printf("error! select protocol again!\n");
			continue;
		}
	}
}

void tcpconnection()
{
	int fd;
		int address_len;
		struct sockaddr_in address;
		int recvno;
		
		fd = socket(AF_INET, SOCK_STREAM, 0);
		
		address.sin_family = AF_INET;
		address.sin_addr.s_addr = htonl(INADDR_ANY);
		address.sin_port = htons(1234);
		address_len = sizeof(address);
		bind(fd, (struct sockaddr *)&address, address_len);
		
		listen(fd, 5);
		while(1) {
			struct sockaddr_in client_address;
			int len;
			int client_sockfd;
			char *data = "Server to Client String!\n";
			char filename[200];
			char file[fileSize];
			printf("waiting...\n");
			fflush(stdout);
		
			len = sizeof(client_address);
			client_sockfd = accept(fd,(struct sockaddr *)&client_address, &len);
		
			recvno=read(client_sockfd,filename,200);
			filename[recvno]='\0';
			printf("Requested file:%s\n",filename);
			recvno=readfile(filename,file);
			if(recvno==0)
			{
				send(client_sockfd,"No such file,message come frome server!\n",fileSize,0);
				printf("no such file!\n");
				close(client_sockfd);
			}
			else
			{
				send(client_sockfd,file,count,0);
				printf("Send file successful \n");
				close(client_sockfd);
			}
		}
}

void udpconnection()
{
	int fd;
		int address_len;
		struct sockaddr_in address;

		fd = socket(AF_INET, SOCK_DGRAM, 0);	
		
		bzero(&address, sizeof(address));
		address.sin_family = AF_INET;
		address.sin_addr.s_addr = htonl(INADDR_ANY);
		address.sin_port = htons(1234);
		address_len = sizeof(address);
		bind(fd, (struct sockaddr *)&address, address_len);

		while(1) {
			struct sockaddr_in client_address;
			socklen_t len = sizeof(client_address);
			int n;
			char filename[200];
            char file[fileSize];
			printf("waiting...\n");
			fflush(stdout);

			n = recvfrom(fd, filename, 200, 0,(struct sockaddr *)&client_address, &len);
			printf("Requested file: %s\n",filename);
			filename[n]='\0';	
			n=readfile(filename,file);
			if(n==0)
			{
				sendto(fd,"no such file(message from server)",200,0,(struct sockaddr *)&client_address,len);
			}
			
			else
			{
				sendto(fd, file, count, 0,(struct sockaddr *)&client_address, len);
				printf("send file successful!\n");
			}
		}
}

int main()
{
	int protocol=selectprotocol();
   	if(protocol==0)
		tcpconnection();
	else if(protocol==1)
		udpconnection();
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -