socket编程代码示例

1. TCP server client模拟聊天对话框

server.c

/* server.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>#define BUFFER_SIZE (1024)
#define IP_SIZE (100)
#define SERVER_SUCCESS (0)
#define SERVER_FAILURE (-1)
#define MAX_PENDDING_QUEUE (10)typedef enum {false = 0,true = 1,
} bool;static void server_usage(void)
{printf("#####################################\n");printf("#Server Usage:                      #\n");printf("#gcc server.c -o server             #\n");printf("#chmod 777 server                   #\n");printf("#./server <ip> <port>               #\n");printf("#                                   #\n");printf("#<ip>:server ip:192.168.xx.xx       #\n");printf("#<port>:server port:1024~65535      #\n");printf("#####################################\n");return;
}int main(int argc, char *argv[])
{int listenfd = -1;int connectfd = -1;int ret;int recv_bytes;struct sockaddr_in serveraddr;struct sockaddr_in clientaddr;socklen_t peerlen;char server_buf[BUFFER_SIZE] = {0};char client_addr[IP_SIZE] = {0};if (argc < 3) {server_usage();return SERVER_FAILURE;}/* socket */listenfd = socket(AF_INET, SOCK_STREAM, 0);if (listenfd == -1) {printf("[ERROR]server socket failed, why:%s\n", strerror(errno));return SERVER_FAILURE;}printf("[DEBUG]server socket success, listenfd = %d\n", listenfd);/* serveraddr */memset(&serveraddr, 0x00, sizeof(serveraddr));serveraddr.sin_family = AF_INET;serveraddr.sin_port = htons(atoi(argv[2]));inet_pton(AF_INET, argv[1], &serveraddr.sin_addr);/* bind */ret = bind(listenfd, (const struct sockaddr *)&serveraddr, sizeof(serveraddr));if (ret != 0) {printf("[ERROR]server bind failed, why:%s\n", strerror(errno));close(listenfd);return SERVER_FAILURE;}printf("[DEBUG]server bind success\n");/* listen */ret = listen(listenfd, MAX_PENDDING_QUEUE);if (ret != 0) {printf("[ERROR]server listen failed, why:%s\n", strerror(errno));close(listenfd);return SERVER_FAILURE;}printf("[DEBUG]server listen success\n");printf("server waiting for connect......\n\n");/* accept */while (true) {memset(&clientaddr, 0x00, sizeof(clientaddr));peerlen = sizeof(clientaddr);connectfd = accept(listenfd, (struct sockaddr *)&clientaddr, &peerlen);if (connectfd == -1) {printf("[ERROR]server accept failed, why:%s\n", strerror(errno));close(listenfd);return SERVER_FAILURE;}memset(client_addr, 0x00, sizeof(client_addr));inet_ntop(AF_INET, &clientaddr.sin_addr, client_addr, sizeof(client_addr));printf("[DEBUG]server connected, client ip:%s, port:%d\n\n", client_addr, ntohs(clientaddr.sin_port));/* send and recv */while (true) {memset(server_buf, 0x00, sizeof(server_buf));printf("\033[1m<--- \033[0m"), fflush(stdout);recv_bytes = recv(connectfd, server_buf, sizeof(server_buf), 0);if (recv_bytes == -1) {printf("[ERROR]server recv failed, why:%s\n", strerror(errno));close(connectfd);close(listenfd);return SERVER_FAILURE;} else if (recv_bytes == 0) {printf("[DEBUG]server detected client gone!\n");close(connectfd);break;}printf("client@%s:%d said:%s\n", inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port), server_buf);memset(server_buf, 0x00, sizeof(server_buf));printf("\033[1m---> \033[0m"), fflush(stdout);fgets(server_buf, sizeof(server_buf), stdin);send(connectfd, server_buf, sizeof(server_buf), 0);printf("\n");}}close(listenfd);return SERVER_SUCCESS;
}

client.c

/* client.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>#define BUFFER_SIZE (1024)
#define CLIENT_SUCCESS (0)
#define CLIENT_FAILURE (-1)
#define MAX_PENDDING_QUEUE (10)typedef enum {false = 0,true = 1,
} bool;static void client_usage(void)
{printf("#####################################\n");printf("#Client Usage:                      #\n");printf("#gcc client.c -o client             #\n");printf("#chmod 777 client                   #\n");printf("#./client <ip> <port>               #\n");printf("#                                   #\n");printf("#<ip>:server ip:192.168.xx.xx       #\n");printf("#<port>:server port:1024~65535      #\n");printf("#####################################\n");return;
}int main(int argc, char *argv[])
{int sockfd = -1;int ret;int recv_bytes;struct sockaddr_in serveraddr;char client_buf[BUFFER_SIZE] = {0};if (argc < 3) {client_usage();return CLIENT_FAILURE;}/* socket */sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd == -1) {printf("[ERROR]client socket failed, why:%s\n", strerror(errno));return CLIENT_FAILURE;}printf("[DEBUG]client socket success, sockfd = %d\n", sockfd);/* serveraddr */memset(&serveraddr, 0x00, sizeof(serveraddr));serveraddr.sin_family = AF_INET;serveraddr.sin_port = htons(atoi(argv[2]));inet_pton(AF_INET, argv[1], &serveraddr.sin_addr);ret = connect(sockfd, (const struct sockaddr *)&serveraddr, sizeof(serveraddr));if (ret == -1) {printf("[ERROR]client connect failed, why:%s\n", strerror(errno));close(sockfd);return CLIENT_FAILURE;}printf("[DEBUG]client connect success\n");while (true) {memset(client_buf, 0x00, sizeof(client_buf));printf("\033[1m---> \033[0m"), fflush(stdout);fgets(client_buf, sizeof(client_buf), stdin);printf("\n");/* client said quit */if (strncmp(client_buf, "quit!", strlen("quit!")) == 0) {printf("[DEBUG]client said %s\n", client_buf);break;}send(sockfd, client_buf, sizeof(client_buf), 0);memset(client_buf, 0x00, sizeof(client_buf));printf("\033[1m<--- \033[0m"), fflush(stdout);recv_bytes = recv(sockfd, client_buf, sizeof(client_buf), 0);if (recv_bytes == -1) {printf("[ERROR]client recv failed, why:%s\n", strerror(errno));close(sockfd);return CLIENT_FAILURE;} else if(recv_bytes == 0) {printf("[DEBUG]client detected server gone!\n");break;}printf("server@%s:%d said:%s\n", argv[1], atoi(argv[2]), client_buf);}close(sockfd);printf("[DEBUG]<=====client exit\n");return CLIENT_SUCCESS;
}

wireshark抓包结果:

2. 用原始套接字模拟ping操作并解析IP包与ICMP包

//This is a ping which can both send and receive ICMP packets
#include <sys/types.h>
#include <unistd.h>
#include <errno.h>
#include <signal.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <linux/tcp.h>
#include <netinet/ip_icmp.h>
#include <strings.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>#define PING_SUCCESS (0)
#define PING_FAILURE (-1)
#define BUFFER_SIZE (1024)
#define MAGIC_NUM (3623)
//#define DEBUGstatic unsigned short calc_cksum(unsigned short *addr, int len)
{int sum=0;unsigned short res=0;while( len > 1) {sum += *addr++;len -= 2;}if( len == 1) {*((unsigned char *)(&res))=*((unsigned char *)addr);sum += res;}sum = (sum >>16) + (sum & 0xffff);sum += (sum >>16) ;res = ~sum;return res;
}int main(int argc, char *argv[])
{if (argc < 4) {printf("param error, usage: ./ping serverip -c <count>\n");return PING_FAILURE;}int count = atoi(argv[3]);char send_buff[BUFFER_SIZE] = {0};char recv_buff[BUFFER_SIZE] = {0};char src_buff[BUFFER_SIZE] = {0};int sockfd = -1;int recvfd = -1;int ret, i, lenfrom;struct sockaddr_in target_addr;struct sockaddr_in source_addr;/* socket */sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);if (sockfd == -1) {printf("sockfd create for IPPROTO_ICMP failed, why:%s\n", strerror(errno));return PING_FAILURE;}recvfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);if (recvfd == -1) {printf("recvfd create for IPPROTO_ICMP failed, why:%s\n", strerror(errno));close(sockfd);return PING_FAILURE;}#ifdef DEBUGprintf("[DEBUG]socket create for IPPROTO_ICMP success\n");
#endifmemset(&target_addr, 0x00, sizeof(target_addr));ret = inet_pton(AF_INET, argv[1], &target_addr.sin_addr);if (ret != 1) {printf("bad ip address to be converted:%s\n", argv[1]);close(recvfd);close(sockfd);return PING_FAILURE;}struct icmp *picmp = (struct icmp *)send_buff;struct ip *pip = (struct ip*)recv_buff;struct icmp *p_recvicmp = (struct icmp *)(pip + 1);for (i = 0; i < count; i++) {memset(send_buff, 0x00, sizeof(send_buff));/*----TYPE----CODE----CHECKSUM----*----IDENTIFIER------SEQUENCE----*----OPTION----------------------*/picmp->icmp_type = ICMP_ECHO; /* ECHO-REQUEST */picmp->icmp_code = 0;picmp->icmp_id = MAGIC_NUM;picmp->icmp_seq = i;picmp->icmp_cksum = calc_cksum((unsigned short *)picmp, 8);/* PING REQUEST */ret = sendto(sockfd, send_buff, 64, 0, (const struct sockaddr *)&target_addr, sizeof(target_addr)); /* ICMP total 64 bytes */if (ret == -1) {printf("turn %d sendto error, why:%s\n", i, strerror(errno));close(recvfd);close(sockfd);return PING_FAILURE;}#ifdef DEBUGprintf("[DEBUG]turn %d, %d bytes send...\n", i, ret);
#endif/* PING REPLY */memset(recv_buff, 0x00, sizeof(recv_buff));memset(&source_addr, 0x00, sizeof(source_addr));lenfrom = sizeof(source_addr);ret = recvfrom(sockfd, recv_buff, sizeof(recv_buff), 0, (struct sockaddr *)&source_addr, &lenfrom);if (ret == -1) {printf("turn %d recvfrom error, why:%s\n", i, strerror(errno));close(recvfd);close(sockfd);return PING_FAILURE;} else if (ret == 0) {printf("turn %d detect socket peer shutdown!\n", i);close(recvfd);close(sockfd);return PING_FAILURE;}#ifdef DEBUGprintf("[DEBUG]turn %d, %d bytes recv\n", i, ret);printf("[DEBUG]recv ip header len = %d\n", pip->ip_hl);
#endifif ((ret - (pip->ip_hl * 4)) < 8) { /* we assume ICMP at least 8 byte */printf("turn %d no ICMP reply!\n", i);close(recvfd);close(sockfd);return PING_FAILURE;}if ((p_recvicmp->icmp_type == ICMP_ECHOREPLY) && (p_recvicmp->icmp_id == MAGIC_NUM)) {/* get the src and dst addr */memset(src_buff, 0x00, sizeof(src_buff));/* from where? */inet_ntop(AF_INET, &source_addr.sin_addr, src_buff, sizeof(src_buff));printf("[myping]%d bytes from %s to %s: icmp_seq=%u ttl=%d\n", (ret-(pip->ip_hl * 4)), (src_buff), (inet_ntoa(pip->ip_dst)), (p_recvicmp->icmp_seq), (pip->ip_ttl));} else {printf("[myping]recv no wanted packet!\n");continue;}}printf("done!\n");close(recvfd);close(sockfd);return PING_SUCCESS;
}

 wireshark抓包结果:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1983.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker

Docker 一、Docker 简介1.1 Docker 概述1.2 Docker1.3 Docker 受欢迎的原因1.4 Docker 与 openstack&#xff08;虚拟机&#xff09; 的区别1.5 Docker核心概念 二、安装 Docker三、Docker 命令四、Docker 镜像操作五、Docker 容器操作 一、Docker 简介 1.1 Docker 概述 Dock…

SpringBoot + Docker 实现一次构建到处运行

一、容器化部署的好处 Docker 作为一种新兴的虚拟化方式&#xff0c;它可以更高效的利用系统资源&#xff0c;不需要进行硬件虚拟以及运行完整操作系统等额外开销。 传统的虚拟机技术启动应用服务往往需要数分钟&#xff0c;而 Docker 容器应用&#xff0c;由于直接运行宿主内…

AI绘画创意文字全流程揭秘,你的终极文字艺术实操宝典

本教程收集于&#xff1a;AIGC从入门到精通教程汇总 AIGC技术不断更新迭代&#xff0c;国内出现了越来越多的新玩法&#xff0c;比如最近大家都在热议的AI绘画创意文字。 过去的一周&#xff0c;我把这些新玩法都研究了一遍&#xff0c;并总结了一套完整的制作流程。 主流的…

python+allure+jenkins

目录 前言 在 python 中使用 allure 1. 安装 pytest 2. 安装 pytest-allure-adaptor 3. 使用 pytest 执行测试用例并生成 allure 中间报告&#xff08;此步骤可以省略&#xff0c;因为在 jenkins job 中会配置执行类似的命令&#xff09; 4. Jenkins 中安装Allure Jenkin…

SpringCloud学习路线(3)—— Eureka注册中心

一、导引 服务调用出现的问题 服务调用采取的请求地址是静态的&#xff0c;当我们使用服务集群时&#xff0c;很容易造成只能调用固定的微服务上的接口。多个提供者&#xff0c;消费者的使用对象无法确定消费者无法得知提供者的状态 二、Eureka注册中心 &#xff08;一&…

【C#】并行编程实战:使用并发集合

在上一章的并行编程实现里&#xff0c;为了保护资源&#xff0c;我们对共享资源加锁&#xff08;各种同步原语&#xff09;来进行保护&#xff0c;避免多线程同时访问&#xff08;主要是写入&#xff09;。但一般来说&#xff0c;共享资源是一个可以由多个线程读写的集合&#…

JVM系列(8)——对象的内存布局

1、对象的创建过程 加载-验证-准备-解析-初始化-申请内存-成员变量赋初始值-加载构造方法。 前半段是JVM系列&#xff08;5&#xff09;——类加载过程&#xff0c;申请内存可参考&#xff1a;JVM系列&#xff08;3&#xff09;——内存分配与回收策略。 2、对象在内存中的存…

华为申请注册盘古大模型商标;京东推出言犀大模型,率先布局产业应用

7月14日科技新闻早知道&#xff0c;一分钟速览。 1.华为申请注册盘古大模型商标&#xff1a; 据天眼查 App 显示&#xff0c;7 月 7 日&#xff0c;华为技术有限公司申请注册“华为云盘古”、“Huawei Cloud Pangu Models”文字及图形商标&#xff0c;国际分类为网站服务、社…

常用API学习06(Java)

Biglnteger public BigInteger(int num, Random rnd) 获取随机大整数&#xff0c;范围&#xff1a;[0~2的num次方-1] public BigInteger(String val) 获取指定的大整数 public BigInteger(String val, int radix) 获取指定进制的大整数 public static BigInteg…

「深度学习之优化算法」(十四)麻雀搜索算法

1. 麻雀搜索算法简介 (以下描述,均不是学术用语,仅供大家快乐的阅读)   麻雀搜索算法(sparrow search algorithm)是根据麻雀觅食并逃避捕食者的行为而提出的群智能优化算法。提出时间是2020年,相关的论文和研究还比较少,有可能还有一些正在发表中,受疫情影响需要论…

C++:const修饰指针

const修饰符常常需要在c中使用到&#xff0c;需要注意到他对于指针修饰的时候的不同区别。 #include<iostream> using namespace std; int main() {//1.const修饰指针int a 10;int b 10;const int* p &a;//指针指向的值不可以改&#xff0c;指针的指向可以改// …

2023最新ChatGPT商业运营网站源码+支持ChatGPT4.0+新增GPT联网功能+支持ai绘画+实时语音识别输入+用户会员套餐+免费更新版本

2023最新ChatGPT商业运营网站源码支持ChatGPT4.0新增GPT联网功能支持ai绘画实时语音识别输入用户会员套餐免费更新版本 一、AI创作系统二、系统程序下载三、系统介绍四、安装教程五、主要功能展示六、更新日志 一、AI创作系统 提问&#xff1a;程序已经支持GPT3.5、GPT4.0接口…

vue2watch监听遇到的问题

1 vue 父组件里引入子组件 显示与隐藏是v-if控制时 父传入子的参数通过watch 监听请求接口时 watch 时而监听不到 请求接口的参数就不对 如图 父组件这么引入子组件v-show 和v-if 是有区别的 2 子组件通过watch 监听后 清空页面要展示的列表数据 重新从第一页加载数据&#x…

【雕爷学编程】Arduino动手做(164)---Futaba S3003舵机模块3

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…

长沙打造“全球研发中心城市”,智能网联产业如何交卷?

作者 | 魏启扬 来源 | 洞见新研社 知乎上有一个浏览超百万的热门问题——“大家怎么看待长沙这个城市&#xff1f;” 答主“星球研究所”的回答获得了高赞&#xff0c;“这是一个天性如火的城市”。 网红城市的外衣下&#xff0c;从湖南卫视的综艺节目&#xff0c;到网红美…

qiankun:react18主应用 + 微应用 react18 + vue3

一&#xff1a;主应用 搭建react项目 npx create-react-app react-qiankun-main安装Antd npm install antd –save在 index.js中引入 import { ConfigProvider } from "antd"; import zhCN from "antd/locale/zh_CN"; import "antd/dist/reset.css…

DDOS百科:什么是 DDoS 攻击及如何防护DDOS攻击

一、什么是 DDoS 攻击&#xff1f; 当多台机器一起攻击一个目标&#xff0c;通过大量互联网流量淹没目标或其周围基础设施&#xff0c;从而破坏目标服务器、服务或网络的正常流量时&#xff0c;就会发生分布式拒绝服务(DDoS)攻击。 DDoS允许向目标发送指数级更多的请求&#…

【大数据之Hadoop】三十七、Hadoop HA高可用

1、HA概述 实现高可用最关键的策略是消除单点故障。HA分成各个组件的HA机制&#xff1a;HDFS的HA和YARN的HA。   Hadoop2.0之前&#xff0c;在HDFS集群中NameNode存在单点故障&#xff08;SPOF&#xff09;。 NameNode主要在以下两个方面影响HDFS集群&#xff1a; &#xff…

AI时代图像安全“黑科技”如何助力人工智能与科技发展?

〇、前言 7月7日下午&#xff0c;2023世界人工智能大会&#xff08;WAIC&#xff09;“聚焦大模型时代AIGC新浪潮—可信AI”论坛在上海世博中心红厅举行。人工智能等技术前沿领域的著名专家与学者、投资人和领军创业者汇聚一堂&#xff0c;共同探索中国科技创新的驱动力量。 在…

4. 设计(黑盒)测试用例 (一) 等价类 边界值 判定表

本篇文章我们将详细介绍如何来测试用例。 1. 设计测试用例的基本要素 1.1 测试用例概念 测试用例&#xff08;Test Case&#xff09;是为了实施测试而向被测试的系统提供的一组集合。 1.2 测试用例要素 测试环境、测试步骤、测试数据、预期结果。 1.3 测试用例的重要性 提…