tcpclient-100

问题描述:tcp client和tcp server的区别 大家好,给大家分享一下一个有趣的事情,很多人还不知道这一点。下面详细解释一下。现在让我们来看看!

tcpclient.c和server端代码

tcpclient-100的相关图片

1、TCP和UDP都属于socket通信协议,前者是以100个数据流的方式进行通信,后者是以数据包的方式进行通信。

2、TCP是有向连接协议,UDP是无向连接协议。

3、当tcpclient和服务器建立连接时,它们需要三个握手协议。UDP不需要握手,直接发送数据包。

4、TCP通信不会丢失数据,UDP通信会丢失数据包。

5、在通信可靠性方面,TCP比UDP更可靠。

6、安全性上,TCP安全保密要比UDP高。

7、TServerSocket/TClientSocket,是兼容的消息通知的非阻塞异步模式。

扩展资料:

在使用TCP通讯建立连接时采用客户端服务器模式,这种模式又常常被称为主从式架构,简称为C/S结构,属于一种网络通讯架构,将通讯的双方以客户端(Client )与服务器 (Server) 的身份区分开来。

使用C/S结构的通信常见的还有S7通信, ISO-on-TCP通信。

服务器的特征:被动角色,等待来自客户端的连接请求,处理请求并回传结果。

客户端的特征:主动角色,发送连接请求,等待服务器的响应。

.net中的线程池肯定用了什么优化技术,和直接用线程差别巨大的相关图片

.net中的线程池肯定用了什么优化技术,和直接用线程差别巨大

CLIENT:

#include <stdio.h>。

#include <stdio.h>。

#include <winsock.h>。

#pragma comment(lib,"Ws2_32")。

#define PORT 6666 /* 客户机连接远程主机的端口 */ 。

#define MAXDATASIZE 100 /* 每次可以接收的最大字节 */ 。

int main()

{

int sockfd, numbytes; 。

char buf[MAXDATASIZE]; 。

char msg[MAXDATASIZE];。

char *argv="127.0.0.1";。

struct sockaddr_in their_addr; /* 对方的地址端口信息 */ 。

WSADATA ws;WSAStartup(MAKEWORD(2,2),&ws); //初始化Windows Socket Dll。

if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)。

{

//如果建立socket失败,退出程序。

printf("socket error\n"); 。

exit(1); 。

}

//连接对方

their_addr.sin_family = AF_INET; /* 协议类型是INET */ 。

their_addr.sin_port = htons(PORT); /* 连接对方PORT端口 */ 。

their_addr.sin_addr.s_addr = inet_addr(argv); /* 连接对方的IP */ 。

if (connect(sockfd, (struct sockaddr *)&their_addr,sizeof(struct sockaddr)) == -1)。

{

//如果连接失败,退出程序。

printf("connet error\n"); 。

closesocket(sockfd); 。

exit(1); 。

}

while(1){

scanf("%s",msg);。

//发送数据

if (send(sockfd, msg, MAXDATASIZE, 0) == -1) 。

printf("send error");。

closesocket(sockfd);。

exit(1); 。

}

//接收数据,并打印出来

if ((numbytes=recv(sockfd, buf, MAXDATASIZE, 0)) == -1) 。

{

//接收数据失败,退出程序。

printf("recv error\n"); 。

closesocket(sockfd); 。

exit(1); 。

}

buf[numbytes] = '\0'; 。

printf("Received: %s\n",buf); }。

closesocket(sockfd); 。

return 0;

C++ Socket如何设置Accept和Recv的非阻塞的相关图片

C++ Socket如何设置Accept和Recv的非阻塞

本来想象中很简单,就是一个多线程,一个tcpclinet而已。

扫描部分代码如下。多说一句,由于.net下无论tcpclient还是socket都没有connect timeout(连接超时)的设置,网上借鉴了一下别人的用AutoResetEvent的等待做超时,异步连接,如果超时之前连接成功就set(),如果等到100毫秒还没异步连接成功就认为失败。

private void ec(IAsyncResult iar){try{TcpClient tc = (TcpClient)iar.AsyncState;。

tc.EndConnect(iar);are.Set();}catch { }}AutoResetEvent are = new AutoResetEvent(false);。

private void ceshi(IPEndPoint ipp){TcpClient tc = new TcpClient();。

tc.BeginConnect(ipp.Address, ipp.Port, ec, tc);。

are.WaitOne(100);。

if (tc.Connected){Console.WriteLine(ipp.ToString());}try{tc.Close();}catch { }}就这样一个同样的代码,我直接用Thread开512个线程去执行ceshi这个方法结果,几秒钟cpu100%了卡住了。我用vs2010性能分析工具,说全都是由于BeginConnect EndConnect和Close几个方法占用的cpu。

但是奇怪的是,同样还是上面的代码,用ThreadPool去执行ceshi,同样用512的线程的话,cpu占用率就基本为0,不要怀疑线程池的限制了线程数,我ThreadPool.SetMaxThreads(int.MaxValue, int.MaxValue);了。

而且从netstat -ano看,确实是大量的连接,确实是512个线程连接,从路由器中看也是如此。

难道线程池还能优化TcpClient?真是百思不得其解啊。

顺便说一下,如果直接用Thread 512个线程的话,从任务管理器中看,上来就会有512个线程(其实还有一些辅助线程上来600多),而用线程池的话,他会从几十个线程开始2个2个的往上加,最后也达到600多个,稳定到600多线程,保证512个线程去连接是没有问题的。

所以上来说一下,做这种大量网络操作的同志们还是用线程池吧。

c# 使用tcpclient 调用接口得到返回值怎么解析。的相关图片

c# 使用tcpclient 调用接口得到返回值怎么解析。

void* CTCPClient::AUReceive(void *aInstance)。

struct timeval tv_out;。

CTCPClient *pInstance = (CTCPClient *)aInstance;。

fd_set sockfd;。

pInstance->m_IsExit = false;。

char ReceiveDataInfo[1024]={0};。

    char Temp[4] = {0};。

   

while(pInstance->m_IsExit == false)。

{

if(pInstance->m_socket == SOCKETERROR)。

{

FD_ZERO(&sockfd);。

}

else

{

FD_ZERO(&sockfd);。

FD_SET(pInstance->m_socket,&sockfd);。

}

fd_set mySet = sockfd;。

memset(ReceiveDataInfo,0,1024);。

int Max_ID = pInstance->m_socket;。

int position=0;。

tv_out.tv_sec = 0;。

tv_out.tv_usec = 1000;。

if(select(Max_ID+1,&mySet,NULL,NULL,&tv_out)>0) //主要这一句。

{

long  nBytesRead = 0;。

unsigned long nBytesToRecv = pInstance->mreceivebuflen -pInstance->hasrecvlen;。

pInstance->recvsignal.Wait();。

if(pInstance->m_socket == SOCKETERROR)。

{

FD_ZERO(&sockfd);。

pInstance->recvsignal.Release();。

continue;

}

nBytesRead =  recv(pInstance->m_socket,(char *)pInstance->mreceivebuf + pInstance->hasrecvlen, nBytesToRecv, 0);。

pInstance->recvsignal.Release();。

if(nBytesRead == -1 || nBytesRead == 0)。

{

pInstance->m_CSocket.SocketClose(pInstance->m_socket);。

FD_ZERO(&sockfd);。

pInstance->m_socket = SOCKETERROR;。

continue;

}

pInstance->hasrecvlen += nBytesRead;。

pInstance->m_CLog->ddprintf("CTCPClient","AUReceive",1,"recv a package!");。

pInstance->m_CLog->ddprintf("CTCPClient","AUReceive",1,"recvlen is %ld",nBytesRead);。

if((pInstance->FindCompletePackage(pInstance->receive,nBytesRead,pInstance->mreceivebuf))==false)。

{

continue;

}

//printf("validlen is %d\n",pInstance->validlen);。

pInstance->hasrecvlen =0;。

if(pInstance->validlen < 8)。

{

pInstance->m_CLog->ddprintf("CTCPClient","AUReceive",1,"receive data is error(len is error)!");。

continue;

}

for(int i =0 ; i< pInstance->validlen; i++)。

{

sprintf(Temp,"%2x-", pInstance->receive[i]);。

strcat(ReceiveDataInfo, Temp);。

}

pInstance->m_CLog->ddprintf("CTCPClient","AUReceive",1,"recv data is:%s",ReceiveDataInfo);。

unsigned int recvSN = Char2Int(pInstance->receive);。

position+=4;。

unsigned int recvCMD = Char2Short(pInstance->receive + position);。

position+=2;。

unsigned long buflen = Char2Short(pInstance->receive + position);。

position+=2;。

if(pInstance->validlen - position != buflen)。

{

pInstance->m_CLog->ddprintf("CTCPClient","AUReceive",1,"receive data is error(len error)!");。

continue;

}

stCommand newReceiveCommand;。

newReceiveCommand.CmdSN = recvSN;。

//newReceiveCommand.DataBuffer = "";。

bool rest = pInstance->FindSentCommand(newReceiveCommand);。

if(rest == false)。

{

pInstance->m_CLog->ddprintf("CTCPClient","AUReceive",1,"receive data is error(SN can not find)!");。

continue;

}

if(newReceiveCommand.CmdCode != recvCMD)。

{

pInstance->m_CLog->ddprintf("CTCPClient","AUReceive",1,"receive data is error(CMD is error)!");。

continue;

}

char *RecvData = new char[buflen];。

memcpy(RecvData,pInstance->receive+position,buflen);。

pInstance->UpdateSentCommand(recvSN,buflen,RecvData); 。

newReceiveCommand.WaitEvent->Release();。

pInstance->m_CLog->ddprintf("CTCPClient","AUReceive",1,"send a signal of recv!");。

delete[] RecvData;。

}

else

Csleep(100);。

}

//pInstance->m_ThdRecv.ThreadExit();。

return NULL;

这个是recv设置非阻塞的方式,accept也是差不多。

为什么微软不给C#中的TcpClient和UdpClient提供抽象层?

这种你最好是用HttpWebRequest或是WebClient来获取,不用自己去分析这些了。直接能得到想的值。

原文地址:http://www.qianchusai.com/tcpclient-100.html

华硕主板无限bios无法开机,华硕主板开机无限进入bios 无法正常开机

华硕主板无限bios无法开机,华硕主板开机无限进入bios 无法正常开机

华硕主板只能进入bios,华硕主板为啥直接启动进入bio模式

华硕主板只能进入bios,华硕主板为啥直接启动进入bio模式

华硕主板反复进入bios是电池,华硕主板反复进入bios是电池问题吗

华硕主板反复进入bios是电池,华硕主板反复进入bios是电池问题吗

华硕新主板开机无限进入bios,华硕主板启动一直进入bios界面

华硕新主板开机无限进入bios,华硕主板启动一直进入bios界面

zh4186

zh4186

masonry,masonry drills是什么钻头

masonry,masonry drills是什么钻头

note和point区别,noted 和noticed的区别

note和point区别,noted 和noticed的区别

pallets

pallets

doorbell翻译成中文,door to door的中文翻译

doorbell翻译成中文,door to door的中文翻译

智学网的等级比例怎么划分的A1,智学网的等级比例怎么算

智学网的等级比例怎么划分的A1,智学网的等级比例怎么算

三国志战略版军屯势力值 - 完整攻略与计算器 三国志战略版灼烧战法攻略 - 完整指南 三国志战略版最大声望攻略 - 快速提升声望技巧大全 三国志战略版S3战法搭配攻略 - 完整阵容配置指南 三国志战略版高级建筑势力值计算与攻略 - 建筑势力值提升指南 三国志战略版同盟秘策玩法大全 - 完整攻略指南 三国志战略版暴戾无仁和鬼神霆威攻略详解 三国志战略版秘策怎么用 - 完全攻略指南 三国志回血战法 - 完整攻略与技巧大全 三国志战略版鬼神霆威攻略 - 技能解析与阵容搭配 三国志战略版整装兑换 - 最全兑换攻略与奖励列表 三国志战略版兵锋单体攻略大全 - 技能解析与实战技巧 三国志战略版天下骑强度分析 - 游戏攻略 三国志战略版先锋体验官申请 - 抢先体验新版本 三国志战略版测试服列表 - 最新测试服务器信息 三国志战略版造币厂数量上限详解 - 游戏攻略指南 三国志战略版强攻攻略 - 最强进攻战术详解 三国志战略版工坊有什么用 - 完整功能解析与使用指南 三国志战略版拔城技巧 - 实用攻城攻略大全 三国志战略版兵锋连击攻略大全 - 最强阵容搭配与技巧分享 三国志战略版吕布主将攻略 - 技能阵容战法详解 三国志战略版兑换码大全 - 最新有效兑换码汇总 三国志战略版虎杖多大 - 虎杖属性技能详解 三国志战略版马超兵锋攻略 - 马超技能搭配与阵容推荐 虎帐三国志战略版 - 重现三国风云,成就霸业宏图 三国志战略版张鲁势力攻略 - 武将技能阵容搭配详解 三国志战略版军屯在哪 - 军屯位置获取攻略大全 三国志战略版强攻怎么打 - 强攻阵容搭配与战术攻略 三国志战略版摧锋拔城攻略大全 - 最强攻城策略指南 三国志战略版地级势力值详解 - 完整攻略指南