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,智学网的等级比例怎么算

三国志战略版S1紫将推荐 - 新手平民开荒必备 三国志战略版怎么获得铜币?最全获取方法攻略 真三国无双单机版游戏专题 - 经典割草动作游戏回顾 三国志战略版水断桥武将搭配与战术解析 三国志战略版陈到用不了?原因与解决方案 - 玩家指南 三国志战略版S3最强阵容推荐 - 实用攻略 三国志战略版残卷特技详解 三国志战略版张飞和刘备哪个好?详细武将对比分析 三国志战略版酷爱配将 - 武将搭配心得分享 三国志11建筑特点及功能详解 三国志战略版爆仓升8本攻略 - 资源管理与升级技巧 《三国志·蜀书·赵云传》原文与译文 - 三国历史人物传记 三国志战略版S3赛季新手进阶攻略 - 实用指南 NDS《三国志大战 天》专题页面 三国志战略版S3小卡包详解 - 机制与抽取建议 三国志13君主模式版本下载 - 经典策略游戏介绍与资源 三国志战略版诸葛亮阵容推荐 三国志战略版S3阵容搭配推荐 - 实用攻略 三国志9蔡琰学兵法:才女的兵法之路 三国志战略版好用的战法推荐与搭配指南 真三国无双版手游下载 - 官方正版动作游戏 光荣三国志10流浪模式介绍与攻略 三国志战略版开荒队伍推荐 - 新手高效发育阵容指南 三国志11查看隐藏技能方法 - 游戏技巧分享 犀游三国志战略版官网入口 - 正版游戏登录平台 三国志战略版模拟器双开工具 - 简易实用多账号管理 三国志战略版典藏卡有什么用?详细用途解析 三国志战略版征兵营帐详解 - 游戏功能与策略指南 三国志战略版张角刘备阵容搭配攻略 三国战纪:乱世枭雄 下载 - 经典街机游戏免费获取