Linux socket学习
1 //服务器端 server.c 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<errno.h> 6 #include<sys/types.h> 7 #include<sys/socket.h> 8 #include<netinet/in.h> 9 #define MAXLINE 4096 10 11 //socket(int domain, int type, int protocol) 12 // 协议域 socket类型 指定协议 13 int main(int argc, char **argv) 14 { 15 int n, listenfd, connfd; 16 struct sockaddr_in servaddr; 17 char buff[MAXLINE]; 18 if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ) 19 { 20 printf("create socket error:%s(error:%d)\n",strerror(errno),errno); 21 exit(0); 22 } 23 memset(&servaddr, 0, sizeof(servaddr)); 24 servaddr.sin_family = AF_INET; 25 servaddr.sin_addr.s_addr = htonl(INADDR_ANY); //系统绑定默认的网卡即IP地址 26 servaddr.sin_port = htons(6666); //监听本机的6666号端口 27 28 if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1) 29 { //把一个地址族中的特定地址赋给socket 30 printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno); 31 exit(0); 32 } 33 if( listen(listenfd, 10) == -1) 34 { //调用listen()监听socket 35 printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno); 36 exit(0); 37 } 38 printf("waiting for client's request...\n"); 39 while(1) 40 { 41 if( (connfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) == -1) 42 { //调用accept()函数取接收请求,连接建立好 43 printf("accept socket error: %s(errno: %d)",strerror(errno),errno); 44 continue; 45 } 46 n = recv(connfd, buff, MAXLINE, 0); //recv函数返回其实际copy的字节数 47 buff[n] = '\0'; 48 printf("recv msg from client: %s\n", buff); 49 close(connfd); 50 } 51 close(listenfd); 52 }
1 //客户端 client.c 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<errno.h> 6 #include<sys/types.h> 7 #include<sys/socket.h> 8 #include<netinet/in.h> 9 #define MAXLINE 4096 10 11 int main(int argc, char** argv) 12 { 13 int n, sockfd; 14 char recvline[MAXLINE], sendline[MAXLINE]; 15 struct sockaddr_in servaddr; 16 if( argc != 2) 17 { 18 printf("usage: ./client <ipaddress>\n"); 19 exit(0); 20 } 21 if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) 22 { 23 printf("create socket error: %s(errno: %d)\n", strerror(errno),errno); 24 exit(0); 25 } 26 memset(&servaddr, 0, sizeof(servaddr)); 27 servaddr.sin_family = AF_INET; 28 servaddr.sin_port = htons(6666); 29 30 if( inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0) 31 { //IP地址转换函数 32 printf("inet_pton error for %s\n",argv[1]); 33 exit(0); 34 } 35 if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0) 36 { //调用connect()发出连接请求 37 printf("connect error: %s(errno: %d)\n",strerror(errno),errno); 38 exit(0); 39 } 40 printf("send msg to server: \n"); 41 fgets(sendline, 4096, stdin); 42 if( send(sockfd, sendline, strlen(sendline), 0) < 0) 43 { 44 printf("send msg error: %s(errno: %d)\n", strerror(errno), errno); 45 exit(0); 46 } 47 close(sockfd); 48 exit(0); 49 }
分别用gcc编译好后执行,开2个终端:
转载于:https://www.cnblogs.com/ht-beyond/p/4324754.html
Linux socket学习相关推荐
- Linux Socket学习(十三)
使用UDP进行广播 如果通信只能在两个单体之间完成,这样的方式是没有效率的.另一方面,广播允许同时要多个接收者传播信息. 在这一章,我们将会学习下列内容: 建立一个UDP广播套接口 使用套接口发送广播 ...
- Linux Socket学习(十八)--完
一个实际的网络工程 不论我们的头脑是否在由上一章的学习中清醒过来,现在我们需要休息一下了.在这一章我们并不讨论新的内容,而是用我们所学到的这些东西来实现一些有趣的事情.在学习了这么多的东西之后来一些有 ...
- Linux Socket学习--套接口的类型和协议
我们首先来说一下PF_INET和AF_INET,虽然标准提倡在指定demain参数的时候,优先使用PF_INET,但是大量已经编写的c代码遵循旧的协议.目前情况是AF_UNIX=PF_UNIX,AF_ ...
- Linux Socket学习--为套接口绑定地址
当我们使用socket函数创建一个套接口之后,这个套接口就处于无名状态,虽然之前我们提到即使没有地址,套接口也能使用,但是这个只限于套接口对在同一个Linux内核中,如果位于两台不同的主机的套接口需要 ...
- Linux Socket学习(五)
地址转换函数 上一章中,我们已经了可以分配与初始化各种类型的套接口.这些是由一个常量进行初始化的简单例子.由一个使用变化地址的C字符串设置一个地址需要更多的编程努力.在这一章,我们将会关注建立网络地址 ...
- Linux Socket学习(十二)
套接口选项 在前面的几章中,我们讨论了使用套接口的基础内容.现在我们要来探讨一些可用的其他的特征.在我们掌握了这一章的概念之后,我们就为后面的套接口的高级主题做好了准备.在这一章,我们将会专注于下列主 ...
- Linux Socket学习--面向非连接的协议
套接口的通信有2中基本方式:面向连接和面向非连接的通信. 面向非连接指的是通信之前不需要建立连接,我们生成了一个非连接的套接口,就可以向任何愿意接受我们消息的套接口发送消息,而且每一个消息都可以被重定 ...
- Android socket 学习记录 之 执行new socket(ip, port)程序崩溃
这段时间在学习Android的socket编程,我不是专做APP的,做的是bootloader.驱动.hal.framework这个线的,也就是系统搭建和功能优化设计.为了打通这整条线,为此学习了不少 ...
- 我的Linux内核学习笔记
在开始今天的内容之前,其实有一些题外话可以和大家分享一下.自从工作以来,我个人一直都有一个观点.那就是怎么样利用简单的代码来说明开发中的问题,或者是解释软件中的原理,这是一个很高的学问.有些道理看上去 ...
最新文章
- 你走对Linux学习之路了吗?
- csrediscore访问redis集群_搭建文档 | centos7.6环境下redis5.0.8集群搭建
- logit方程怎么写_一元四次方程的常规解法
- 一文搞定哈希(六种构建、四种冲突解决方法、查找算法总结)
- 怎么从转移特性曲线上看dibl_「科普向」这篇让你快速搞懂IGBT的静态特性
- python编辑学生分数_python处理excel(04)数据筛选和过滤
- Qt文档阅读笔记-The Meta-Object System解析及实例
- 拥有所有归档文件,但没有备份情况下的数据文件恢复
- matlab在电气信息类专业中的应用,MATLAB在电气信息类专业中的应用(高等学校应用型特色规划...
- matlab怎么找出奇数个数_用MATLAB绘制系统根轨迹和性能分析
- 阶段案例趣PHP网站开发实战,PHP基础案例第16章 阶段案例——趣PHP网站开发实战.ppt...
- 笔记本有线及无线的MAC地址修改
- qq传输文件为什么服务器忙,qq传送离线 接收文件很慢怎么回事
- 千牛通知栏常驻是什么意思_我告诉你小米常驻通知是什么意思
- 01背包问题——大背包:
- java8:lambda级联表达式(Cascading)或柯里化(Currying)原理简化详解
- python造数取值方法 random与faker
- 架构方案(16) 常见分布式文件存储介绍、选型比较、以及架构设计
- R语言caret机器学习(一)数据可视化:绘制特征变量图
- AndroidStudio Plugin插件开发