Linux Socket编程之旅(linuxsoket)
Linux Socket编程之旅
随着计算机技术的发展,Linux Socket编程已经成为构建可靠网络程序的核心技术。 Socket就像一个虚拟专用电话线, 用以在不同的程序之间传输或共享数据。 通过Socket, 我们可以建立一个网络中的客户端/服务端程序, 其中客户端请求服务, 服务端返回响应。
Socket详细细分成几种, 如TCP/IP Socket、 Unix-domain Socket等等。 TCP/IP Socket是基于网络的, 我们可以在Linux中使用它来与远程客户端或服务端通信, Unix-domain Socket仅限在本机内使用。
要开始Linux Socket编程, 首先需要引入socket、sys/socket.h、netinet/in.h和arpa/inet.h这几个头文件, 并定义Socket函数数据类型用于控制socket的行为, 这些在后文中都将提到。
接下来分别编译client端和server端的代码, client端需要创建socket, 用于接收服务。 对于server端, 首先它需要绑定ip和端口(bind()函数), 然后监听客户端的连接(listen()函数), 当收到客户端的连接时, 就可以建立连接(accept()函数)、 并与客户端进行沟通(send()/ recv() 函数)。
下面以一个TCP Socket 客户端/服务器程序为例:
Client端:
#include
#include
#include
#include
#include
int main(int argc, char* argv[])
{
int sock_fd;// client 端socket 句柄
// 1. 创建一个socket,使用socket()函数
if((sock_fd = socket(AF_INET, SOCK_STREAM, 0))== -1)
{
printf( create socket failed! );
exit(1);
}
printf( Socket created!\n );
// 2. 连接服务器
struct sockaddr_in serv_addr;
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(12345);
serv_addr.sin_addr.s_addr = inet_addr( 127.0.0.1 );
if (connect(sock_fd, (struct sockaddr*) serv_addr, sizeof(serv_addr)) == -1)
{
printf( connect socket failed! );
exit(1);
}
printf( Connected to server!\n );
// 3. 向服务器发数据
const char* buf = Hello World!
send(sock_fd, buf, strlen(buf), 0);
// 4. 接收服务器回应
char recv_buf[1024];
memset(recv_buf, 0, sizeof(recv_buf));
if (recv(sock_fd, recv_buf, 1024, 0) == -1)
{
printf( recv failed! );
exit(1);
}
printf( Received:%s\n , recv_buf);
// 5. 关闭socket
close(sock_fd);
return 0;
}
Server端:
#include
#include
#include
#include
#include
int main(int argc, char* argv[])
{
int sock_fd, client_fd;
// 1. 创建socket
if((sock_fd = socket(AF_INET, SOCK_STREAM, 0))== -1)
{
printf( create socket failed! );
exit(1);
}
printf( Socket created!\n );
// 2. socket 绑定ip和端口
struct sockaddr_in serv_addr;
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(12345);
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind (sock_fd, (struct sockaddr*) serv_addr, sizeof(serv_addr)) == -1)
{
printf( bind failed! );
exit(1);
}
printf( Bind Success!\n );
// 3. 监听客户端
if (listen(sock_fd, 10) == -1)
{
printf( listen failed! );
exit(1);
}
printf( Listening \n );
client_fd = accept(sock_fd, (struct sockaddr *)NULL, NULL);
printf( Connected from client!\n );
// 4. 接收数据
char recv_buf[1024];
memset(recv_buf, 0, sizeof(recv_buf));
if (recv(client_fd, recv_buf, 1024, 0) == -1)
{
printf( recv failed! );
exit(1);
}
printf( Received:%s\n ,recv_buf);
// 5. 返回回应
const char* buf = Thank you!
send(client_fd, buf, strlen(buf), 0);
// 6. 关闭套接字描述符
close(sock_fd);
close(client_fd);
return 0;
}
上面这个例子中, 两个程序之间的通信过程已经在上面的注释中体现了, 具体的细节由发送、 接收等函数实现。 如此我们在
我想要获取技术服务或软件
服务范围:MySQL、ORACLE、SQLSERVER、MongoDB、PostgreSQL 、程序问题
服务方式:远程服务、电话支持、现场服务,沟通指定方式服务
技术标签:数据恢复、安装配置、数据迁移、集群容灾、异常处理、其它问题
本站部分文章参考或来源于网络,如有侵权请联系站长。
数据库远程运维 Linux Socket编程之旅(linuxsoket)
相关文章
- Linux下的图片编辑之旅(linux图片编辑)
- Linux环境中 后台与前台对比之旅(linux后台前台)
- 庞丽静的Linux之旅(庞丽静linux)
- 实现自由:Linux 启动代码之旅(linux启动代码)
- 提升Linux磁盘性能的有效方法(linux磁盘性能)
- Linux网络编程之:构建强大的网络框架(linux网络框架)
- Linux 硬件虚拟化:开启新科技时代(linux硬件虚拟机)
- 探索Linux媒体服务器的可能性(linux媒体服务器)
- 极具挑战的Linux系统编程之旅(linux系统编码)
- Linux的分支:开启多样的体验之旅(linux的分支)
- 开源Linux的开源之旅:分支的精彩世界(linux的分支)
- 版本Linux的分支版本:探索不同的编程之旅(linux的分支)
- Linux下关闭防火墙的步骤(关闭linux的防火墙)
- 系统开源之旅:探索Linux分支系统(linux的分支)
- Linux发展史:各大分支简介(linux的分支)
- 技术讲座2015马哥Linux开源之旅(2015马哥linux)
- 服务快速部署Linux服务器,轻松架设Web服务(linux部署web)
- C语言网络编程在Linux下的应用(c网络编程linux)
- 如何利用阿里Linux系统优化企业运营?(阿里linux系统)
- Linux脚本入门:从零开始学习简单易懂的脚本编程(linux脚本入门)
- 学会Linux编程技巧:程序设计入门指南(linux怎么写程序)
- 轻松掌握 Linux:手机版命令手册(linux命令手机版)
- Linux下安装显卡驱动的简单操作(linux装显卡驱动)
- 如何使用命令行关闭Linux操作系统(命令行关闭linux)
- 局域网 DNS 服务器搭建及 Linux 系统实现(局域网dns linux)