select是易语言服务端与客户端还是客户端

&>&&>&&>&&>&一个基于select事件分离器的tcp服务端和客户端实例(附详细注释)
一个基于select事件分离器的tcp服务端和客户端实例(附详细注释)
上传大小:3KB
实现了一个基于select事件分离器的tcp client模型,完成从服务端回显到客户端的demo,并附有详细注释和make,于初学tcp socket的同学大有帮助。
综合评分:4.4(5位用户评分)
所需积分:2
下载次数:20
审核通过送C币
创建者:gaobaoqiang1983
创建者:john548
课程推荐相关知识库
上传者其他资源上传者专辑
网络技术热门标签
VIP会员动态
android服务器底层网络模块的设计方法
所需积分:0
剩余积分:720
您当前C币:0
可兑换下载积分:0
兑换下载分:
兑换失败,您当前C币不够,请先充值C币
消耗C币:0
你当前的下载分为234。
一个基于select事件分离器的tcp服务端和客户端实例(附详细注释)
会员到期时间:
剩余下载次数:
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可奖励20下载分
被举报人:
chengshuming1983
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:异步socket中,select模型的客户端连接connect()服务器,如何判断是否连接成功?给个代码
回复讨论(解决方案)
哪种异步?
消息?有消息产生
SELECT?会阻塞自动跳出
connect之后,会立马返回。然后要把返回的socket句柄放到FD_SET中,注册连接建立事件,然后调用select()检查是否事件发生,或者超时。看看MSDN啊,说得很详细。
connect之后,会立马返回。然后要把返回的socket句柄放到FD_SET中,注册连接建立事件,然后调用select()检查是否事件发生,或者超时。看看MSDN啊,说得很详细。
注册连接建立事件
---------------------------------
select模型中,哪有事件的概念?
//////////////////////////////////////////////////////
//&select.cpp文件
#include&&../common/initsock.h&
#include&&stdio.h&
CInitSock&theS
//&初始化Winsock库
int&main()
USHORT&nPort&=&4567; //&此服务器监听的端口号
//&创建监听套节字
SOCKET&sListen&=&::socket(AF_INET,&SOCK_STREAM,&IPPROTO_TCP);
sockaddr_in&
sin.sin_family&=&AF_INET;
sin.sin_port&=&htons(nPort);
sin.sin_addr.S_un.S_addr&=&INADDR_ANY;
//&绑定套节字到本地机器
if(::bind(sListen,&(sockaddr*)&sin,&sizeof(sin))&==&SOCKET_ERROR)
printf(&&Failed&bind()&\n&);
return&-1;
//&进入监听模式
::listen(sListen,&5);
//&select模型处理过程
//&1)初始化一个套节字集合fdSocket,添加监听套节字句柄到这个集合
fd_set&fdS
//&所有可用套节字集合
FD_ZERO(&fdSocket);
FD_SET(sListen,&&fdSocket);
while(TRUE)
//&2)将fdSocket集合的一个拷贝fdRead传递给select函数,
//&当有事件发生时,select函数移除fdRead集合中没有未决I/O操作的套节字句柄,然后返回。
fd_set&fdRead&=&fdS
int&nRet&=&::select(0,&&fdRead,&NULL,&NULL,&NULL);
if(nRet&&&0)
//&3)通过将原来fdSocket集合与select处理过的fdRead集合比较,
//&确定都有哪些套节字有未决I/O,并进一步处理这些I/O。
for(int&i=0;&i&(int)fdSocket.fd_&i++)
if(FD_ISSET(fdSocket.fd_array[i],&&fdRead))
if(fdSocket.fd_array[i]&==&sListen)
//&(1)监听套节字接收到新连接
if(fdSocket.fd_count&&&FD_SETSIZE)
sockaddr_in&addrR
int&nAddrLen&=&sizeof(addrRemote);
SOCKET&sNew&=&::accept(sListen,&(SOCKADDR*)&addrRemote,&&nAddrLen);
FD_SET(sNew,&&fdSocket);
printf(&接收到连接(%s)\n&,&::inet_ntoa(addrRemote.sin_addr));
printf(&&Too&much&connections!&\n&);
char&szText[256];
int&nRecv&=&::recv(fdSocket.fd_array[i],&szText,&strlen(szText),&0);
if(nRecv&&&0)
//&(2)可读
szText[nRecv]&=&'\0';
printf(&接收到数据:%s&\n&,&szText);
//&(3)连接关闭、重启或者中断
::closesocket(fdSocket.fd_array[i]);
FD_CLR(fdSocket.fd_array[i],&&fdSocket);
printf(&&Failed&select()&\n&);
楼上的代码是服务器端的,有没有客户端的代码呀?
我要知道客户端的连接成功与否
我用的同步SOCKET&但是在连接的时候转换为异步进行的&&
具体流程:&
1.将打开的socket设为非阻塞的.&
2.发connect调用,这时返回-1,但是errno被设为EINPROGRESS,意即connect仍旧在进行还没有完成.&
3.将打开的socket设进被监视的可写(注意不是可读)文件集合用select进行监视,&如果可写,用&
getsockopt(socket,&SOL_SOCKET,&SO_ERROR,&&error,&sizeof(int));
来得到error的值,如果为零,则connect成功.&
4.将socket置为非阻塞的(看你自己的应用,我用的是非阻塞的所以转换回来了)
SOCKADDR_IN&&sockaddr_
FD_SET&&WriteS
to.tv_sec&=&5;&&&//设置超时值
to.tv_usec&=&0;
int&&&len&=&sizeof(char);
BOOL&&ret&=&FALSE;
int&&&iConnNum&=&3;&//重复连接次数
if(!CreateNetSocket())
return&FALSE;
sockaddr_in.sin_family&=&AF_INET;
sockaddr_in.sin_port&=&htons(5150);&&&
sockaddr_in.sin_addr.S_un.S_addr&=&inet_addr(192.168.0.100);&//IP地址随便写了一个
unsigned&long&ul&=&1;
iError&=&ioctlsocket(m_tcpSock,&FIONBIO,&(unsigned&long*)&ul);
if(iError&==&SOCKET_ERROR)
TRACE(&ioctlsocket()&failed&with&error&%d\r\n&,WSAGetLastError());
ReleaseNetSocket();
return&FALSE;
while(iConnNum&&&0)&&//重复连接3次
if(connect(m_tcpSock,(LPSOCKADDR)&sockaddr_in,sizeof(sockaddr_in))&!=&0)
FD_ZERO(&WriteSet);
FD_SET(m_tcpSock,&WriteSet);
if(select(0,NULL,&WriteSet,NULL,&to)&&&0)&
getsockopt(m_tcpSock,&SOL_SOCKET,&SO_ERROR,&&error,&&len);&
if(error&==&0)&
{//已建立连接,可进行其他操作
ret&=&TRUE;&
ret&=&FALSE;
iError&=&WSAGetLastError();
TRACE(&select()&failed&with&error&%d\r\n&,iError);
ret&=&FALSE;
ret&=&TRUE;
iConnNum--;
iError&=&ioctlsocket(m_tcpSock,&FIONBIO,&(unsigned&long*)&ul);
if(iError&==&SOCKET_ERROR)
TRACE(&ioctlsocket()&failed&with&error&%d\r\n&,WSAGetLastError());
ReleaseNetSocket();
return&FALSE;
AfxMessageBox(&不能连接到设备!\r\n&);
ReleaseNetSocket();
return&FALSE;
呵呵,这么麻烦啊
楼上的代码是服务器端的,有没有客户端的代码呀?
-------------
客户端你就直接连上去后开另外个线程死等recv有数据过来就处理,发送数据用主线程里存放的socket就好了.没必要用什么模型&.
支持搂主,收藏
LRESULT&KPortServer::Run()
#define&BUF_LEN&20
szMsgBuf[BUF_LEN&+&1];
sockaddr_in&addrC
SYSTEMTIME&&sysT
bResult&=&
WSAStartup(MAKEWORD(2,&2),&&wsData);
KServer::Init();
KServer::ResetSocket();
fprintf(stdout,&&Waitting&for&client:\n&);
while&(true)
SOCKET skClient&=&INVALID_SOCKET;
PROCESS_ERROR(INVALID_SOCKET&!=&(skClient&=&StartAccepting()));
addrClient&=&GetClientAddress();
GetLocalTime(&sysTime);
sprintf(szMsgBuf,&&%d\0&,&ntohs(addrClient.sin_port));
send(skClient,&szMsgBuf,&strlen(szMsgBuf),&!MSG_DONTROUTE);
fprintf(stdout,&&%d:%d:%d:%d\tClient&%s&&%d&connected!\n&,&
sysTime.wHour,&sysTime.wMinute,&sysTime.wSecond,&sysTime.wMilliseconds,
inet_ntoa(addrClient.sin_addr),&ntohs(addrClient.sin_port));
printf(&%s:\tSocket&closed!\n&,&::GetSystemTimeAsString());
shutdown(skClient,&SD_RECEIVE);
closesocket(skClient);
WSACleanup();
return&bE;
#undef&BUF_LEN
瞅瞅,学习博客访问: 49459
博文数量: 43
博客积分: 10
博客等级: 民兵
技术积分: 486
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: C/C++
windows iocp, linux epoll貌似已经成为服务器模式主流。但是select还是有用武之地的。
客户端不像服务器一样,不考虑高并发,所以select足够,而且简单,没必要一个客户端还用个boost asio或者ace。
跨平台select网络库可以用在cocos2d-x上,跨windows, android, ios, 当然由于没有测试环境,我写的这个只在windows,linux下编译通过了,ios可能会有些问题。
ps, 我不喜欢把select, iocp, epoll全都封装到一个库上,因为服务端只会用到iocp, epoll, 客户端只用select, 分开反倒更简单,当然对外接口基本相同。
/******************************************/
1, 修改了sockbuf的接口
2, 修改了select之前的fd_set的初始化部分。
未经严格测试。
/******************************************/
updated@, 更新个版本。
阅读(1373) | 评论(1) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
整个问价,集体报错,无从下手,是不是还要配置什么呢?
请登录后评论。2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
本帖子已过去太久远了,不再提供回复功能。5216人阅读
Linux点点滴滴为自己(个人理解)(17)
&span style=&font-size:18&&服务端:
#include &stdio.h&
#include &stdlib.h&
#include &string.h&
#include &sys/time.h&
#include &sys/types.h&
#include &sys/socket.h&
#include &netinet/in.h&
#include &sys/select.h&
#include &errno.h&
#define SERVER_IP &127.0.0.1&
#define SERVER_PORT 8000
#define MAX_RECV_LEN 1024
#define MAX_CLIENT_NUM 30
#define BACK_LOG 20
static int running = 1;
int main(int argc, char *argv[])
int sock_fd = -1;
int ret = -1;
struct sockaddr_in serv_
struct sockaddr_in cli_
socklen_t serv_addr_len = 0;
socklen_t cli_addr_len = 0;
int client_fd[MAX_CLIENT_NUM];
char recv_buf[MAX_RECV_LEN];
int new_conn_fd = -1;
int i = 0;
int max_fd = -1;
int num = -1;
fd_set read_
fd_set write_
fd_set select_read_
FD_ZERO(&read_set);
FD_ZERO(&write_set);
FD_ZERO(&select_read_set);
for (i = 0; i & MAX_CLIENT_NUM; i++)
client_fd[i] = -1;
memset(&serv_addr, 0, sizeof(serv_addr));
memset(&cli_addr, 0, sizeof(cli_addr));
sock_fd = socket(AF_INET, SOCK_STREAM, 0);
if (sock_fd & 0)
perror(&Fail to socket&);
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(SERVER_PORT);
serv_addr.sin_addr.s_addr = inet_addr(SERVER_IP);
unsigned int value = 1;
if (setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR,
(void *)&value, sizeof(value)) & 0)
perror(&Fail to setsockopt&);
serv_addr_len = sizeof(serv_addr);
if (bind(sock_fd, (struct sockaddr*)&serv_addr, serv_addr_len) & 0)
perror(&Fail to bind&);
if (listen(sock_fd, BACK_LOG) & 0)
perror(&Fail to listen&);
char buf[1024];
max_fd = sock_
FD_SET(sock_fd, &read_set);
while (running)
timeout.tv_sec = 5;
timeout.tv_usec = 0;
max_fd = sock_
for (i = 0; i & MAX_CLIENT_NUM; i++)
if (max_fd & client_fd[i])
max_fd = client_fd[i];
select_read_set = read_
ret = select(max_fd + 1, &select_read_set, NULL, NULL, &timeout);
if (ret == 0)
printf(&timeout\n&);
else if (ret & 0)
printf(&error occur\n&);
if (FD_ISSET(sock_fd, &select_read_set))
printf(&new client comes\n&);
len = sizeof(cli_addr);
new_conn_fd = accept(sock_fd, (struct sockaddr*)&cli_addr, &len);
if (new_conn_fd & 0)
perror(&Fail to accept&);
for (i = 0; i & MAX_CLIENT_NUM; i++)
if (client_fd[i] == -1)
client_fd[i] = new_conn_
FD_SET(new_conn_fd, &read_set);
if (max_fd & new_conn_fd)
max_fd = new_conn_
for (i = 0; i & MAX_CLIENT_NUM; i++)
if (-1 == client_fd[i]) {
memset(recv_buf, 0, MAX_RECV_LEN);
if (FD_ISSET(client_fd[i], &select_read_set))
num = read(client_fd[i], recv_buf, MAX_RECV_LEN);
if (num & 0)
printf(&Client(%d) left\n&, client_fd[i]);
FD_CLR(client_fd[i], &read_set);
close(client_fd[i]);
client_fd[i] = -1;
else if (num & 0)
recv_buf[num] = '\0';
printf(&Recieve client(%d) data\n&, client_fd[i]);
printf(&Data: %s\n\n&, recv_buf);
} if (num == 0)
printf(&Client(%d) exit\n&, client_fd[i]);
FD_CLR(client_fd[i], &read_set);
close(client_fd[i]);
client_fd[i] = -1;
#include &stdio.h&
#include &stdlib.h&
#include &string.h&
#include &unistd.h&
#include &sys/time.h&
#include &sys/types.h&
#include &sys/socket.h&
#include &netinet/in.h&
#include &sys/select.h&
#define SERVER_IP &127.0.0.1&
#define SERVER_PORT 8000
#define MAX_RECV_LEN 1024
static int running = 1;
int main(int argc, char *argv[])
int sock_fd = -1;
int ret = -1;
struct sockaddr_in serv_
struct sockaddr_in cli_
socklen_t serv_addr_len = 0;
memset(&serv_addr, 0, sizeof(serv_addr));
sock_fd = socket(AF_INET, SOCK_STREAM, 0);
if (sock_fd & 0)
perror(&Fail to socket&);
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(SERVER_PORT);
serv_addr.sin_addr.s_addr = inet_addr(SERVER_IP);
serv_addr_len = sizeof(serv_addr);
if (connect(sock_fd, (struct sockaddr *)&serv_addr, serv_addr_len) & 0)
perror(&Fail to connect&);
char buf[1024];
int num = 0;
while (running)
num = read(STDIN_FILENO, buf, MAX_RECV_LEN);
if (num & 0)
buf[num] = '\0';
printf(&buf: %s\n&, buf);
num = write(sock_fd, buf, num);
if (num & 0)
printf(&write failed\n&);
if (strncmp(buf, &exit&, strlen(&exit&)) == 0)
printf(&Client exit\n&);
close(sock_fd);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:40294次
排名:千里之外
原创:32篇
(6)(5)(1)(1)(3)(4)(1)(1)(1)(2)(1)(4)(1)(3)

我要回帖

更多关于 oracle服务端和客户端 的文章

 

随机推荐