• c语言的tcp和udp客户端和服务器


    都是最简单的用来记忆。

    this is my 的git地址:https://github.com/yanjinyun/cLanguageTcpUdp

    tcp最简单的服务器:

    int main(int argc, const char *argv[])
    {
        int listenfd, acceptfd;
        struct sockaddr_in sin, cin;
        socklen_t clen;
        char buf[1024];
    
        signal(SIGCHLD, SIG_IGN);
    
        listenfd = socket(PF_INET, SOCK_STREAM, 0);
    
        sin.sin_family = PF_INET;
        sin.sin_port = htons(atoi(argv[2]));
        sin.sin_addr.s_addr = inet_addr(argv[1]);
        bind(listenfd, (struct sockaddr *)&sin, sizeof(sin));
    
        listen(listenfd, 5);
    
        while(1)
        {
            clen = sizeof(cin);
            printf("listen ......
    ");
            acceptfd = accept(listenfd, (struct sockaddr *)&cin, &clen);
            printf("client %s %d connect
    ", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port));
    
            if(fork() == 0)
            {
                close(listenfd);
    
                while(1)
                {
                    bzero(buf, sizeof(buf));
                    if(recv(acceptfd, buf, sizeof(buf), 0) == 0)
                    {
                        printf("client %s %d exit
    ", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port));
                        exit(0);
                    }
                    printf("recv(%s %d): %s
    ", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), buf);
                }
            }
    
            close(acceptfd);
        }
    
        return 0;
    }

    tcp最简单的客户端:

    int main(int argc, const char *argv[])
    {
        int cfd = socket(PF_INET, SOCK_STREAM, 0);
        struct sockaddr_in cin;
        char buf[1024];
    
        cin.sin_family = PF_INET;
        cin.sin_port = htons(atoi(argv[2]));
        cin.sin_addr.s_addr = inet_addr(argv[1]);
        connect(cfd, (struct sockaddr *)&cin, sizeof(cin));
    
        printf("connect ip(%s) port(%s) server ok
    ", argv[1], argv[2]);
    
        if(fork() == 0)
        {
            while(1)
            {
                bzero(buf, sizeof(buf));
                recv(cfd, buf, sizeof(buf), 0);
                printf("recv: %s
    ", buf);
            }
        }
    
        while(1)
        {
            fgets(buf, sizeof(buf), stdin);
            buf[strlen(buf)-1] = '';
            send(cfd, buf, strlen(buf)+1, 0);
        }
    
        return 0;
    }

    udp的最简单的服务器:

    int main(int argc, const char *argv[])
    {
    	int sfd;
    	struct sockaddr_in sin, cin;
    	char buf1[1024], buf2[1024], buf3[1024];
    	socklen_t clen;
    
    	sfd = socket(PF_INET, SOCK_DGRAM, 0);
    
    	sin.sin_family = PF_INET;
    	sin.sin_port = htons(atoi(argv[2]));
    	sin.sin_addr.s_addr = inet_addr(argv[1]);
    	bind(sfd, (struct sockaddr *)&sin, sizeof(sin));
    
    	if(fork() == 0)
    	{
    		while(1)
    		{
    			clen = sizeof(cin);
    			bzero(buf1, sizeof(buf1));
    			recvfrom(sfd, buf1, sizeof(buf1), 0, (struct sockaddr *)&cin, &clen);
    			printf("recvfrom: %s %d %s
    ", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), buf1);
    		}
    	}
    
    	while(1)
    	{
    		fscanf(stdin, "%s%s%s", buf1, buf2, buf3);
    		cin.sin_family = PF_INET;
    		cin.sin_port = htons(atoi(buf2));
    		cin.sin_addr.s_addr = inet_addr(buf1);
    		sendto(sfd, buf3, strlen(buf3)+1, 0, (struct sockaddr *)&cin, sizeof(cin));
    	}
    
    	return 0;
    }
    

    udp最简单的客户端:

    int main(int argc, const char *argv[])
    {
    	int sfd;
    	struct sockaddr_in cin;
    	char buf1[1024], buf2[1024], buf3[1024];
    	socklen_t clen;
    
    	sfd = socket(PF_INET, SOCK_DGRAM, 0);
    
    	if(fork() == 0)
    	{
    		while(1)
    		{
    			clen = sizeof(cin);
    			bzero(buf1, sizeof(buf1));
    			recvfrom(sfd, buf1, sizeof(buf1), 0, (struct sockaddr *)&cin, &clen);
    			printf("recvfrom: %s %d %s
    ", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), buf1);
    		}
    	}
    
    	while(1)
    	{
    		fscanf(stdin, "%s%s%s", buf1, buf2, buf3);
    		cin.sin_family = PF_INET;
    		cin.sin_port = htons(atoi(buf2));
    		cin.sin_addr.s_addr = inet_addr(buf1);
    		sendto(sfd, buf3, strlen(buf3)+1, 0, (struct sockaddr *)&cin, sizeof(cin));
    	}
    
    	return 0;
    }
    

    ftp最简单的服务器器:

    #define N 256
    
    void list(int connectfd)
    {
    	DIR *dir;
    	struct dirent *d;
    	char buf[N];
    
    	if((dir=opendir((const char *)get_current_dir_name())) == NULL)
    	{
    		perror("opendir");
    		exit(1);
    	}
    	while((d=readdir(dir)) != NULL)
    	{
    		if(d->d_name[0] == '.')
    		{
    			continue;
    		}
    		strcpy(buf, d->d_name);
    		send(connectfd, buf, N, 0);
    	}
    
    	closedir(dir);
    }
    
    void get(int connectfd, char *filename)
    {
    	char buf[N];
    	FILE *fp;
    	int n;
    
    	if((fp=fopen(filename, "r")) == NULL)
    	{
    		strcpy(buf, "no");
    		send(connectfd, buf, sizeof(buf), 0);
    	}
    
    	strcpy(buf, "yes");
    	send(connectfd, buf, sizeof(buf), 0);
    
    	while((n=fread(buf, 1, sizeof(buf), fp)) > 0)
    	{
    		send(connectfd, buf, n, 0);
    	}
    
    	fclose(fp);
    }
    
    void put(int connectfd, char *filename)
    {
    	char buf[N];
    	FILE *fp;
    	int n;
    
    	if((fp=fopen(filename, "r")) == NULL)
    	{
    		strcpy(buf, "no");
    		send(connectfd, buf, sizeof(buf), 0);
    		fp = fopen(filename, "w");
    		while((n=recv(connectfd, buf, sizeof(buf), 0)) > 0)
    		{
    			fwrite(buf, 1, n, fp);
    		}
    		fclose(fp);
    
    		return;
    	}
    
    	strcpy(buf, "yes");
    	send(connectfd, buf, sizeof(buf), 0);
    }
    
    int main(int argc, const char *argv[])
    {
    	FILE *fp;
    	int n, listenfd, connectfd, i;
    	struct sockaddr_in s, c;
    	struct servent *sport;
    	socklen_t clen;
    	char *linep = NULL, buf[N], *arg[32];
    
    	signal(SIGCHLD, SIG_IGN);
    
    	if((fp=fopen("/etc/ftp.conf", "r")) == NULL)
    	{
    		perror("fopen");
    		exit(1);
    	}
    
    	if(getline(&linep, &n, fp) == -1)
    	{
    		perror("getline");
    		exit(0);
    	}
    	linep[strlen(linep)-1] = '';
    	chdir(linep);
    
    	if((sport=getservbyname("myftp", "tcp")) == NULL)
    	{
    		perror("getservbyname");
    		exit(1);
    	}
    
    #ifdef DEBUG
    	printf("%d %s
    ", n, linep);
    #endif
    
    	if((listenfd=socket(PF_INET, SOCK_STREAM, 0)) == -1)
    	{
    		perror("socket");
    		exit(1);
    	}
    	
    	s.sin_family = PF_INET;
    	s.sin_port = sport->s_port; 
    	s.sin_addr.s_addr = htonl(INADDR_ANY);
    	if(bind(listenfd, (struct sockaddr *)&s, sizeof(s)) == -1)
    	{
    		perror("bind");
    		exit(1);
    	}
    
    	listen(listenfd, 5);
    
    	while(1)
    	{
    		clen = sizeof(c);
    		if((connectfd=accept(listenfd, (struct sockaddr *)&c, &clen)) == -1)
    		{
    			perror("accept");
    			exit(1);
    		}
    
    		if(fork() == 0)
    		{
    			close(listenfd);
    
    			recv(connectfd, buf, sizeof(buf), 0);
    
    			arg[0] = strtok(buf, " ");
    			for(i=1; arg[i-1]!=NULL; i++)
    			{
    				arg[i]=strtok(NULL, " ");
    			}
    
    			if(strcmp(arg[0], "list") == 0)
    			{
    				list(connectfd);
    			}
    
    			if(strcmp(arg[0], "get") == 0)
    			{
    				get(connectfd, arg[1]);
    			}
    
    			if(strcmp(arg[0], "put") == 0)
    			{
    				put(connectfd, arg[1]);
    			}
    
    			close(connectfd);
    			exit(0);
    		}
    
    		close(connectfd);
    	}
    }
    

      

      

    ftp最简单的客户端器:

    #define N 256
    
    void list(int connectfd)
    {
    	DIR *dir;
    	struct dirent *d;
    	char buf[N];
    
    	if((dir=opendir((const char *)get_current_dir_name())) == NULL)
    	{
    		perror("opendir");
    		exit(1);
    	}
    	while((d=readdir(dir)) != NULL)
    	{
    		if(d->d_name[0] == '.')
    		{
    			continue;
    		}
    		strcpy(buf, d->d_name);
    		send(connectfd, buf, N, 0);
    	}
    
    	closedir(dir);
    }
    
    void get(int connectfd, char *filename)
    {
    	char buf[N];
    	FILE *fp;
    	int n;
    
    	if((fp=fopen(filename, "r")) == NULL)
    	{
    		strcpy(buf, "no");
    		send(connectfd, buf, sizeof(buf), 0);
    	}
    
    	strcpy(buf, "yes");
    	send(connectfd, buf, sizeof(buf), 0);
    
    	while((n=fread(buf, 1, sizeof(buf), fp)) > 0)
    	{
    		send(connectfd, buf, n, 0);
    	}
    
    	fclose(fp);
    }
    
    void put(int connectfd, char *filename)
    {
    	char buf[N];
    	FILE *fp;
    	int n;
    
    	if((fp=fopen(filename, "r")) == NULL)
    	{
    		strcpy(buf, "no");
    		send(connectfd, buf, sizeof(buf), 0);
    		fp = fopen(filename, "w");
    		while((n=recv(connectfd, buf, sizeof(buf), 0)) > 0)
    		{
    			fwrite(buf, 1, n, fp);
    		}
    		fclose(fp);
    
    		return;
    	}
    
    	strcpy(buf, "yes");
    	send(connectfd, buf, sizeof(buf), 0);
    }
    
    int main(int argc, const char *argv[])
    {
    	FILE *fp;
    	int n, listenfd, connectfd, i;
    	struct sockaddr_in s, c;
    	struct servent *sport;
    	socklen_t clen;
    	char *linep = NULL, buf[N], *arg[32];
    
    	signal(SIGCHLD, SIG_IGN);
    
    	if((fp=fopen("/etc/ftp.conf", "r")) == NULL)
    	{
    		perror("fopen");
    		exit(1);
    	}
    
    	if(getline(&linep, &n, fp) == -1)
    	{
    		perror("getline");
    		exit(0);
    	}
    	linep[strlen(linep)-1] = '';
    	chdir(linep);
    
    	if((sport=getservbyname("myftp", "tcp")) == NULL)
    	{
    		perror("getservbyname");
    		exit(1);
    	}
    
    #ifdef DEBUG
    	printf("%d %s
    ", n, linep);
    #endif
    
    	if((listenfd=socket(PF_INET, SOCK_STREAM, 0)) == -1)
    	{
    		perror("socket");
    		exit(1);
    	}
    	
    	s.sin_family = PF_INET;
    	s.sin_port = sport->s_port; 
    	s.sin_addr.s_addr = htonl(INADDR_ANY);
    	if(bind(listenfd, (struct sockaddr *)&s, sizeof(s)) == -1)
    	{
    		perror("bind");
    		exit(1);
    	}
    
    	listen(listenfd, 5);
    
    	while(1)
    	{
    		clen = sizeof(c);
    		if((connectfd=accept(listenfd, (struct sockaddr *)&c, &clen)) == -1)
    		{
    			perror("accept");
    			exit(1);
    		}
    
    		if(fork() == 0)
    		{
    			close(listenfd);
    
    			recv(connectfd, buf, sizeof(buf), 0);
    
    			arg[0] = strtok(buf, " ");
    			for(i=1; arg[i-1]!=NULL; i++)
    			{
    				arg[i]=strtok(NULL, " ");
    			}
    
    			if(strcmp(arg[0], "list") == 0)
    			{
    				list(connectfd);
    			}
    
    			if(strcmp(arg[0], "get") == 0)
    			{
    				get(connectfd, arg[1]);
    			}
    
    			if(strcmp(arg[0], "put") == 0)
    			{
    				put(connectfd, arg[1]);
    			}
    
    			close(connectfd);
    			exit(0);
    		}
    
    		close(connectfd);
    	}
    }
    
  • 相关阅读:
    js获取Session问题 dodo
    复制一个datatable的指定行到另外一个datatable dodo
    sqlserver数据库备份与还原语句 dodo
    net软件测试实战技术大全 dodo
    AJAX 浏览器支持 dodo
    使用 vs2005进行负载测试 dodo
    sql使用in批量删除 dodo
    各种浏览器兼容存在的方法:Xenocode Browser Sandbox dodo
    C#调用Windows API函数 dodo
    ewebeditor在ie8下报错 dodo
  • 原文地址:https://www.cnblogs.com/coding4/p/5603889.html
Copyright © 2020-2023  润新知