Linux 创建客户端,服务器连接和发送数据

服务器端

 1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <sys/types.h>
  4 #include <sys/socket.h>
  5 #include <arpa/inet.h>
  6 #include <errno.h>
  7 #include <sys/unistd.h>
  8 #include <sys/un.h>
  9 
 10 
 11 #define PORT 33333
 12 int main()
 13 {
 14     int sockfd;
 15     int cfd;
 16     int c_len;
 17     struct sockaddr_in addr;
 18     struct sockaddr_in c_addr;
 19 
 20     sockfd = socket(AF_INET,SOCK_STREAM,0);
 21 
 22     if(sockfd == -1)
 23     {
 24         perror("sock create error!\n");
 25         exit(1);
 26     }
 27     printf("socket success!\n");
  28 
 29     int opt=1;
 30     setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
 31 
 32 
 33     bzero(&addr,sizeof(struct sockaddr_in));
 34     addr.sin_family=AF_INET;
 35     addr.sin_port=htons(PORT);
 36     addr.sin_addr.s_addr=inet_addr("192.168.211.128");
 37 
 38     if(bind(sockfd,(struct sockaddr *)(&addr),sizeof(struct sockaddr_in))<0)
 39     {
 40         perror("bind error!\n");
 41         exit(1);
 42     }
 43     printf("bind success!\n");
 44 
 45     if(listen(sockfd,3)<0)
 46     {
 47         perror("listen error!\n");
 48         exit(1);
 49     }
 50     printf("listen success!\n");
 51 
 52     while(1)
 53     {
 54     bzero(&c_addr,sizeof(struct sockaddr_in));
 55     c_len = sizeof(struct sockaddr_in);
 56     printf("accepting........\n");
 57 
 58     cfd = accept(sockfd,(struct sockaddr *)(&c_addr),&c_len);
 59     if(cfd<0)
 60     {
 61         perror("accept error!\n");
 62         exit(1);
 63     }
 64      printf("accept success!\n");
 65 
 66     printf("port = %d ip = %s \n",ntohs(c_addr.sin_port),inet_ntoa(c_addr.sin_addr));
 67     write(cfd,"hello",5);
 68     }
 69     return 0;
 70 }


客户端

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <sys/types.h>
  4 #include <sys/socket.h>
  5 #include <arpa/inet.h>
  6 #include <sys/unistd.h>
  7 #include <sys/un.h>
  8 
  9 #define PORT 33333
 10 
 11 int main()
 12 {
 13     int sockfd;
 14     struct sockaddr_in s_addr;
 15 
 16     if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0)
 17     {
 18         perror("socket error!\n");
 19         exit(1);
 20     }
 21     printf("client socket success!\n");
 22 
 23     bzero(&s_addr,sizeof(struct sockaddr_in));
 24     s_addr.sin_family=AF_INET;
 25     s_addr.sin_port=htons(PORT);
 26     s_addr.sin_addr.s_addr=inet_addr("192.168.211.128");
 27 
 28     if(connect(sockfd,(struct sockaddr *)(&s_addr),sizeof(struct sockaddr_in))<0)
 29     {
 30         perror("connect error!\n");
 31         exit(1);
 32     }
 33 
 34     printf("connect success!\n");
 35     char buffer[1024];
 36     read(sockfd,buffer,sizeof(buffer));
 37     printf("recv server : %s \n",buffer);
 38     return 0;
 39 }

课堂笔记

  1. 互斥锁
    pthread_mutex_t mutex;全局变量
    pthread_mutex_init(&mutex,NULL); 初始化锁
    pthread_mutex_lock(&mutex); 上锁
    pthread_mutex_unlock(&mutex); 解锁
  2. 网络编程:
  • 进程解决的是本机内通信,网络通信解决的是任意不同机器的通信。

  • 网络通信需要的支持:通信设备:网卡路、由器、光纤。通信协议:操作系统自带协议栈,裸机开发需要独立的协议栈。

  • Linux四层模型
    应用层
    传输层
    网际层
    网络接口

  • OSI七层网络模型:
    物理层
    数据链路层

    网络层 IP\ICMP\ARP\RARP\

    传输层 TCP\UDP

    会话层SMTP
    表示层 TELNET\SNMP
    应用层TFTP\FTP\NFS\WAIS

  • 分层好处:灵活性好,易于实现和维护

  • 子网掩码:决定一个网段的大小

  • DNS:把域名解析成IP地址,或把IP地址解析为域名。

  • IP找主机,端口号找应用程序TCP

  • 端口号 21:FTP 22:Ssh

  • 校验数据:奇偶校验 CRC循环冗余 BCC异或校验 海明码校验

项目开发日报表

项目名称【苏嵌实训-嵌入式 linux C 第 8 天】
今日进度 以及任务1.了解网络编程相关概念2.创建客户端服务器端
本日任务完成情况已完成
本日开发中出现的问题汇总1. Socket operation on non-socket 错误,在if中要将较长条件用括号括起来2.bind error:用ifconfig命令查看主机IP设置一下
本日未解决问题
本日开发收获掌握了C/S方式的基本原理,可以在linux下创建服务器和客户端,并建立连接、发送数据
其他
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的示例代码,可以在 Linux 上使用 TCP 连接客户端发送数据: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #define PORT 8080 int main() { int sockfd, new_sockfd, valread; struct sockaddr_in serv_addr, cli_addr; char buffer[1024] = {0}; char *hello = "Hello from server"; int addrlen = sizeof(serv_addr); // 创建 socket if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { perror("socket failed"); exit(EXIT_FAILURE); } // 设置地址重用 int opt = 1; if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) { perror("setsockopt failed"); exit(EXIT_FAILURE); } // 设置服务器地址 serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = INADDR_ANY; serv_addr.sin_port = htons(PORT); // 绑定 socket 到指定地址 if (bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { perror("bind failed"); exit(EXIT_FAILURE); } // 监听连接 if (listen(sockfd, 3) < 0) { perror("listen failed"); exit(EXIT_FAILURE); } // 等待客户端连接 if ((new_sockfd = accept(sockfd, (struct sockaddr *)&cli_addr, (socklen_t*)&addrlen)) < 0) { perror("accept failed"); exit(EXIT_FAILURE); } // 发送数据客户端 send(new_sockfd, hello, strlen(hello), 0); printf("Hello message sent\n"); return 0; } ``` 这个代码会监听本地的 8080 端口,并等待客户端连接。一旦客户端连接上来,服务器就会发送一个 “Hello from server” 的消息到客户端

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值