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

📄 udpclient.c.bak

📁 UDP server/client 实现
💻 BAK
字号:
#include <stdlib.h> #include <stdio.h>#include <string.h>#include <time.h>#include <fcntl.h>#include <ctype.h>#include <unistd.h>#include <netdb.h>#include <sys/types.h>#include <sys/stat.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include "process.h"struct dtgram{		unsigned short opcode;		unsigned short block;		char databuf[512];};	int main(int argc,char *argv[]){	int fdSock;	int iRetSock,iRetFile;	struct sockaddr_in myAddr,svrAddr;	struct dtgram obj;	char szFileName[BUFMAX];	char * parg[ARGMAX];	unsigned short * popcode;	int i;	FILE *pFile;	int len = sizeof(svrAddr);		fdSock=socket(AF_INET,SOCK_DGRAM,0);	myAddr.sin_family=AF_INET;	myAddr.sin_port=htons(0);	myAddr.sin_addr.s_addr=htonl(INADDR_ANY);	bind(fdSock,(struct sockaddr *)&myAddr,sizeof(myAddr));	/////////////////////	svrAddr.sin_family=AF_INET;	if (argc == 2)		svrAddr.sin_addr.s_addr=inet_addr(argv[2]);	else 		if (argc == 1)			svrAddr.sin_addr.s_addr=inet_addr("192.168.0.5");		else			{				printf("Bad optional! Bye...\n");						exit(-1);			}			while (1)	{		i = 1;		svrAddr.sin_port=htons(69);		printf("tftp:>");    fgets(szFileName, BUFMAX - 1, stdin);    if ('\n' == szFileName[0])      continue;          process(szFileName, parg);        if (strcmp(parg[0], "quit") == 0 || strcmp(parg[0], "exit") == 0)			break;					if (strcmp(parg[0], "get") == 0 && strlen(parg[1]) > 0)		{			obj.opcode = 1;			popcode = (unsigned short *)obj.databuf;			*popcode = htons(obj.opcode);			strcpy(&obj.databuf[2], parg[1]);			strcpy(&obj.databuf[2 + strlen(parg[1]) + 1], "octet");			if((pFile = fopen(parg[1],"wb")) == NULL)			{				printf("create file %s failed\n",parg[1]);				exit(-1);			}						iRetFile = strlen(parg[1]) + strlen("octet") + 4;			iRetSock=sendto(fdSock,obj.databuf,iRetFile,0,(struct sockaddr *)&svrAddr,len);						if(iRetSock != iRetFile)			{				perror("send filename failed");				close(fdSock);				fclose(pFile);				exit(-2);				}				//在这个地方最好对发出的读请求是否到达进行确认,因为不排除读请求包丢失的可能			while(2)			{				iRetSock=recvfrom(fdSock,obj.databuf,sizeof(obj.databuf),0,(struct sockaddr *)&svrAddr,&len);				if(iRetSock<1)				{					perror("Recv error");					break;				}				obj.opcode = ntohs(*(unsigned short *)obj.databuf);								obj.block = ntohs(*(unsigned short *)(&obj.databuf[2]));								if (obj.opcode == 3)				{									obj.opcode = 4;						popcode = (unsigned short *)obj.databuf;						*popcode = htons(obj.opcode);												if (sendto(fdSock,obj.databuf,4,0,(struct sockaddr *)&svrAddr,sizeof(svrAddr)) != 4)						{							perror("send ACK failed");							close(fdSock);							fclose(pFile);							exit(-2);							}						if (obj.block == i)					{						fwrite(&obj.databuf[4], iRetSock - 4, 1, pFile);												if ((iRetSock - 4) < 512)						{							fclose(pFile);							break;			//break while(2)						}						i++;					}									}				else				{					printf("So bad, The file %s is not exist!\n", parg[1]);		//用于调试					fclose(pFile);					unlink(parg[1]);					break;			//break while(2)				}			}		}		else		{			puts("Bad command!");			continue;			//continue while(1)		}	}	puts("Bye!");		close(fdSock);	return 0;}

⌨️ 快捷键说明

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