C语言实现TCP通信(服务端与客户端)

在这里插入图片描述
服务器

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main(){
    
    
    //创建套接字
	/*
	int socket(int af, int type, int protocol);
	af:地址族 常用的有 AF_INET(IPv4 地址) 和 AF_INET6(IPv6)
	type:数据传输方式常用的有 SOCK_STREAM 和 SOCK_DGRAM
    protocol:传输协议,常用的有 IPPROTO_TCP(TCP 传输协议) 和 IPPTOTO_UDP(UDP 传输协议)
	返回值:非负描述符 – 成功,-1 - 出错
	*/
    int serv_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    //将套接字和IP、端口绑定
    struct sockaddr_in serv_addr;
    memset(&serv_addr, 0, sizeof(serv_addr));  //每个字节都用0填充
    serv_addr.sin_family = AF_INET;  //使用IPv4地址
    serv_addr.sin_addr.s_addr = inet_addr("192.168.183.138");  //具体的IP地址
    serv_addr.sin_port = htons(1234);  //端口
    bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
    //进入监听状态,等待用户发起请求
	/*
	int listen(int sock, int backlog); 
	sock:为需要进入监听状态的套接字
	backlog:为请求队列的最大长度
	*/
    listen(serv_sock, 20);
    //接收客户端请求
    struct sockaddr_in clnt_addr;
    socklen_t clnt_addr_size = sizeof(clnt_addr);
    int clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size);
    //向客户端发送数据
    char str[] = "Hello World!";
    write(clnt_sock, str, sizeof(str));
 
    //关闭套接字
    close(clnt_sock);
    close(serv_sock);
    return 0;
}

客户端

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
int main(){
    
    
    //创建套接字
    int sock = socket(AF_INET, SOCK_STREAM, 0);
    //向服务器(特定的IP和端口)发起请求
    struct sockaddr_in serv_addr;
    memset(&serv_addr, 0, sizeof(serv_addr));  //每个字节都用0填充
    serv_addr.sin_family = AF_INET;  //使用IPv4地址
    serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");  //具体的IP地址
    serv_addr.sin_port = htons(1234);  //端口
    connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
 
    //读取服务器传回的数据
    char buffer[40];
    read(sock, buffer, sizeof(buffer)-1);
 
    printf("Message form server: %s\n", buffer);
 
    //关闭套接字
    close(sock);
    return 0;
}

tcpClient.c

#include <stdio.h>
#include <sys/types.h>        
#include <sys/socket.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>

int main(int argc, char *argv[])
{
    
    
	if(3 != argc)
	{
    
    
		printf("%s <IP> <PORT>\n", argv[0]);
		return -1;
	}

	//1. 申请网卡
	int sockfd = socket(AF_INET, SOCK_STREAM, 0);
	if(-1 == sockfd)
	{
    
    
		perror("socket");
		return -1;
	}
	
	//2. 连接服务器
	struct sockaddr_in serveraddr = {
    
    0};
	serveraddr.sin_family = AF_INET;
	serveraddr.sin_addr.s_addr = inet_addr(argv[1]);
	serveraddr.sin_port = htons(atoi(argv[2]));
	if(-1 == connect(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)))
	{
    
    
		perror("connect");
		return -1;
	}

	while(1)
	{
    
    	
		char buf[100] = {
    
    0};
		printf("input> ");fflush(stdout);
		gets(buf);
		//3. 发请求
		write(sockfd, buf, 100);

		//4. 收反馈
		bzero(buf, 100);
		read(sockfd, buf, 100);
		printf("recv: %s\n", buf);
	}
	//5. 断开连接
	close(sockfd);
}

tcpServer.c

#include <stdio.h>
#include <sys/types.h>        
#include <sys/socket.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
#include <asm/ioctl.h>

#define PWMON  _IO('P', 0)
#define PWMOFF _IO('P', 1)
#define PWMSET _IO('P', 2)
#define LEDON _IO('L',0)
#define LEDOFF _IO('L',2)
#define TYPE 'c'
#define temp_9  _IO(TYPE,0)
#define temp_10 _IO(TYPE,1)
#define temp_11 _IO(TYPE,2)
#define temp_12 _IO(TYPE,3)
#define PATH "/dev/ds18b20"

int main()
{
    
    
	//1. 申请网卡
	int sockfd = socket(AF_INET, SOCK_STREAM, 0);
	if(-1 == sockfd)
	{
    
    
		perror("socket");
		return -1;
	}
	
	//2. 准备被客户端连接
	struct sockaddr_in serveraddr = {
    
    0};
	serveraddr.sin_family = AF_INET;
	serveraddr.sin_addr.s_addr = inet_addr("0.0.0.0");
	serveraddr.sin_port = htons(8886);
	if(-1 == bind(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)))
	{
    
    
		perror("connect");
		return -1;
	}
	
	//3.监听
	listen(sockfd, 10);

	//4. 提取接入
	int clientfd = accept(sockfd, NULL, NULL);

	
	int fdl = open("/dev/led0", O_RDWR);	

	
	int fdt;
    short temp;
    char zheng,fen;
    float temputer,resolution;
    fdt = open(PATH,O_RDWR);
    if(fdt < 0){
    
    
            perror("open");
            return -1;
    }
    if(ioctl(fdt,temp_12,&resolution))
    {
    
    
            perror("ioctl \n");
            return -1;
    }

	while(1)
	{
    
    
		//5. 收请求
		char buf[30] = {
    
    0};
		read(clientfd, buf, 100);
		printf("recv: %s\n", buf);

		switch(buf[0])
		{
    
    
		case '1':
			//beep on
			ioctl(fdl, LEDON);
			break;
		case '2':
			//beep off
			ioctl(fdl, LEDOFF);
			break;
		case '3':
			if(!read(fdt,&temp,sizeof(short))){
    
    
                perror("read");
            }
            zheng = temp>>4;
            fen = temp & 0xf;
            if(zheng & (1<<8)){
    
    
                    temputer = (temp - 65535) * resolution;
            }else{
    
    
                    temputer = zheng + fen * resolution;
            }
            if((temputer >= (-55)) && (temputer <= 125))
                    sprintf(buf,"tempter:%0.3f\n",temputer);
		}
		//6. 发反馈
		write(clientfd, buf, 100);
	}
	//7. 断开连接
	close(sockfd);
	close(clientfd);
	close(fdt);
}

猜你喜欢

转载自blog.csdn.net/weixin_43319452/article/details/112019168