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 ......\n");
        acceptfd = accept(listenfd, (struct sockaddr *)&cin, &clen);
        printf("client %s %d connect\n", 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\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port));
                    exit(0);
                }
                printf("recv(%s %d): %s\n", 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\n", argv[1], argv[2]);

    if(fork() == 0)
    {
        while(1)
        {
            bzero(buf, sizeof(buf));
            recv(cfd, buf, sizeof(buf), 0);
            printf("recv: %s\n", buf);
        }
    }

    while(1)
    {
        fgets(buf, sizeof(buf), stdin);
        buf[strlen(buf)-1] = ‘\0‘;
        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\n", 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\n", 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] = ‘\0‘;
	chdir(linep);

	if((sport=getservbyname("myftp", "tcp")) == NULL)
	{
		perror("getservbyname");
		exit(1);
	}

#ifdef DEBUG
	printf("%d %s\n", 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] = ‘\0‘;
	chdir(linep);

	if((sport=getservbyname("myftp", "tcp")) == NULL)
	{
		perror("getservbyname");
		exit(1);
	}

#ifdef DEBUG
	printf("%d %s\n", 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);
	}
}
时间: 2024-08-01 13:10:24

c语言的tcp和udp客户端和服务器的相关文章

python socket模块:TCP,UDP客户端

__author__ = 'Administrator' import socket # tcp客户端 target_host = 'www.51cto.com' target_port = 80 # AF_INET是标准IPv4地址或主机名,SOCK_STREAM表示是TCP的方式 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 建立连接 client.connect((target_host, target_port)

TCP协议的客户端与服务器的通信过程

使用TCP时,客户端与服务器端的通信流程 服务器初始化1)调用socket,创建文件描述符fd2) 调用bind将fd与服务器的IP与PORT绑定3)调用listen将套接字设为监听模式,准备接收客户端连接请求4)调用accept等待并接收客户端的连接请求,建立好TCP连接后,该函数会返回一个新的已连接套接字newfd 建立连接1)客户端调用socket创建文件描述符2)调用connect,向服务器发送连接请求3)connect会发送一个请求SYN段并阻塞等待服务器应答(第一次握手)4)服务器收

C语言Socket-模拟远程CMD(客户端向服务器发送命令,服务器执行该命令)

服务端(server) #include <stdio.h> #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") //把ws2_32.lib加到Link页的连接库 #define PORT 15001 //通信的端口(指服务器端) #define ERROR 0 #define BUFFER_SIZE 1024 //注意:此Server端数据接收缓冲区 >= Client端数据发送缓冲区 ,否则造

Qt浅谈之十六:TCP和UDP(之一)

一.简介 Qt使用QtNetwork模块来进行网络编程,提供了一层统一的套接字抽象用于编写不同层次的网络程序,避免了应用套接字进行网络编的繁琐(因有时需引用底层操作系统的相关数据结构).有较底层次的类如QTcpSocket.QTcpServer和QUdpSocket等来表示低层的网络概念:还有高层次的类如QNetworkRequest.QNetworkReply和QNetworkAccessManager使用相同的协议来执行网络操作:也提供了QNetworkConfiguration.QNetw

TCP/UDP客户端

Python 网络编程----模块socekt 在渗透测试的过程中,经常会遇到需要创建一个TCP客户端来连接服务器.发送垃圾数据.进行模糊测试活进行其他任务的情况. 简单的TCP客户端代码: #!/usr/bin/env python3.5#filename = TCP_client.py import socket target_host = "www.qq.com"target_port = 80 #建立一个socket对象 client = socket.socket(socke

Windows下C语言的Socket编程例子(TCP和UDP)

一.  <TCP> server端: 1 #include "stdafx.h" 2 #include <stdio.h> 3 #include <winsock2.h> 4 5 #pragma comment(lib,"ws2_32.lib") 6 7 int main(int argc, char* argv[]) 8 { 9 //初始化WSA 10 WORD sockVersion = MAKEWORD(2,2); 11 W

Socket 通信原理(Android客户端和服务器以TCP&amp;&amp;UDP方式互通)

ZERO.前言 有关通信原理内容是在网上或百科整理得到,代码部分为本人所写,如果不当,还望指教. 一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务器端才能向客户端返回数据.而Socket通信则是在双方建立起连接后就可以直接进行数据的传输,在连接时可实现信息的主动推送,而不需要每次由客户端想服务器发送请求. 那么,什么是s

Android编程:UDP客户端和TCP客户端

Android编程:UDP客户端和TCP客户端

TCP 、UDP网络编程作业代写、代写C 语言 TCP程序 Network Programming using C

TCP .UDP网络编程作业代写.代写C 语言 TCP程序Network Programming using COverview? This homework is due by 11:59:59 PM on Thursday, April 26, 2018.? This homework will count as 8% of your final course grade.? This homework is to be completed individually. Do not shar