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学习相关推荐

  1. Linux Socket学习(十三)

    使用UDP进行广播 如果通信只能在两个单体之间完成,这样的方式是没有效率的.另一方面,广播允许同时要多个接收者传播信息. 在这一章,我们将会学习下列内容: 建立一个UDP广播套接口 使用套接口发送广播 ...

  2. Linux Socket学习(十八)--完

    一个实际的网络工程 不论我们的头脑是否在由上一章的学习中清醒过来,现在我们需要休息一下了.在这一章我们并不讨论新的内容,而是用我们所学到的这些东西来实现一些有趣的事情.在学习了这么多的东西之后来一些有 ...

  3. Linux Socket学习--套接口的类型和协议

    我们首先来说一下PF_INET和AF_INET,虽然标准提倡在指定demain参数的时候,优先使用PF_INET,但是大量已经编写的c代码遵循旧的协议.目前情况是AF_UNIX=PF_UNIX,AF_ ...

  4. Linux Socket学习--为套接口绑定地址

    当我们使用socket函数创建一个套接口之后,这个套接口就处于无名状态,虽然之前我们提到即使没有地址,套接口也能使用,但是这个只限于套接口对在同一个Linux内核中,如果位于两台不同的主机的套接口需要 ...

  5. Linux Socket学习(五)

    地址转换函数 上一章中,我们已经了可以分配与初始化各种类型的套接口.这些是由一个常量进行初始化的简单例子.由一个使用变化地址的C字符串设置一个地址需要更多的编程努力.在这一章,我们将会关注建立网络地址 ...

  6. Linux Socket学习(十二)

    套接口选项 在前面的几章中,我们讨论了使用套接口的基础内容.现在我们要来探讨一些可用的其他的特征.在我们掌握了这一章的概念之后,我们就为后面的套接口的高级主题做好了准备.在这一章,我们将会专注于下列主 ...

  7. Linux Socket学习--面向非连接的协议

    套接口的通信有2中基本方式:面向连接和面向非连接的通信. 面向非连接指的是通信之前不需要建立连接,我们生成了一个非连接的套接口,就可以向任何愿意接受我们消息的套接口发送消息,而且每一个消息都可以被重定 ...

  8. Android socket 学习记录 之 执行new socket(ip, port)程序崩溃

    这段时间在学习Android的socket编程,我不是专做APP的,做的是bootloader.驱动.hal.framework这个线的,也就是系统搭建和功能优化设计.为了打通这整条线,为此学习了不少 ...

  9. 我的Linux内核学习笔记

    在开始今天的内容之前,其实有一些题外话可以和大家分享一下.自从工作以来,我个人一直都有一个观点.那就是怎么样利用简单的代码来说明开发中的问题,或者是解释软件中的原理,这是一个很高的学问.有些道理看上去 ...

最新文章

  1. 你走对Linux学习之路了吗?
  2. csrediscore访问redis集群_搭建文档 | centos7.6环境下redis5.0.8集群搭建
  3. logit方程怎么写_一元四次方程的常规解法
  4. 一文搞定哈希(六种构建、四种冲突解决方法、查找算法总结)
  5. 怎么从转移特性曲线上看dibl_「科普向」这篇让你快速搞懂IGBT的静态特性
  6. python编辑学生分数_python处理excel(04)数据筛选和过滤
  7. Qt文档阅读笔记-The Meta-Object System解析及实例
  8. 拥有所有归档文件,但没有备份情况下的数据文件恢复
  9. matlab在电气信息类专业中的应用,MATLAB在电气信息类专业中的应用(高等学校应用型特色规划...
  10. matlab怎么找出奇数个数_用MATLAB绘制系统根轨迹和性能分析
  11. 阶段案例趣PHP网站开发实战,PHP基础案例第16章 阶段案例——趣PHP网站开发实战.ppt...
  12. 笔记本有线及无线的MAC地址修改
  13. qq传输文件为什么服务器忙,qq传送离线 接收文件很慢怎么回事
  14. 千牛通知栏常驻是什么意思_我告诉你小米常驻通知是什么意思
  15. 01背包问题——大背包:
  16. java8:lambda级联表达式(Cascading)或柯里化(Currying)原理简化详解
  17. python造数取值方法 random与faker
  18. 架构方案(16) 常见分布式文件存储介绍、选型比较、以及架构设计
  19. R语言caret机器学习(一)数据可视化:绘制特征变量图
  20. AndroidStudio Plugin插件开发

热门文章

  1. 通过修改程序解决Vista/Win7/Win8下应用程序兼容性问题
  2. struts2中用户登陆验证的常用方法
  3. javascript笔记:深入分析javascript里对象的创建(上)续篇
  4. opencv + python3 利用ros 的 cv_bridge 传送图像消息的一种替代方法
  5. hex文件和bin文件区别
  6. ubuntu mysql登陆_ubuntu mysql 配置 远程登陆
  7. CosmoMC第一次测试
  8. tensorflow,神经网络创建源码
  9. Runtime知识点整理
  10. POJ 2231 Moo Volume(递推、前缀和)