之前光看理论是不行滴,一定要实践,实践啊,不然永远都是门外汉!!

嗯嗯,把找到的一段源码贴上先,稍微修改了一下:

#include <winsock.h>
#include <stdio.h> #include <string> #define PORT 5010
#define MSGSIZE 1024
int BytesSum = ; #pragma comment(lib, "ws2_32.lib") DWORD WINAPI WorkerThread(LPVOID lpParameter); void InitWinSocket()
{
WSADATA wsaData;
WSAStartup(0x0202, &wsaData);
} #define ListenQ 10 int main()
{
InitWinSocket(); int opt = TRUE;
int master_socket , addrlen , new_socket , client_socket[] , max_clients = , activity, i , valread , sd;
int max_sd;
struct sockaddr_in address; char buffer[]; //data buffer of 1K //set of socket descriptors
fd_set readfds; //a message
char *message = "ECHO Daemon v1.0 \r\n"; //initialise all client_socket[] to 0 so not checked
for (i = ; i < max_clients; i++)
{
client_socket[i] = ;
} //create a master socket
if( (master_socket = socket(AF_INET , SOCK_STREAM , )) == )
{
perror("socket failed");
exit(EXIT_FAILURE);
} //set master socket to allow multiple connections , this is just a good habit, it will work without this
if( setsockopt(master_socket, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(opt)) < )
{
perror("setsockopt");
exit(EXIT_FAILURE);
} //type of socket created
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons( PORT ); //bind the socket to localhost port 8888
if (bind(master_socket, (struct sockaddr *)&address, sizeof(address))<)
{
perror("bind failed");
exit(EXIT_FAILURE);
}
printf("Listener on port %d \n", PORT); //try to specify maximum of 3 pending connections for the master socket
if (listen(master_socket, ) < )
{
perror("listen");
exit(EXIT_FAILURE);
} //accept the incoming connection
addrlen = sizeof(address);
puts("Waiting for connections ..."); while(TRUE)
{
//clear the socket set
FD_ZERO(&readfds); //add master socket to set
FD_SET(master_socket, &readfds);
max_sd = master_socket; //add child sockets to set
for ( i = ; i < max_clients ; i++)
{
//socket descriptor
sd = client_socket[i]; //if valid socket descriptor then add to read list
if(sd > )
FD_SET( sd , &readfds); //highest file descriptor number, need it for the select function
if(sd > max_sd)
max_sd = sd;
} //wait for an activity on one of the sockets , timeout is NULL , so wait indefinitely
activity = select( max_sd + , &readfds , NULL , NULL , NULL); if (activity < )
{
printf("select error");
} //If something happened on the master socket , then its an incoming connection
if (FD_ISSET(master_socket, &readfds))
{
if ((new_socket = accept(master_socket, (struct sockaddr *)&address,&addrlen))<)
{
perror("accept");
exit(EXIT_FAILURE);
} //inform user of socket number - used in send and receive commands
printf("New connection , socket fd is %d , ip is : %s , port : %d \n" , new_socket , inet_ntoa(address.sin_addr) , ntohs(address.sin_port)); //send new connection greeting message
if( send(new_socket, message, strlen(message), ) != strlen(message) )
{
perror("send");
} puts("Welcome message sent successfully"); //add new socket to array of sockets
for (i = ; i < max_clients; i++)
{
//if position is empty
if( client_socket[i] == )
{
client_socket[i] = new_socket;
printf("Adding to list of sockets as %d\n" , i); break;
}
}
} //else its some IO operation on some other socket :)
for (i = ; i < max_clients; i++)
{
sd = client_socket[i]; if (FD_ISSET( sd , &readfds))
{
//Check if it was for closing , and also read the incoming message
if ((valread = recv( sd , buffer, ,)) == )
{
//Somebody disconnected , get his details and print
getpeername(sd , (struct sockaddr*)&address , &addrlen);
printf("Host disconnected , ip %s , port %d \n" , inet_ntoa(address.sin_addr) , ntohs(address.sin_port)); //Close the socket and mark as 0 in list for reuse
closesocket( sd );
client_socket[i] = ;
} //Echo back the message that came in
else
{
//set the string terminating NULL byte on the end of the data read
buffer[valread] = '\0';
send(sd , buffer , strlen(buffer) , );
}
}
}
} return ;
}

ok,回家慢慢学习!

win32 socket之select的更多相关文章

  1. windows socket编程select模型使用

    int select(         int nfds,            //忽略         fd_ser* readfds,    //指向一个套接字集合,用来检测其可读性       ...

  2. 非阻塞式socket的select()用法

    Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只 是习惯写诸如 connect.accept.recv或recvfrom这样的阻塞程 ...

  3. socket中select的使用源码

    下面的代码来自IBM学习网站,是学习socket通信和select使用的一个很好的源码. server.c  服务器端 #include <stdio.h> #include <st ...

  4. socket之 select模型

    前段时间一直想学习网络编程的select模型,看了<windows网络编程>的介绍,参考了别人的博客. 这里的资料主要来自http://www.cnblogs.com/RascallySn ...

  5. Python之基于socket和select模块实现IO多路复用

    '''IO指的是输入输出,一部分指的是文件操作,还有一部分网络传输操作,例如soekct就是其中之一:多路复用指的是利用一种机制,同时使用多个IO,例如同时监听多个文件句柄(socket对象一旦传送或 ...

  6. 转 linux socket的select函数例子

    使用select函数可以以非阻塞的方式和多个socket通信.程序只是演示select函数的使用,功能非常简单,即使某个连接关闭以后也不会修改当前连接数,连接数达到最大值后会终止程序. 1. 程序使用 ...

  7. python中的网络通信,socket、select、selectors、socketserver

    楔子 网络通信用于获取一个算法在本地运行所需的数据,还可以共享信息实现分布式处理,另外可以用来管理云服务. python的标准库提供了一些模块来创建网络服务以及访问现有服务ipaddress模块提供了 ...

  8. win32 socket 编程(六)——UDP

    基于 UDP 无连接的 socket 编程 一.服务器端操作流程 1.1加载套接字库(WSAStartup) 1.2 创建套接字  (socket) 1.3将创建的套接字绑定到一个本地地址和端口上   ...

  9. win32 socket编程(五)——客户端实例(TCP)

    一.客户端操作流程 1.1 加载套接字库(WSAStartup()) 1.2创建套接字(socket()). 1.3向服务器发出连接请求(connect()). 对于客户端来说,它不需要绑定,可以直接 ...

随机推荐

  1. 如何获取当前应用程序所用的OpenGL ES的版本

      如何获取当前应用程序所用的OpenGL ES的版本? [答案]     char* glVersion = (char*)glGetString(GL_VERSION);     LOGW(&qu ...

  2. ERROR in index.web.js from UglifyJs

    使用weexpack构建weex应用时,npm run serve一直报这个错误 ERROR in index.web.js from UglifyJs Unexpected token: name ...

  3. BCG在程序中的使用

    首先你电脑上是安装有BCG的,详细安装方法就是先双击安装程序,之后编译当中的两个project.之后将其生成的.dll\.lib文件放入C++的include中这样就能够使用BCG的控件了. 1. 在 ...

  4. JavaScript判断变量是否为数组的方法(Array)

    废话不多说直接上一个代码: 1.这里是通用的检测方法 /* * 判断是否是数组 */ function isArray(obj){ return Object.prototype.toString.c ...

  5. C#.NET常见问题(FAQ)-如何判断两个类是否相同类型

    可以用is方法判断是否是一个类   更多教学视频和资料下载,欢迎关注以下信息: 我的优酷空间: http://i.youku.com/acetaohai123   我的在线论坛: http://csr ...

  6. DevExpress去除多国语言包

    DevExpress作为windows开发中较为强大的第三方组件,能极大的提高编程效率和界面效果.但也要引用它较多的dll文件,它专门有个查看dll程序集依赖的工具,在VS的工具菜单下: 在VS的工具 ...

  7. advertisingIdentifier

    iOS 7后Mac 地址就不能用了. 不过可以用advertisingIdentifier来取,再多个project 里测试是唯一的,但如果遇到系统升级或是重刷这个就不一定能唯一了.. 这里还要加一个 ...

  8. sed awk tr等文本处理命令

    指定行范围替换: sed -i "520,950s/\(.*\)\(HOST_CMD_.*\)\(,\)/\1{ \2, \"\2\" },/g" hostCm ...

  9. JAVA设计模式——第 8 章 适配器模式【Adapter Pattern】(转)

    好,请安静,后排聊天的同学别吵醒前排睡觉的同学了,大家要相互理解嘛.今天讲适配器模式,这个模式也很简单,你笔记本上的那个拖在外面的黑盒子就是个适配器,一般你在中国能用,在日本也能用,虽然两个国家的的电 ...

  10. 《Android开发艺术探索》图书勘误

    第一章 在13页提到"系统仅仅在Activity异常终止的时候才会调用onSaveInstanceState与onRestoreInstanceState来储存和恢复数据.其它情况不会触发这 ...