`
duoerbasilu
  • 浏览: 1541769 次
文章分类
社区版块
存档分类
最新评论

Winsock Select模型范例

 
阅读更多

服务器端:
#include <Winsock2.h>
#include <stdio.h>

void InitSocket()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 2, 2 );

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
/* Tell the user that we could not find a usable */
/* WinSock DLL. */
return;
}

/* Confirm that the WinSock DLL supports 2.2.*/
/* Note that if the DLL supports versions greater */
/* than 2.2 in addition to 2.2, it will still return */
/* 2.2 in wVersion since that is the version we */
/* requested. */

if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 ) {
/* Tell the user that we could not find a usable */
/* WinSock DLL. */
WSACleanup( );
return;
}
}
int main(int argc, char* argv[])
{
InitSocket();
SOCKET sock=::socket(AF_INET,SOCK_STREAM,0);
if(sock==INVALID_SOCKET)
{
printf("创建socket失败");
WSACleanup( );
return 0;
}
//::sockaddr_in serAddr;
SOCKADDR_IN serAddr;
serAddr.sin_family=AF_INET;
serAddr.sin_port=::htons(5150);
serAddr.sin_addr.s_addr = htonl(INADDR_ANY);
if(SOCKET_ERROR==bind(sock,(sockaddr*)&serAddr,sizeof(sockaddr)))
{
printf("绑定失败");
WSACleanup( );
return 0;
}
listen(sock,5);
fd_set fdSocket;
FD_ZERO(&fdSocket);
FD_SET(sock,&fdSocket);
while(true)
{
fd_set fdRead=fdSocket;
int nRet=::select(0,&fdRead,NULL,NULL,NULL);
if(nRet>0)
{
for(int i=0;i<(int)fdSocket.fd_count;i++)
{
if(FD_ISSET(fdSocket.fd_array[i],&fdRead))
{
//有新的连接到达
if(fdSocket.fd_array[i]==sock)
{
if(fdSocket.fd_count<FD_SETSIZE)
{
::sockaddr_in addr;
int len=sizeof(sockaddr);
SOCKET client=accept(sock,(sockaddr*)&addr,&len);
printf("接收到新的连接 : %s/n",::inet_ntoa(addr.sin_addr));
FD_SET(client,&fdSocket);
}
else
{
printf("too many connections/n");
}
}
else
{
char*buf=new char[1024];
int nRecv=::recv(fdSocket.fd_array[i],buf,1024,0);
if(nRecv>0)
{
buf[nRecv]='/0';
printf("收到数据: %s/n",buf);
}
else
{
::closesocket(fdSocket.fd_array[i]);
FD_CLR(fdSocket.fd_array[i],&fdSocket);
printf("一客户端断开连接/n");
}
delete []buf;
}
}
}
}
}
return 0;
}

客户端:

#include <winsock2.h>
#include <stdio.h>
#include <memory.h>
#include <iostream>
#include <string>
using namespace std;

void main(int argc, char **argv)
{
WSADATA wsaData;
SOCKET s;
SOCKADDR_IN ServerAddr;
int Port = 5150;
int Ret, Ret1;
string Data;
charDataServe[8];
memset(DataServe, 0, 8);
char pause;

if (argc <= 1)
{
printf("USAGE: tcpclient <Server IP address>./n");
return;
}

// Initialize Winsock version 2.2

if ((Ret = WSAStartup(MAKEWORD(2,2), &wsaData)) != 0)
{
// NOTE: Since Winsock failed to load we cannot use WSAGetLastError
// to determine the error code as is normally done when a Winsock
// API fails. We have to report the return status of the function.

printf("WSAStartup failed with error %d/n", Ret);
return;
}

// Create a new socket to make a client connection.

if ((s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))
== INVALID_SOCKET)
{
printf("socket failed with error %d/n", WSAGetLastError());
WSACleanup();
return;
}

// Setup a SOCKADDR_IN structure that will be used to connect
// to a listening server on port 5150. For demonstration
// purposes, we required the user to supply an IP address
// on the command line and we filled this field in with the
// data from the user.

ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons(Port);
ServerAddr.sin_addr.s_addr = inet_addr(argv[1]);

// Make a connection to the server with socket s.

printf("We are trying to connect to %s:%d.../n",
inet_ntoa(ServerAddr.sin_addr), htons(ServerAddr.sin_port));

if (connect(s, (SOCKADDR *) &ServerAddr, sizeof(ServerAddr))
== SOCKET_ERROR)
{
printf("connect failed with error %d/n", WSAGetLastError());
closesocket(s);
WSACleanup();
return;
}

printf("Our connection succeeded./n");

// At this point you can start sending or receiving data on
// the socket s. We will just send a hello message to the server.

printf("We will now try to send a hello message./n");

for(int i = 0; i<3; i++)
{
cin>>Data;
if ((Ret = send(s, Data.c_str()/*"Hello"*/, Data.size(), 0)) == SOCKET_ERROR)
{
printf("send failed with error %d/n", WSAGetLastError());
closesocket(s);
WSACleanup();
return;
}
printf("We successfully sent %d byte(s)./n", Ret);
}

// When you are finished sending and receiving data on socket s,
// you should close the socket.

printf("We are closing the connection./n");

closesocket(s);

// When your application is finished handling the connection, call
// WSACleanup.

WSACleanup();
cin>>pause;
}

分享到:
评论

相关推荐

    winsock select 模型源码

    Winsock的`select`模型是网络编程中一种常用的I/O多路复用技术,它允许程序同时监控多个套接字(sockets)的状态,以便在有数据可读或可写时进行相应的处理。在这个模型中,`select`函数是核心,它会阻塞直到至少有...

    winsock select 服务端模型源码

    本篇文章将详细讲解基于Winsock的`select`服务端模型及其源码解析。 `select`函数是网络编程中常用的一个多路复用I/O模型,它允许程序同时监控多个套接字(socket)的状态,从而实现并发处理多个连接请求。在...

    winsock网络通信(select和IOCP模型,客户端和服务器都有)

    本文将深入探讨两种常用的网络通信模型:select模型和IO完成端口(IOCP)模型。 首先,我们来看select模型。select函数是Unix和Windows操作系统中广泛使用的多路复用I/O机制,用于监视多个文件描述符(包括套接字)...

    winsock io模型源码

    在IT领域,网络编程是不可或缺的一部分,而Winsock是Windows平台...而如果只是处理少量连接,传统的select模型则足够使用。通过研究源码,你可以更好地掌握这些模型的适用场景和实现细节,从而提升自己的网络编程能力。

    WinSock 异步IO模型

    WinSock异步IO模型是Windows Socket编程中一种高效的数据传输方式。它允许应用程序在等待数据传输完成时执行其他任务,从而提高系统资源利用率和程序响应性。与传统的同步IO模型不同,异步IO不会阻塞调用线程,而是...

    WINSOCK IO模型

    帮助同学了解什么是WINSOCK IO模型,PPT里包含了好多相关网络应用与开发方面的知识!

    select模型_c++网络通信模型_

    本文将详细讲解C++中的select模型,以及如何在Windows环境下进行网络编程。 首先,我们要理解什么是select模型。在多路复用I/O模型中,select是一个重要的系统调用,它允许程序同时监控多个文件描述符(通常是套接...

    winsock网络编程模型

    标题与描述中的知识点聚焦于WinSock网络编程模型中的select模型,这一模型被广泛应用于网络通信中,特别是当处理多路复接(multiplexing)的需求时。以下是对这些知识点的详细解析: ### WinSock网络编程模型 ...

    Winsock I/O模型的实现( Select + AsyncSelect + EventSelect + 重叠模型 + IOCP )

    利用Visual C++ 6.0实现的一套Winsock I/O模型,包括了所有的Winsock I/O模型:Select模型、AsyncSelect(异步选择模型)、EventSelect(事件选择模型)、Overlapped(重叠模型)、CompletionRoutine(完成例程)、...

    pb winsock通讯的范例

    这是PB Socket 程序(异步流模式),对需要的人能够有用。 关键说明 服务器端 1,SocketServer中,有个uo_Socket_Server类型的数组Connects,实现多个连接管理。 2,uo_Socket_Server实例是通过w_1.tab_1.OpenTab()...

    UDP协议的select模型代码

    Select模型已集成到Winsock 1.1中,它使那些想避免在套接字调用过程中被无辜“锁定”的应用程序,采取一种有序的方式,同时进行对多个套接字的管理。由于Winsock 1.1向后兼容于Berkeley套接字实施方案,所以假如有一...

    c++实现win socket 编程中的Select I/O模型

    在VS2010环境下,开发者可以利用Winsock库和Select模型实现高效的网络通信。通过阅读和学习提供的`SocketSelect2010`源码,你可以深入了解这一机制,并将其应用到实际项目中,提高程序的并发处理能力。

    TCP协议的select模型代码

    Select模型已集成到Winsock 1.1中,它使那些想避免在套接字调用过程中被无辜“锁定”的应用程序,采取一种有序的方式,同时进行对多个套接字的管理。由于Winsock 1.1向后兼容于Berkeley套接字实施方案,所以假如有一...

    winsock IO五种模型

    这是winsocket的五种IO模型实现,压缩里面有2个VC控制台应用程序工程: 1、winsock_server工程,服务器端。这里实现了五种winsoket IO模型,你要看那个模型的代码,只需要把那个模型的注释代码放开,其他模型的代码...

    WINSOCK IO模型.pdf

    ### WINSOCK IO模型概述 本文旨在深入探讨Windows环境下针对套接字的多种输入/输出(I/O)模型,包括但不限于`select(选择)`、`WSAAsyncSelect(异步选择)`、`WSAEventSelect(事件选择)`、`Overlapped I/O(重叠式I/O)`...

    5种winsock_IO模型

    Select模型已经集成到了Winsock 1.1中,使得应用程序可以采用有序的方式同时管理多个套接字,避免在套接字调用过程中被无辜锁定。 **特点:** - **简单易用:** 使用`select`函数非常简单,对于初学者友好。 - **多...

    使用Winsock控件的VB典型范例_使用Winsock控件的VB典型范例_

    这个“使用Winsock控件的VB典型范例”着重介绍了如何在VB应用程序中集成和使用Winsock控件进行网络编程。 Winsock控件是VB中的一个标准控件,其主要职责是提供与网络服务的接口。它基于Windows Socket API(通常...

    Winsock IO模型

    Winsock IO模型是Windows操作系统中用于网络通信的重要组成部分,它为开发者提供了标准接口来实现套接字(Socket)的输入/输出操作。在编程中,理解并熟练掌握各种IO模型对于优化网络应用性能至关重要。本篇文章将...

    Winsock 完成端口模型简介

    Winsock 完成端口(IOCP,Input/Output Completion Port)模型是Windows操作系统中用于高效处理并发I/O操作的一种机制。它为多线程环境提供了优化的I/O管理方式,特别适合于高并发的网络服务,如服务器应用程序。...

Global site tag (gtag.js) - Google Analytics