c++ linux socket编程 c++网络编程
声明:大部分代码来自这篇博客http://www.cnblogs.com/diligenceday/p/6241021.html, 感谢博主
思路:
思路很重要呦~~~
socket详细信息,思路:http://www.cnblogs.com/renfanzi/p/5713054.html
基础知识
一个简单的socket服务端和客户端
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <string>
#include <typeinfo> #define PORT 7000
#define QUEUE 20
int conn; using namespace std; int main() {
//实例化socket对象:
// AF_INET为地址簇,默认IPV4;
// SOCK_STREAM为类型,默认为tcp
// 0为协议,默认自动选择合适协议
int ss = socket(AF_INET, SOCK_STREAM, );
// 创建一个struct
struct sockaddr_in server_sockaddr;
//结构体加入参数:端口和地址
server_sockaddr.sin_family = AF_INET;
server_sockaddr.sin_port = htons(PORT);
server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);
//bind()
if (bind(ss, (struct sockaddr *) &server_sockaddr, sizeof(server_sockaddr)) == -) {
perror("bind");
exit();
}
//listen()
if (listen(ss, QUEUE) == -) {
perror("listen");
exit();
} struct sockaddr_in client_addr;
socklen_t length = sizeof(client_addr); //accept()
//成功返回非负描述字,出错返回-1
conn = accept(ss, (struct sockaddr *) &client_addr, &length); if (conn < ) {
perror("connect");
exit();
} char buffer[];
while () {
memset(buffer, , sizeof(buffer)); //read()
int len = recv(conn, buffer, sizeof(buffer), );
if (strcmp(buffer, "exit\n") == ) break;
printf("buffer: %s", buffer);
//send()
//必须要有返回数据, 这样才算一个完整的请求
send(conn, buffer, len, );
}
close(conn);
close(ss);
return ;
}
simple server
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/shm.h> #define MYPORT 7000
#define BUFFER_SIZE 1024 int main() {
///定义sockfd
int sock_cli = socket(AF_INET, SOCK_STREAM, ); ///定义sockaddr_in
struct sockaddr_in servaddr;
memset(&servaddr, , sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(MYPORT); ///服务器端口
servaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); ///服务器ip //连接服务器,成功返回0,错误返回-1
if (connect(sock_cli, (struct sockaddr *) &servaddr, sizeof(servaddr)) < ) {
perror("connect");
exit();
} char sendbuf[BUFFER_SIZE];
char recvbuf[BUFFER_SIZE];
while (fgets(sendbuf, sizeof(sendbuf), stdin) != NULL) {
send(sock_cli, sendbuf, strlen(sendbuf), ); ///发送
if (strcmp(sendbuf, "exit\n") == )
break;
recv(sock_cli, recvbuf, sizeof(recvbuf), ); ///接收
fputs(recvbuf, stdout); memset(sendbuf, , sizeof(sendbuf));
memset(recvbuf, , sizeof(recvbuf));
} close(sock_cli);
return ;
}
simple client
还没写完呢,下一步,1对多,多线程,异步,开源库,框架,等等...
c++ linux socket编程 c++网络编程的更多相关文章
- Linux下高并发网络编程
Linux下高并发网络编程 1.修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时, 最高的并发数量都要受到系统对用户单一进程同时可打 ...
- (50)LINUX应用编程和网络编程之五 Linux信号(进程间通信)
信号实现进程间的通信 3.5.1.什么是信号 ...
- 如何使用socket进行java网络编程(二)
通过在如何使用socket进行java网络编程(一)中程序的编写,可以总结出一些常用的java socket编程的范例来. ServerSocket server = new ServerSocket ...
- (46)LINUX应用编程和网络编程之一Linux应用编程框架
3.1.1.应用编程框架介绍 3.1.1.1.什么是应用编程 (1)整个嵌入式linux核心课程包括5个点,按照学习顺序依次是:裸机.C高级.uboot和系统移植.linux应用编程和网络编程.驱动. ...
- 老师的blog整理 .网络编程部分 .网络编程部分 前端部分 django基础部分
老师的blog整理 .网络编程部分 .网络编程部分 前端部分 django基础部分 老师的blog整理 python基础部分: 宝哥blog: https://www.cnblogs.com/gu ...
- Linux IO模型和网络编程模型
术语概念描述: IO有内存IO.网络IO和磁盘IO三种,通常我们说的IO指的是后两者. 阻塞和非阻塞,是函数/方法的实现方式,即在数据就绪之前是立刻返回还是等待. 以文件IO为例,一个IO读过程是文件 ...
- linux服务端的网络编程
常见的Linux服务端的开发模型有多进程.多线程和IO复用,即select.poll和epoll三种方式,其中现在广泛使用的IO模型主要epoll,关于该模型的性能相较于select和poll要好不少 ...
- linux服务器开发三(网络编程)
网络基础 协议的概念 什么是协议 从应用的角度出发,协议可理解为"规则",是数据传输和数据的解释的规则. 假设,A.B双方欲传输文件.规定: 第一次,传输文件名,接收方接收到文件名 ...
- UNIX网络编程——揭开网络编程常见API的面纱【下】
Linux网络编程数据收发的API流程分析 只要把数据在协议栈中的流动线路和脉络弄清楚了,关于协议栈的实现部分,理解起来就轻松多了.在网络编程章节的数据接收过程中,我们主要介绍过read ...
- UNIX网络编程——揭开网络编程常见API的面纱【上】
Linux网络编程API函数初步剖析 今天我们来分析一下前几篇博文中提到的网络编程中几个核心的API,探究一下当我们调用每个API时,内核中具体做了哪些准备和初始化工作. 1.socket(famil ...
随机推荐
- dns安全可视化 设计
这么设计 dns 常见的 安全分类.显示出来. dns 的安全数据,显示出来. 各种相关数据. 展示方式, 图标,饼图,柱状图等等,多屏拼接. 前端的可视化展示 方式 由 文慧 提供 或者实现. 相关 ...
- SPOJ.Visible Lattice Points(莫比乌斯反演)
题目链接 /* http://www.spoj.com/problems/VLATTICE/ 题意:求一个n*n*n的晶体,有多少点可以在(0,0,0)处可以直接看到. 同BZOJ.2301 题目即要 ...
- 潭州课堂25班:Ph201805201 爬虫基础 第四课 Requests (课堂笔记)
优雅到骨子里的Requests 1528811134432 简介 上一篇文章介绍了Python的网络请求库urllib和urllib3的使用方法,那么,作为同样是网络请求库的Request ...
- eclipse中出现的一些错误
selection dose not contain a main type解决办法:main忘记加static
- CocosCreator小栗子
主要是了解了场景切换的API,见下: 开始场景和结束场景内,按钮挂相同的Btn脚本,主要是切换到场景2中: Btn脚本如下, onLoad:function() { this.node.on('mou ...
- 转载一篇关于toString和valueOf
可以这样说,所有JS数据类型都拥有valueOf和toString这两个方法,null除外.它们俩解决javascript值运算与显示的问题.在程序应用非常广泛.下面我们逐一来给大家介绍下. Java ...
- linux目录的权限
Answer: When applying permissions to directories on Linux, the permission bits have different meanin ...
- WordPress主题开发:通过page的ID或者别名获取内容
访问地址:xx/?page_id=12 如果是在当前页面,只需要通过循环就可以输出对应的信息 <?php if(have_posts()):while(have_posts()):the_pos ...
- html5中页面拨打电话的方式
<a href="tel:18688888888">拨号</a> <a href="sms:18688888888">发短信 ...
- 小程序canvas的一个坑
很奇怪,原来好好的,结果现在显示乱了,模拟器和手机都不一样.模拟器上,整个canvas都往右偏移了,手机上,右侧有一大片空白. 反复试验,发现问题是:page的对齐方式是center引起的,改为lef ...