随手写了一个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),实际上我们在电脑上开启了服务器 ...
随机推荐
- EditText 默认不获取焦点,弹出软键盘布局变形解决方案
关于弹出软键盘布局变形解决方案: 在androidMainfest.xml文件中在此Activity中写入 android:windowSoftInputMode="adjustPan&qu ...
- php将xml文件转化为数组:simplexml_load_string
<?php $str = <<<XML <?xml version="1.0" encoding="ISO-8859-1"?> ...
- 50行实现简易HTTP服务器
话说由于一直很懒,所以博客好像也没怎么更新...今天有空就写一下吧. 最近在看node.js的时候开始对http协议感兴趣了,毕竟node一开始就是为了做web服务器而产生的.于是试着想了一下大概的思 ...
- 3D空间坐标系转换复习
模型坐标系:ModelSpace 即模型本身为中心 模型本身自己 世界坐标系:WorldSpace 世界坐标系 整个世界 视角坐标系: ViewSpace 眼睛看到的范 ...
- MVC3 分页Helper
利用mvc3实现分页效果.效果图如下: 直接拷代码: 首页添加一个Helper的类(命名空间为System.Web.Mvc;). public static HtmlString ShowPageNa ...
- php命名空间使用
对于命名空间,官方文档已经说得很详细[查看],我在这里做了一下实践和总结. 命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误.这种情况下只 ...
- PostgreSQL的存储系统二:REDOLOG文件存储结构二
REDOLOG文件里的用户数据和数据文件里的用户数据存储结构相同 几个月前同事给台湾一家公司培训<pg9 ad admin>时,有个学员提及WAL里记录的内容为Query时的SQL语句(比 ...
- hibernate中文查询时无查询结果
原因很简单,问题在于我连接mysql用的url时,没有指定字符集,导致查询不到任何数据 问题出在 hibernate.xml配置文件中: 将 <property name="jdbcU ...
- Brew install for mac
安装命令例如以下: curl -LsSf http://github.com/mxcl/homebrew/tarball/master | sudo tar xvz -C/usr/local --st ...
- 【DateStructure】 Charnming usages of Map collection in Java
When learning the usage of map collection in java, I found serveral beneficial methods that was enco ...