select模式学习(二)之:客户端

摘要:
connectfailed:%d\n",WSAGetLastError());closesocket;WSACleanup();return-1;}/////////////////////////////////////客户端SOCKET为非阻塞模式/////////////////////////////////////DWORDnMode=1;nError=ioctlsocket;if{printf("!!!"阻塞模式设定":"非阻塞模式设定"));printf;intnInputLen=0;intnIndex=0;intnLeft=0;fd_setfdRead;fd_setfdWrite;timevaltv={10,0};while{FD_ZERO;FD_ZERO;FD_SET;FD_SET;nError=select;if{printf("!!!selectfailed:%d\n",WSAGetLastError());break;}//发现SOCKET可读/可写if{memset;nError=recv;;;;;;if{printf("!!!

#include "stdafx.h"

////////////////////////////////////////////
//
// TCP Client 非阻塞模式设定
//
////////////////////////////////////////////

#pragma comment(lib,"ws2_32.lib")

#include <WinSock2.h>

#define CONNECT_IP "127.0.0.1"
#define CONNECT_PORT 1207
#define DEFAULT_BUFF_LEN 256
int _tmain(int argc, _TCHAR* argv[])
{
WSAData wsData;
SOCKET sServer;
SOCKADDR_IN addrServer;
SOCKADDR_IN addrLocal;
char sendBuff[DEFAULT_BUFF_LEN]={0};
char recvBuff[DEFAULT_BUFF_LEN]={0};
int nError;
printf(">>>>>TCP 客户端启动<<<<<<\n");
WSAStartup( MAKEWORD(2,2), &wsData );
printf("-创建客户端用SOCKET\n");
sServer = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
if( sServer == INVALID_SOCKET )
{
printf("!!! socket failed: %d\n", WSAGetLastError());
WSACleanup();
return -1;
}
addrServer.sin_family = AF_INET;
addrServer.sin_addr.S_un.S_addr = inet_addr( CONNECT_IP );
addrServer.sin_port = htons(CONNECT_PORT);
printf("-设定服务器地址信息: %s:%d\n",inet_ntoa(addrServer.sin_addr), ntohs(addrServer.sin_port));

//设定本地用地址和端口
//addrLocal.sin_family = AF_INET;
//addrLocal.sin_addr.S_un.S_addr = inet_addr( CONNECT_IP );
//addrLocal.sin_port = htons( 2701 );
//printf("-绑定本地用地址和端口: %s:%d\n", inet_ntoa(addrLocal.sin_addr), ntohs(addrLocal.sin_port));
////nError = bind( sServer, (const sockaddr*)&addrLocal, sizeof(addrLocal) );
//if( nError == SOCKET_ERROR )
//{
//printf("!!! bind failed: %d\n", WSAGetLastError());
//WSACleanup();
//return -1;
//}

printf("-连接指定服务器\n");
nError = connect( sServer, (const sockaddr*)&addrServer, sizeof(addrServer) );
if( nError == SOCKET_ERROR )
{
printf("!!! connect failed: %d\n", WSAGetLastError());
closesocket( sServer );
WSACleanup();
return -1;
}
///////////////////////////////////
// 客户端 SOCKET为非阻塞模式
//
///////////////////////////////////
DWORD nMode = 1;
nError = ioctlsocket( sServer, FIONBIO, &nMode );
if( nError == SOCKET_ERROR )
{
printf("!!! ioctlsocket failed: %d\n", WSAGetLastError());
closesocket( sServer );
WSACleanup();
return -1;
}
printf("-SOCKET模式设定: %s\n", (nMode==0?"阻塞模式设定":"非阻塞模式设定"));

printf("-开始准备送信受信\n");
int nInputLen = 0;
int nIndex = 0;
int nLeft = 0;
fd_set fdRead;
fd_set fdWrite;
timeval tv={10,0};
while(true)
{
FD_ZERO( &fdRead );
FD_ZERO( &fdWrite );
FD_SET( sServer, &fdRead );
FD_SET( sServer, &fdWrite );
nError = select( 0, &fdRead, &fdWrite, NULL, &tv );
if( nError == 0 )
{
printf("!!! select time out\n");
continue;
}
else if( nError < 0 )
{
printf("!!! select failed: %d\n", WSAGetLastError());
break;
}

//发现SOCKET可读/可写
if( FD_ISSET( sServer, &fdRead) )
{
memset( recvBuff, 0, sizeof(recvBuff) );
nError = recv( sServer, recvBuff, sizeof(recvBuff)-1, 0 );
;;;;;if( nError == SOCKET_ERROR )
{
printf("!!! recv failed: %d\n", WSAGetLastError());
break;
}
else if( nError == 0 )
{
printf("-Server Has Closed.\n");
break;
}
recvBuff[nError] = '\0';
printf("-Received: %s\n\n", recvBuff);
}
if( FD_ISSET(sServer, &fdWrite) )
{
printf("Input Message You Want to Send( Quit ):\n");
fflush( stdin );
memset( sendBuff, 0, sizeof(sendBuff) );
fgets( sendBuff, sizeof(sendBuff)-1, stdin );
nInputLen = strlen( sendBuff );
sendBuff[nInputLen-1] = '\0';//去掉回车符
--nInputLen;
nIndex = 0;
nLeft = nInputLen;
if(strcmp(sendBuff, "Quit")==0)
{
break;
}
//将输入的数据发送过去
while( nLeft > 0)
{
nError = send( sServer, &sendBuff[nIndex], nLeft, 0 );
;;;;if( nError == SOCKET_ERROR )
{
printf("!!! send failed: %d\n",WSAGetLastError());
closesocket( sServer );
WSACleanup();
return -1;
}
else if( nError == 0 )
{
printf("-Send OK.\n");
break;
}

nLeft -= nError;
nIndex += nError;
}
printf("-Has send: %s\n",sendBuff);
}
}//while(true)

printf("-关闭SOCKET\n");
closesocket(sServer);
WSACleanup();
return 0;
}

免责声明:文章转载自《select模式学习(二)之:客户端》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Linux 7.6查看开机自启C#正则表达式引发的CPU跑高问题以及解决方法团队下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

将一个数的字节顺序逆置

将一个数的字节顺序逆置 1 #include<stdio.h> 2 #include<stdlib.h> 3 4 int main() 5 { 6 int ival;//逆置的数 7 int res;//存储逆置后的数 8 9 while(fflush(stdin),printf("En...

【Oracle】利用level/Connect by 制作连续序列,并借此实现对缺失id的查找

如果要在查询语句中创建某个区间的连续序列,可以这样做。 select seq from (select level as seq from dual connect by level<=100) a where a.seq>=20 生成的效果大家可以看一看: SQL> select seq from (select level as se...

oracle 排序后分页查询

demo: select * from ( select * from DEV_REG_CFG_CAMERA where 1 = 1 order by unid asc) where rownum < 3001 minus select * from ( select * from DEV_REG_CFG_CAMERA where 1 = 1 ord...

socket网络编程(一)——初识socket

出现一项技术,首先我们弄懂一下,为什么要出现。那么为什么要出现socket这玩意呢?可以很简单的用一句话来概括: 为了实现两台计算机的通信   1、socket诞生的原因 两台装有操作系统的机子要想实现通信,第一要联网,第二通信双方一定制定某种规则。我们平时最为常见的http请求也是一种通信协议,只不过它是属于应用层的。http协议将要发送的数据封装后,...

Linux中 diff与patch的深入分析(转)

本文转自http://linux.chinaitlab.com/c/805820.html 1) diff的传统格式输出.   ############################################   cat before.txt   输出:   This is a line to be deleted   This is a line...

Oracle Sql 胡乱记

/Oracle查询优化改写/ --1、coalesce 返回多个值中,第一个不为空的值 select coalesce('', '', 's') from dual; --2、order by -----dbms_random.value 生产随机数,利用随机数对查询结果进行随机排序 select * from emp order by dbms_rand...