Linux 网络编程 简单 TCP连接sock连接的例子
服务端
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#define PORT 8888
#define BACKLOG 2 // 帧听端口长度
void process_conn_server(int s);
int main()
{
int ss,sc; //ss 为服务器socket描述符,sc 为客户端socket的描述符号
struct sockaddr_in server_addr ; //服务器地址结构
struct sockaddr_in client_addr;
int err;
pid_t pid;
// 建立套接字
ss = socket(AF_INET, SOCK_STREAM, 0);// 建立流式的套接字
if (ss < 0)
{
printf("socker error\n");
return -1;
}
//设置服务器的地址
bzero(&server_addr, sizeof(server_addr)); // 清空结构体的数据
server_addr.sin_family = AF_INET; // 协议簇
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);//配置任何一个为本地的地址
server_addr.sin_port = htons(PORT);
//绑定地址和套接字
err = bind(ss, (struct sockaddr*)&server_addr, sizeof(server_addr));
if (err < 0)
{
printf("listen error\n");
return -1;
}
//设置帧听队列
err =listen(ss, BACKLOG);
if(err < 0)
{
printf("listen error\n");
return -1;
}
for(;;)
{
socklen_t addrlen = sizeof(struct sockaddr);
sc = accept(ss, (struct sockaddr*)&client_addr, &addrlen);
//接受客户端的连接
if(sc < 0)
{
continue;
}
//当有客户端连接了
pid = fork();
if(pid == 0)//子进程关闭服务器的帧听
{
close(ss);
process_conn_server(sc);
}
else//父进程关闭子进程
{
close(sc);
}
}
}
void process_conn_server(int s)
{
ssize_t size = 0;
char buffer[1024];
for(;;)
{
size = read(s, buffer, 1024);
if(size == 0)
{
return;
}
//构建相应字符,为接受到客户端字节的数量
sprintf(buffer, "%d bytes altogeter\n", size);
write(s, buffer, strlen(buffer) + 1);
}
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#define PROT 8888
void process_conn_client(int s)
{
ssize_t size = 0;
char buffer[1024];
for(;;)
{
size = read(0, buffer, 1024);
if(size > 0)
{
write(s, buffer, size);
size = read(s, buffer, 1024);
write(1, buffer, size);
}
}
}
int main(int argc,int **argv)
{
int s;
struct sockaddr_in server_addr;
s = socket(AF_INET, SOCK_STREAM, 0);
if(s < 0)
{
printf("socket error");
return -1;
}
//设置服务器的地址
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(PROT);
inet_pton(AF_INET, argv[1], &server_addr.sin_addr);
connect(s, (struct sockaddr*)&server_addr, sizeof(struct sockaddr));
process_conn_client(s);
close(s);
return 0;
}
感想
其实linux有很多的sock的程序的例子
mpc mpd
浏览器 服务器
一时间想不起来了
好像蓝牙也是......
signal 信号注册处理函数
//挂接信号
void sig_pipe(int sign)
{
printf("Catch a SIGPIPE signal\n");
}
signal(SIGPIPE, sig_pipe);//这个 放在main 里面,我去看着这个像是 放在文件最底下的方式,发现一直没成功,哭... ...
Linux 网络编程 简单 TCP连接sock连接的例子的更多相关文章
- 【Linux网络编程】TCP网络编程中connect()、listen()和accept()三者之间的关系
[Linux网络编程]TCP网络编程中connect().listen()和accept()三者之间的关系 基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下: conn ...
- Linux网络编程简单示例
linux 网络编程是通过socket(套接字)接口实现,Socket是一种文件描述符,socket起源于UNIX,在Unix一切皆文件哲学的思想下,socket是一种"打开—读/写—关闭& ...
- 网络编程中 TCP 半开连接和TIME_WAIT 学习
https://blog.csdn.net/chrisnotfound/article/details/80112736 上面的链接就是说明来 SO_KEEPALIVE 选项 为什么还需要 在应用层开 ...
- 【Linux 网络编程】TCP网络编程中connect()、listen()和accept()三者之间的关系
基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下: connect()函数:对于客户端的 connect() 函数,该函数的功能为客户端主动连接服务器,建立连接是通过三 ...
- linux网络编程笔记——TCP
1.TCP和UDP TCP是长连接像持续的打电话,UDP是短消息更像是发短信.TCP需要消耗相对较多的资源,但是传输质量有保障,UDP本身是不会考虑传输质量的问题. 2.网络传输内容 我习惯的做法是直 ...
- Linux网络编程(简单的时间获取服务器)
1.一个简单的服务器时间获取程序 服务器和客户端采用UDP通信的方式,来编写一个简单的时间获取应用. 把过程大致理顺一下,首先是服务器端的编写,使用的是迭代的方式,没有并发 先创建一个socket而后 ...
- Linux网络编程系列-TCP传输控制
滑动窗口(sliding window) 滑动窗口是用于流量控制的,发送端根据接收端的处理能力发送数据,不至于造成过多的丢包. 是发送方和接收方间的协调,对方的接收窗口大小就是自己的发送窗口大小. 在 ...
- linux网络编程系列-TCP/IP模型
### OSI:open system interconnection ### 开放系统互联网模型是由ISO国际标准化组织定义的网络分层模型,共七层 1. 物理层:物理定义了所有电子及物理设备的规范, ...
- 【Linux 网络编程】TCP/IP四层模型
应用层.传输层.网络层.链路层 链路层:常用协议 ARP(将物理地址转化为IP地址) RARP(将IP地址转换为物理地址) 网络层(IP层):重要协议ICMP IP IGMP 传输层:重要的协议TCP ...
- Linux 网络编程(TCP)
客户端代码 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/sock ...
随机推荐
- AutoFac(三)——装配扫描(批量注册之扫描类型)
一.装配扫描 Autofac允许通过常规组装的方式去注册组件(构造方法.实例.lambda表达式等),您可以扫描和注册单个类型,也可以具体的扫描Autofac模块去注册. 1.扫描类型 除了已知的的常 ...
- 俩天完美复刻DeepWiki,并且免费开源!
俩天完美复刻DeepWiki,并且免费开源! 大家好!今天非常高兴为大家介绍KoalaWiki项目 - 这是我们团队花费两天时间完美复刻一个免费开源的AI驱动代码知识库系统,可以说是DeepWiki的 ...
- 进程的退出--exit()与_exit()的区别
进程终止:①异常终止:②正常终止 异常终止:①进程收到某种信号: ②调用abort()函数:[堕胎] 正常终止:①main()函数返回 ②调用exit()函数 三.调用_exit()函数或_Exit( ...
- 重载(Overloading)与重写(Override)的区别?
重载(Overloading)与重写(Override)的区别? No. 区别 重载 重写 1 英文单词 Overloading Override 2 发生范围 发生在一个类里面 发生在继承关系中 3 ...
- STL vector容器存储键值对
在阅读tvm源码时,发现了一个挺有意思的代码: std::vector<std::pair<std::string, ObjectRef>> update; vector容器里 ...
- 操作系统:虚拟机内核--KVM是什么
随着云计算.大数据和分布式技术的演进,我们需要在一台服务器上虚拟化出更多虚拟机,还要让这些虚拟机能够弹性伸缩,实现跨主机的迁移. 而虚拟化技术正是这些能力的基石. 亚马逊.阿里.腾讯等知名公司用到的云 ...
- codeup之字符串求最大值
Description 从键盘上输入3个字符串,求出其中最大者. Input 输入3行,每行均为一个字符串. Output 一行,输入三个字符串中最大者. Sample Input Copy Engl ...
- odoo14使用的文件服务器【NFS】
linux系统之间要文件共享实现方式:目前测试系统为Ubuntu20.04LTS 条件:1.保证两个系统都是linux: 2.目前实现是同一个局域网内: 服务端:172.26.1 ...
- MYSQL优化学习总结
mysql学习小结---索引的使用及优化 1. 索引那些事 1.1 复合索引 复合索引是指:包含一个或者多个列的索引.但复合索引的触发是有条件的. 假设我们现在有一个复合索引a,a中包含了三个列(id ...
- 性能提升30%!袋鼠云数栈基于 Apache Hudi 的性能优化实战解析
Apache Hudi 是一款开源的数据湖解决方案,它能够帮助企业更好地管理和分析海量数据,支持高效的数据更新和查询.并提供多种数据压缩和存储格式以及索引功能,从而为企业数据仓库实践提供更加灵活和高效 ...