随手写了一个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;
}
最新文章
- MySQL Error Handling in Stored Procedures 2
- Position a child div relative to parent container in CSS: [设置 子DIV位置 跟 父DIV相关联]
- 送给大家一个安卓版的easyradius短信提示客户端
- 时间复杂度&;空间复杂度
- javascript组件开发之基类继承实现
- sql2008“备份集中的数据库备份与现有数据库不同”解决方法
- Apache配置虚拟目录和多主机头
- BlockingQueue汇总
- ServiceModel Metadata Utility Tool (Svcutil.exe)
- python【第九篇】多线程、多进程
- FFMPEG 视频旋转设置
- 异步陷阱之IO
- ●洛谷P2934 [USACO09JAN]安全出行Safe Travel
- ORM框架--GreenDao 3.0基本使用指南
- Windows的Shell命令又是Windows的CMD命令。也就是原来MS-DOS系统保留下来。基本的CMD命令
- spark2.1源码分析4:spark-network-common模块的设计原理
- 在mpvue中使用map如何避坑
- Python网络爬虫第三弹《爬取get请求的页面数据》
- 自定义alert弹框,title不显示域名
- ssh tunnel