随手写了一个linux服务端与window客户端的epoll程序,当做练习把。
linux服务端:监听链接,处理消息
#include <sys/socket.h>    
 #include <sys/epoll.h>    
 #include <netinet/in.h>    
 #include <arpa/inet.h>    
 #include <fcntl.h>    
 #include <unistd.h>    
 #include <stdio.h>    
 #include <errno.h>
#define MAX_EVENTS 500
int main()
 {
 int epfd = -1;
 int listensocket;
 struct sockaddr_in serveraddr;
 char buf[MAX_EVENTS][100] = {0};
int nCount = 0;
struct epoll_event ev, evs[MAX_EVENTS];
listensocket = socket(AF_INET, SOCK_STREAM, 0);
 if (-1 == listensocket)
 {
 perror("socket fail\n");
 return -1;
 }
printf("listensocket:0x%x\n", listensocket);
memset(&serveraddr, 0, sizeof(serveraddr));
 serveraddr.sin_family = AF_INET;
 serveraddr.sin_addr.s_addr = INADDR_ANY;
 serveraddr.sin_port = htons(7778);
int bReuse = 1;
 if (-1 == setsockopt(listensocket, SOL_SOCKET, SO_REUSEADDR, (char*)&bReuse, sizeof(bReuse)))
 {
 perror("setsockopt fail\n");
 return -1;
 }
if (-1 == bind(listensocket, (struct sockaddr *)&serveraddr, sizeof(serveraddr)))
 {
 perror("bind fail\n");
 return -1;
 }
if (-1 == listen(listensocket, 3))
 {
 perror("listen fail\n");
 return -1;
 }
epfd = epoll_create(MAX_EVENTS);
 if (-1 == epfd)
 {
 perror("epoll_create fail\n");
 return -1;
 }
printf("epfd:0x%x\n", epfd);
ev.events = EPOLLIN;
 ev.data.fd = listensocket;
     if (-1 == epoll_ctl(epfd, EPOLL_CTL_ADD, listensocket, &ev))
 {
 perror("epoll_create fail\n");
 return -1;
 }
while (1)
 {
 int i = 0;
 struct sockaddr_in peeraddr;
 int addrlen = sizeof(peeraddr);
 int fd;
 int rcvnum = 0;
 int r = 9;
memset(&peeraddr, 0, sizeof(peeraddr));
//printf("waiting...\n");
 nCount = epoll_wait(epfd, evs, MAX_EVENTS, -1);
 if (0 > nCount)
 {
 perror("epoll_create fail\n");
 continue;
 }
for(i = 0; i < nCount; i++)
 {
 if (evs[i].data.fd == listensocket)
 {
 fd = accept(listensocket, (struct sockaddr *)&peeraddr, &addrlen);
 printf("peeraddr %s:%d\n", inet_ntoa(peeraddr.sin_addr), ntohs(peeraddr.sin_port));
ev.events = EPOLLIN;
 ev.data.fd = fd;
 if (-1 == epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &ev))
 {
 perror("epoll_ctl listen fail\n");
 return -1;
 }
 }
 else
 {
 rcvnum = recv(evs[i].data.fd, buf[i], 100, 0);
 if (0 == rcvnum)
 {
 close(evs[i].data.fd);
 continue;
 }
 buf[i][99] = 0;
 printf("recv:%s\n", buf);
 memset(buf[i], 0, 100);
 }
 }
 }
return 0;
 }
window客户端:主要发送消息至liunx服务端:
#include <stdio.h>   
 #include <winsock2.h> 
  
 int main(int argc, char **arg)
 {
 SOCKET fd;
 struct sockaddr_in serveraddr;
 int nCount = 0;
 int ret;
WSADATA wsaData;
     short version = MAKEWORD(2,2);
 WSAStartup(version,&wsaData);//初始化socket
if (argc != 2)
 {
 printf("param fail\n");
 return -1;
 }
fd = socket(AF_INET, SOCK_STREAM, 0);
 if (-1 == fd)
 {
 perror("socket fail\n");
 return -1;
 }
printf("fd:0x%x\n", fd);
memset(&serveraddr, 0, sizeof(serveraddr));
 serveraddr.sin_family = AF_INET;
 serveraddr.sin_addr.s_addr = inet_addr("172.16.192.92");
 serveraddr.sin_port = htons(7778);
if (-1 == connect(fd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)))
 {
 printf("connect fail\n");
 return -1;
 }
while (1)
 {
 ret = send(fd, arg[1], strlen(arg[1]), 0);
 printf("send:%d ret:%d\n", strlen(arg[1]), ret);
 if (ret < 0)
 {
 closesocket(fd);
 break;
 }
 Sleep(1000);
 }
return 0;
 }
随手写了一个linux服务端与window客户端的epoll程序,当做练习把。的更多相关文章
- MQTT协议学习及实践(Linux服务端,Android客户端的例子)
		前言 MQTT(Message Queuing Telemetry Transport),是一个物联网传输协议,它被设计用于轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提 ... 
- 成功使Linux服务端和Windows客户端建立socket通信
		一.准备工作 1.一台装有虚拟机的Windows7操作系统,虚拟机中装的是CentOS6.5版本的Linux 2.Windows7已经装有java环境 二.编码 使用java编写socket通信的服务 ... 
- 使用rsync在linux(服务端)与windows(客户端)之间同步
		说明: 1.RsyncServer服务端 系统:CentOS 6.8 IP地址:192.168.247.141 2.Rsync客户端 系统:Windows10 实现目的: Rsync客户端同步服务端/ ... 
- wsgiref手写一个web服务端
		''' 通过wsgiref写一个web服务端先讲讲wsgiref吧,基于网络通信其根本就是基于socket,所以wsgiref同样也是通过对socket进行封装,避免写过多的代码,将一系列的操作封装成 ... 
- 写一个基于TCP协议套接字,服务端实现接收客户端的连接并发
		''' 写一个基于TCP协议套接字,服务端实现接收客户端的连接并发 ''' client import socket import time client = socket.socket() clie ... 
- linux服务端的网络编程
		常见的Linux服务端的开发模型有多进程.多线程和IO复用,即select.poll和epoll三种方式,其中现在广泛使用的IO模型主要epoll,关于该模型的性能相较于select和poll要好不少 ... 
- 『集群』003 Slithice 最简分布式(多个客户端,一个独立服务端)
		Slithice 最简分布式(多个客户端,一个独立服务端) 案例Demo 展示: 我们搭建一个 可以 独立运行 的 服务端:然后 多个客户端 并发链接 这个 服务端 完成 分布式逻辑: 服务器 独立运 ... 
- 适合新手:从零开发一个IM服务端(基于Netty,有完整源码)
		本文由“yuanrw”分享,博客:juejin.im/user/5cefab8451882510eb758606,收录时内容有改动和修订. 0.引言 站长提示:本文适合IM新手阅读,但最好有一定的网络 ... 
- 手写内网穿透服务端客户端(NAT穿透)原理及实现
		Hello,I'm Shendi. 这天心血来潮,决定做一个内网穿透的软件. 用过花生壳等软件的就知道内网穿透是个啥,干嘛用的了. 我们如果有服务器(比如tomcat),实际上我们在电脑上开启了服务器 ... 
随机推荐
- npm 安装参数中的-save和 -save-dev
			当你为你的模块安装一个依赖模块时,正常情况下你得先安装他们(在模块根目录下npm install module-name),然后连同版本号手动将他们添加到模块配置文件package.json中的依赖里 ... 
- LeakCanary,检测安卓,java内存泄漏
			官方中文API地址:http://www.liaohuqiu.net/cn/posts/leak-canary-read-me/ 
- Android  数据库ORM框架GreenDao学习心得及使用总结<二>
			转:http://blog.csdn.net/xushuaic/article/details/24496191 第五篇 查询 查询会返回符合某些特定标准的实体.你可以使用原始的SQL定制查询语句,或 ... 
- view里文书删除时报错的解决案
- smtp cmd 测试 smtp发送邮件 cmd发送邮件
			无账户MAIL FROM:<test@rmvbdy.com>RCPT TO:2850965781@qq.comDATASubject: test messagetest body . 有账 ... 
- Oracle EBS-SQL (BOM-3):检查期间新增Bom数量.sql
			--本周系统BOM汇总记录 SELECT ITM.SEGMENT1 物料编码, ITM.DESCRIPTION 物料描述, bom2.CREATION_DATE 创建日期, ... 
- jquery easyui combobox学习
			今天尝试了一下jquery easy ui的combobox,感觉蛮好用的,直接上代码吧 HTML如下 <div> <input id="btnBind" typ ... 
- Ubuntu下,在Eclipse中使用JNI调用ffmpeg
			Android的应用层开发大部分还是采用JAVA,如果想使用ffmpeg库,就必须利用JNI,使得Java可以调用C/C++的库. JNI其实就是定义的一个转接接口,可以让Java的代码调用C/C++ ... 
- javaScript 工作必知(六) delete in instanceof
			in in 判断 左边 的字符串或者能转换成字符串的是否属于 右边 的属性. var data = { x: 1, y: 4 };//定义了直接对象 alert("x" in d ... 
- JavaScript之面向对象学习八(继承)
			简介:继承是OO语言中的一个最为人津津乐道的概念.许多OO语言都支持两种继承方式:接口继承和实现继承.接口继承只继承方法签名,而实现继承则继承实际的方法. 但是JS的函数并没有签名,所以在ECMASc ... 
