linuxシステムプログラミング-OCKET通信基礎プログラミング-UDPプログラミング実現ファイルダウンロード


UDPプログラミングインプリメンテーションファイルダウンロードベーステンプレートは、以下の参照を参照してください.
linuxシステムプログラミング-OCKET通信基礎プログラミング(0)-UDPプログラミング
linuxシステムプログラミング-OCKET通信基礎プログラミング(1)-UDPプログラミングサービス端プログラム
linuxシステムプログラミング-OCKET通信基礎プログラミング(2)-UDPプログラミングクライアントプログラム
 
プログラムの原理:ファイルの読み書き操作を増加しました
サービスエンドプログラム

#include 
#include           /* See NOTES */
#include 
#include 
#include 
#include 
#include 
#include 

#define SERVER_PORT 8888
#define BUFLEN 256

int setup_socket()
{
	//1,  socket
	int sock_server = socket(AF_INET, SOCK_DGRAM, 0);
	if(sock_server < 0)
	{
		perror("socket");
		return -1;
	}
	
	//2,      
	struct sockaddr_in server_addr;
	bzero(&server_addr, sizeof(server_addr));
	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons(SERVER_PORT);
	server_addr.sin_addr.s_addr = INADDR_ANY;
	
	//        
	int on = 1;
	if(setsockopt(sock_server, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) == -1){
		perror("setsockopt");
		return -1;
	}
	
	//3,bind
	if(bind(sock_server, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
	{
		return -1;
	}
	
	return sock_server;	
}

int main(int argc, char *argv[])
{
	char buf[BUFLEN] = {0};
	int ret = 0, server_sock;
	struct sockaddr_in client_addr;
	bzero(&client_addr, sizeof(client_addr));
	socklen_t len = sizeof(client_addr);

	FILE *srcFile  = NULL;  //    
	int  numByte  = 0;      //           
	int  IsEnd = 1;         //      
	int IsCloseServer = 1;  //         
	
	
	server_sock = setup_socket();
	if(server_sock < 0)
	{
		return -1;
	}
	
	while(1)
	{	
		//4,    
		ret = recvfrom(server_sock, buf, BUFLEN-1, 0, (struct sockaddr*)&client_addr, &len);
		if( ret < 0 )
		{
			perror("recvfrom");
			continue;
		}
	
		printf("client ip:%s, port: %d
", (char *)inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); printf("recvfrom : %s
", buf); // , , srcFile = fopen(buf, "r"); if (NULL == srcFile) // { perror(buf); return -1; } //bzero(buf, sizeof(buf)); memset(buf,0,BUFLEN); // , while(IsEnd) { // numByte = fread(buf, 1, BUFLEN, srcFile); //5, //strcpy(buf, "Hello World
"); //sleep(1); ret = sendto(server_sock, buf, numByte, 0, (const struct sockaddr * )&client_addr, len); //bzero(buf, sizeof(buf)); if( ret == 0 ) { memset(buf,0,BUFLEN); break; } memset(buf,0,BUFLEN); // numByte = fread(buf, 1, BUFLEN, srcFile); if(feof(srcFile) && numByte == 0) { // // IsEnd=0; memset(buf,0,BUFLEN); printf("feof(srcFile) && numByte == 0
"); ret = sendto(server_sock, buf, numByte, 0, (const struct sockaddr * )&client_addr, len); break; } } // fclose(srcFile); //5, // bzero(buf, sizeof(buf)); // strcpy(buf, "Hello World
"); // sleep(1); // ret = sendto(server_sock, buf, strlen(buf), 0, (const struct sockaddr * )&client_addr, len); // if( ret < 0 ) // { // perror("sendto"); // } } return ret; }

クライアントプログラム
#include 
#include           /* See NOTES */
#include 
#include 
#include 
#include 
#include 
#include 

#define SERVER_PORT 8888
#define CLIENT_PORT 6789
#define BUFLEN 256

int main(int argc, char *argv[])
{
	int ret = 0;
	char buf[BUFLEN] = {0};
	struct sockaddr_in server_addr;
	socklen_t socklen = sizeof(server_addr);
	bzero(&server_addr, sizeof(server_addr));
	
	FILE *newFile  = NULL;  //     
	int  numByte  = 0;      //           
	
	//1,  socket
	int cli_sock = socket(AF_INET, SOCK_DGRAM, 0);
	if(cli_sock < 0)
	{
		perror("socket");
		return -1;
	}
	
	//  ,
	struct sockaddr_in cli_addr;
	bzero(&cli_addr, sizeof(cli_addr));
	cli_addr.sin_family = AF_INET;
	cli_addr.sin_port = htons(CLIENT_PORT);
	cli_addr.sin_addr.s_addr = INADDR_ANY;
	
	if(bind(cli_sock, (struct sockaddr *)&cli_addr, sizeof(cli_addr)) < 0)
	{
		perror("bind");
		goto sock_err;
	}
	
	//2,         
	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons(SERVER_PORT);
	server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
	
	//3,  
	//strcpy(buf, "I am a client");
	if(argc == 3)
	{
		strcpy(buf,argv[1]);  //         
		ret = sendto(cli_sock, buf, strlen(buf), 0, (struct sockaddr *)&server_addr, socklen);
		if( ret < 0)
		{
			perror("sendto");
			goto sock_err;
		}
	}else
	{
		printf("               
"); return 0; } //4, bzero(buf, sizeof(buf)); ret = recvfrom(cli_sock, buf, BUFLEN, 0, (struct sockaddr *)&server_addr, &socklen); if( ret < 0 ) { perror("recvfrom"); goto sock_err; }else if(ret == 0) { printf("ret == 0
"); return 0; // // } printf("===srecvfrom:%s
", buf); newFile = fopen(argv[2],"w"); if (NULL == newFile) { perror("2.txt"); return -1; } //bzero(buf, BUFLEN); while(1) { // buf //write(fd, buf,....) // printf("ret = %d
", ret); fwrite(buf,ret,1, newFile); memset(buf,0,BUFLEN); ret = recvfrom(cli_sock, buf, BUFLEN, 0, (struct sockaddr *)&server_addr, &socklen); printf("ret = %d
", ret); if(ret <= 0) { // // break; } } // fclose(newFile); sock_err: //5, socket close(cli_sock); return 0; }