运行recv函数接收数据,却直接结束了 [问题点数:50分]

Bbs1
本版专家分:0
结帖率 0%
Bbs1
本版专家分:0
Bbs10
本版专家分:138201
Blank
进士 2018年总版新获得的技术专家分排名前十
Blank
银牌 2019年7月 总版技术专家分月排行榜第二
2019年5月 总版技术专家分月排行榜第二
Blank
铜牌 2019年4月 总版技术专家分月排行榜第三
2019年3月 总版技术专家分月排行榜第三
Blank
红花 2019年7月 VC/MFC大版内专家分月排行榜第一
2019年6月 VC/MFC大版内专家分月排行榜第一
2019年5月 VC/MFC大版内专家分月排行榜第一
2019年4月 VC/MFC大版内专家分月排行榜第一
2019年3月 VC/MFC大版内专家分月排行榜第一
2019年1月 VC/MFC大版内专家分月排行榜第一
2018年12月 VC/MFC大版内专家分月排行榜第一
2018年11月 VC/MFC大版内专家分月排行榜第一
2018年10月 VC/MFC大版内专家分月排行榜第一
2018年9月 VC/MFC大版内专家分月排行榜第一
2018年8月 VC/MFC大版内专家分月排行榜第一
2018年5月 VC/MFC大版内专家分月排行榜第一
2018年4月 VC/MFC大版内专家分月排行榜第一
2018年3月 VC/MFC大版内专家分月排行榜第一
2018年2月 VC/MFC大版内专家分月排行榜第一
2018年1月 VC/MFC大版内专家分月排行榜第一
2017年12月 VC/MFC大版内专家分月排行榜第一
2017年11月 VC/MFC大版内专家分月排行榜第一
2017年7月 VC/MFC大版内专家分月排行榜第一
2012年7月 VC/MFC大版内专家分月排行榜第一
Bbs3
本版专家分:769
Bbs1
本版专家分:0
Bbs1
本版专家分:0
Bbs10
本版专家分:138201
Blank
进士 2018年总版新获得的技术专家分排名前十
Blank
银牌 2019年7月 总版技术专家分月排行榜第二
2019年5月 总版技术专家分月排行榜第二
Blank
铜牌 2019年4月 总版技术专家分月排行榜第三
2019年3月 总版技术专家分月排行榜第三
Blank
红花 2019年7月 VC/MFC大版内专家分月排行榜第一
2019年6月 VC/MFC大版内专家分月排行榜第一
2019年5月 VC/MFC大版内专家分月排行榜第一
2019年4月 VC/MFC大版内专家分月排行榜第一
2019年3月 VC/MFC大版内专家分月排行榜第一
2019年1月 VC/MFC大版内专家分月排行榜第一
2018年12月 VC/MFC大版内专家分月排行榜第一
2018年11月 VC/MFC大版内专家分月排行榜第一
2018年10月 VC/MFC大版内专家分月排行榜第一
2018年9月 VC/MFC大版内专家分月排行榜第一
2018年8月 VC/MFC大版内专家分月排行榜第一
2018年5月 VC/MFC大版内专家分月排行榜第一
2018年4月 VC/MFC大版内专家分月排行榜第一
2018年3月 VC/MFC大版内专家分月排行榜第一
2018年2月 VC/MFC大版内专家分月排行榜第一
2018年1月 VC/MFC大版内专家分月排行榜第一
2017年12月 VC/MFC大版内专家分月排行榜第一
2017年11月 VC/MFC大版内专家分月排行榜第一
2017年7月 VC/MFC大版内专家分月排行榜第一
2012年7月 VC/MFC大版内专家分月排行榜第一
Bbs12
本版专家分:361059
版主
Blank
名人 2013年 荣获名人称号
Blank
探花 2011年 总版技术专家分年内排行榜第三
2010年 总版技术专家分年内排行榜第三
Blank
进士 2012年 总版技术专家分年内排行榜第五
Blank
金牌 2012年1月 总版技术专家分月排行榜第一
Bbs4
本版专家分:1720
recv接收数据乱码?
平台:6.0rnchar szBuf[1024]; rnmemset(szBuf,0,1024); rnint iRet = <em>recv</em>(m_Socket,szBuf,sizeof(szBuf),0); rn客户端输入hello,结果服务器端只输出hrn输入中文出现乱码?这是什么原因?rn把char换成WCHAR就可以了,这又是为什么?rnrn
关于Recv()接收数据的问题
由于我要接受的数据是变长的,并且在数据通信协议中并无传输<em>结束</em>判断符和数据包长,那么请问如何做到使Recv()接受到全部的数据并不会阻塞?谢谢。
关于Recv接收数据的数据量
我在另一台机子上用send<em>函数</em>一次发送了11200byte的数据,为什么主机用<em>recv</em><em>函数</em>一次只接收了0x002238个byte,约为8160或更少,很奇怪。如果只发送5600或较少的数据,是可以正确接受的。我用的是WSAnySelect<em>函数</em>注册的wnd消息FD_READ,而且好像毎次连续收到两次读数据的消息,send内部是分批发送的吗?哪位高手指教一下,万分感谢!!!
recv接收数据不完全?
大家好,下面的代码实现下载一个请求host的html代码,但是我发现每次<em>运行</em>都会发生数据接收不全的现象rn[code=C/C++]rn#include rn#include rn#include rn#include rn#include rn#include rn#include rnrn//建立一个http tcp 连接的辅助<em>函数</em>rnint htconnect(char *domain, int port)rnrnint white_sock;rnstruct hostent *site;rnstruct sockaddr_in me;rnrn//获得服务器的名称rnsite = gethostbyname(domain);rnif(NULL == site)rnrn return (-2);rnrn//建立套接字rnwhite_sock = socket(AF_INET, SOCK_STREAM, 0);rnif(white_sock < 0)rnrn return (-1);rnrn//初始化为0rnmemset(&me, 0, sizeof(struct sockaddr_in));rnmemcpy(&me.sin_addr, site->h_addr_list[0], site->h_length);rnme.sin_family = AF_INET;rnme.sin_port = htons(port);rnrn//建立连接rnreturn ( (connect(white_sock, (struct sockaddr*)&me, sizeof(struct sockaddr))< 2)rnrn printf("usage:\nwClient host\n");rn return;rnrnblack_sock = htconnect(argv[1], 80);rnrnif (black_sock=0)rn rn //printf("\n[%d]\n",i);rn printf("\n[%s]\n",buf);rn rn rn /* if(strstr(buf,"baidu")>0)rn rn printf("\ncan go net\n");rn break;rn rn */rnprintf("\n------end---------\n");rnclose(black_sock);rn[/code]
recv函数 如何判断接收结束
一个简单的程序,client端将一个文件的内容传送到server端。rn[code=C/C++]rnrnclient的发<em>函数</em>为:rnchar line[MAXLINE]; rnwhile ((fgets(line,MAXLINE,fd)!=NULL) // fd 为一个文件的指针rn rnsend (connfd, line,strlen(line),0) // connfd为 socketrnrnrnserver 的接收<em>函数</em>为:rnfor (;;) rnif ((n=<em>recv</em>(connfd, <em>recv</em>line,MAXLINE,0)>0) rn<em>recv</em>line[n]=0;rnfputs(stdout,<em>recv</em>line);rnelse rnbreak;rnrnrn[/code]rn现在的问题是:当发端停止发送后,收端无法得知数据已经传输完毕,从而一直在for中死循环,这个问题该如何解决呢?rnrn
recv非阻塞情况下接收数据的问题
我刚接触网络编程,向各位高手请教几个问题rn1.就是在非阻塞情况下,<em>recv</em>调用返回SOCKET_ERROR并且WSAGetLastError()==WSAEWOULDBLOCK时,下面的代码<em>recv</em>buf是接收到数据还是没有接收到数据?是不是<em>recv</em>接收了一些数据,这时需要阻塞,然后发出WSAEWOULDBLOCK错误,等待可以<em>接收数据</em>时接着接收剩下的数据?还是发出WSAEWOULDBLOCK错误时<em>recv</em>调用就已经失败了,<em>recv</em>buf里根本没有接收的数据,然后期待下次可以<em>接收数据</em>时再正常接收?rn2.有没有在接收的过程中出现WSAEWOULDBLOCK的情况?会中断传输吗?rn3. send是不是和<em>recv</em>在非阻塞情况下一样?rn[code=C/C++]rndo rnrn iResult = <em>recv</em>(ConnectSocket, <em>recv</em>buf, <em>recv</em>buflen, 0);rn if ( iResult > 0 )rn printf("Bytes received: %d\n", iResult);rn else if ( iResult == 0 )rn printf("Connection closed\n");rn elsern printf("<em>recv</em> failed: %d\n", WSAGetLastError());rnrn while( iResult > 0 );rn[/code]rn谢谢大家帮忙解答
单步跟踪可以接收数据,直接运行就不行
Socket 发送Http Post请求WebService,返回数据,代码如下:rnstring strData = "strAssetCode=10221457";rnSocket httpSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);rnhttpSocket.Connect(new IPEndPoint(IPAddress.Parse("192.168.39.97"),8090));rnstring sendStr = "POST /TestService/TestService.asmx/GetAsset HTTP/1.1\r\n";rnsendStr = sendStr + "Host: 192.168.39.97\r\n";rnsendStr = sendStr + "Content-Type: application/x-www-form-urlencoded\r\n";rnsendStr = sendStr + "Content-Length: " + strData.Length + "\r\n\r\n";rnsendStr = sendStr + strData;rnbyte[] sendBuff = Encoding.UTF8.GetBytes(sendStr);rnhttpSocket.Send(sendBuff);rnbyte[] <em>recv</em>Buff = new byte[1024 * 10];rnint iRet = httpSocket.Receive(<em>recv</em>Buff);//单步跟踪这里就可以正确<em>接收数据</em>rnstring <em>recv</em>Str = Encoding.UTF8.GetString(<em>recv</em>Buff,0,iRet);rnrn rnStreamWriter mWriter = new StreamWriter(Application.StartupPath + "\\Debug.txt");rn//mWriter.WriteLine(sendStr);rnmWriter.WriteLine(iRet);rnmWriter.WriteLine(<em>recv</em>Str);rnmWriter.Close();rnrnhttpSocket.Shutdown(SocketShutdown.Both);rnhttpSocket.Close();rn
recv函数
这个<em>函数</em>使用时如果接收的数据大于4096,他就会把数据分成若干个小包rnrn 请问应该怎么处理这种问题rn
===== recv() 函数 =====
<em>recv</em>() <em>函数</em>返回 0 表示什么?rn连接中断?rn还是接收到的数据长度为 0 ?rnrn搜了下两种说法都有,如果这两种情况都存在,该怎么区别?
send函数recv函数
里面有socket<em>函数</em>和<em>recv</em><em>函数</em>的详细讲解,有用
关于recv函数在不知道接收数据大小时如何申请buffer
关于<em>recv</em><em>函数</em>在不知道<em>接收数据</em>大小时如何申请buffer
为什么经常看到socket的recv函数一个一个字节的接收数据
一起收不行吗? 我经常看到这种代码rn char <em>recv</em>Buffer[1024];rn char ch;rn int i=0;rn while(1)rn rn int nLen = <em>recv</em>(sock,&ch,1,0);rn if(nLen <= 0)rn closesocket(sock);rn break; rn rn <em>recv</em>Buffer[i++] = ch;rn rnrn 为什么不<em>直接</em>写成rn <em>recv</em>(sock,<em>recv</em>Buffer,1024,0);rn closesocket(sock);rn 我<em>直接</em>指定收1024个字节, 即使是对方只发送一两个字节,它也会智能的断掉连接的啊?
各位好,我recv函数接收数据不全,请解惑,谢谢!
我写的程序<em>直接</em>跟服务器交互,服务器会返回什么不是我预期。服务器是php响应的rnrn我send之后就<em>recv</em>,发现数据不对,少了很多内容,rnrn用抓包工具抓了一下,发现封包里有0x00<em>结束</em>符,<em>recv</em>就读到这里,后面的就不读就返回了。rnrn但是我在此时继续<em>recv</em>的话,就收不到任何数据,然后直到<em>recv</em>返回0。rnrn请问各位我如何才能把整个封包的内容全部读到呢? 还有那个<em>结束</em>符是怎么回事。。。网页应该是UTF8编码的,谢谢
socket api函数 recv 是如何接收数据的啊???
我用<em>recv</em><em>函数</em>来接收客户端发送的数据但是有一点我搞不明白的就是rn从网络传过来的数据应该是先送到系统的一个缓冲区里的吧?rn当没有数据到达的时候<em>recv</em><em>函数</em>是阻塞的 rn但是当接收了一次数据后会将该系统缓冲区里的数据抹掉吗?rnrn
最值 还有运行直接结束问题
有一个长度为n的整数序列,其中最大值和最小值不会出现在序列的第一和最后一个位置。nn请写一个程序,把序列中的最小值与第一个数交换,最大值与最后一个数交换。输出转换好的序列。 n#includenint main()nn int n,i=0,pos;n int a[]=;n int temp,j;n scanf("%d",&n);n for(i=0;i=0;j--)n n if(a[i]>a[j])n n a[j]=temp;n pos=j;n n n a[pos]=a[i];n a[i]=temp;n for(i=0;i
如何结束TIdTCPClient的接收数据线程?
我使用TIdTCPClient编写客户端数据收发程序,其中数据接收是利用线程来读取的,线程里面读取数据是用FTcpClient.ReadLn<em>函数</em>,代码如下:rn[code=delphi]procedure TReceiveMsgThread.Execute;rnbeginrn inherited;rn tryrn while (not Terminated) and (FTcpClient.Connected) dorn beginrn tryrn if FTcpClient.IOHandler.Readable(1) thenrn beginrn revData := FTcpClient.ReadLn( FDataEndStr);rn Synchronize(HandleRevData);rn end;rn exceptrn if FTCPClient.Connected then FTCPClient.Disconnect;rn Terminate;rn end;rn end; // whilern exceptrn end;rnend;[/code]rn其中FTCPClient线程是在线程创建的构造<em>函数</em>里面赋值的,当没有接收到数据时,ReadLn一直堵塞在哪里,rn我现在想<em>结束</em>线程,但一直出错,不知道该如何<em>结束</em>线程。rn我是新定义了一个类,里面有个字段FReceiveTh,如下:rn [code=delphi]TCom_TCP = class(TObject)rn //....其他省略rn protectedrn //....其他省略rn function HandleRevData(const ARevStr: string): integer;rn publicrn //....rn FReceiveTh: TReceiveMsgThread; rn FIdTCPClient: TIdTCPClient;rn constructor Create; overload;rn destructor Destroy; override;rn //...rn end;rn//..........rnconstructor TCom_TCP.Create;rnbeginrn inherited Create();rn FIdTCPClient := TIdTCPClient.Create(nil);rn FReceiveTh := TReceiveMsgThread.Create(true, FIdTCPClient); // 创建线程后先挂起rn FReceiveTh.FreeOnTerminate := false;rn FReceiveTh.FFun_HandleRevData := self.HandleRevData;rn FReceiveTh.OnTerminate := RthEndHander;rnend;rndestructor TCom_TCP.Destroy;rnbeginrn if Assigned(FReceiveTh) thenrn beginrn if CheckThreadFreed(FReceiveTh) = 1 then // 这个<em>函数</em>是用来判定线程是否在工作rn beginrn FReceiveTh.Suspend; // 挂起线程rn FReceiveTh.Terminate; // <em>结束</em>线程rn end; rn FreeAndNil(FReceiveTh);rn end;rn FreeAndNil(FIdTCPClient);rn inherited;rnend;[/code]rn现在想<em>结束</em>TCom_TCP对象时,调用TCom_TCP.Free时就卡死了,程序好像进入死循环。
程序有错误,VS2005却直接运行
上次调试程序时断了电,很多配置都变了。rn我写的程序有错误,我点那个小三角(start debugging),程序不报错,<em>直接</em>就<em>运行</em>上一次调试生成的文件,把那个文件删除了,它也<em>直接</em><em>运行</em>,只是<em>运行</em>时工程会crash。我点编译它倒会报错。因为工程比较大,编译时间比较长,不能每次都去靠这个排错。谁碰到过这种情况,给小弟说一下改哪的配置吧?多谢了。
recv接收数据的问题,在线等。急!!!
我写的服务程序是发现当接受大约6000字节的时候,接收需要10ms。而当发送60字节的时候需要200ms,不知道为什么?急!!rn服务端和客户端分别<em>运行</em>在两台机器上,会出现上述情况,若<em>运行</em>在同一台机器上则不会出现上述情况。rn发送和接受都是每次发送512字节,接收时也是每次接收512字节。直到接收完成为止。rn以下是接收的代码rnrn接收代码如下:rnint sockRecvData(unsigned int& Sock,char* p<em>recv</em>buf,long Data_Length)rnrnrnint rval=0;rnSOCKET sock=(SOCKET)(Sock);rnchar receivebuf[NORMALBUFFERSIZE];//<em>接收数据</em>的缓存rnlong Data_Count = 0;//收到的数据总量rnint <em>recv</em>Buf_Length = 0;//单次收到的数据量rnWSAEVENT event = ::WSACreateEvent();rn::WSAEventSelect(sock, event,FD_READ);rnlong <em>recv</em>starttime=GetTickCount();rnint nRet = ::WaitForSingleObject(event, WAIT_FOR_RECV_TIME);//5*1000);rnrnif(nRet == WSA_WAIT_TIMEOUT)// 定时显式状态信息rnrnprintf("----ERROR:Wait For Recv Data TimeOut----\n");rnrval=-4;//等待超时rnrnelsernrnwhile(1)rnrnmemset(receivebuf,0,sizeof(receivebuf));rnint <em>recv</em>Length=(Data_Length-Data_Count)0)rnrnmemcpy(&p<em>recv</em>buf[Data_Count],receivebuf,<em>recv</em>Buf_Length);//将每次收到的数据放到<em>recv</em>Buf中rnData_Count+=<em>recv</em>Buf_Length;rn//把单次收到的数据长度累加rnif(<em>recv</em>Buf_Length==0)rnrnint closeerr=WSAGetLastError();rnif(Data_Count!=Data_Length)rnData_Count=-1;rnbreak;rnrnif(Data_Count == Data_Length)//收到的数据总长度等于要接收的数据总长度,跳出rnbreak; rnrnrnWSACloseEvent(event);rnlong <em>recv</em>endtime=GetTickCount();rnprintf("<em>recv</em> data used time %d\n",<em>recv</em>endtime-<em>recv</em>starttime);rnrnreturn Data_Count;rnrn发送时先发送个包头,然后发送内容。rn结果发现当接收内容时若发送的字节数为60则会在int nRet = ::WaitForSingleObject(event, WAIT_FOR_RECV_TIME);//5*1000);rn等待大约200ms,若发送的字节数为6000则只会等待10ms不知道为什么?rn盼高手答复rnrn
hook recv debugprint 接收数据输出补丁
hook <em>recv</em><em>函数</em>.将接收的数据在debugview窗口格式输出
在非阻塞模式下如何知道recv接收数据完成
将socket设为非阻塞模式,然后用select进行I/O复用,如果有数据可读,那么就调用<em>recv</em>进行读取,但是因为是非阻塞的,所以我们要用循环进行不断读取,那么如何知道数据读取完成了呢? 我认为当<em>recv</em>返回的字节数小于0,errno==EAGAIN的时候数据读取完成,不知道对不对??rnrnrnif(FD_ISSET(sock_fd, &fds_red))rnrn //receive datarn dorn rn retlen = <em>recv</em>(sock_fd, ptr, leftlen, 0) ;rn if(retlen < 0)rn rn if(errno == EAGAIN)rn break;rn else if(errno == EINTR || errno == EWOULDBLOCK)rn retlen = 0;rn elsern syslog(LOG_ERR, "%s:%d, <em>recv</em> data error is %d", __FILE__, __LINE__, errno);rn rn <em>recv</em>len += retlen;rn leftlen -= retlen;rn ptr += retlen;rn rn while(<em>recv</em>len && leftlen);rn
TCP通信,recv接收数据需要注意的地方?
        关于TCP通信中,<em>recv</em><em>函数</em><em>接收数据</em>大小的问题,之前一直觉得,只要是客户端与服务器一发一收的模式,那么<em>recv</em>接收的数据大小一定是<em>函数</em>中指定的数据大小。这次写了客户端与服务器通信的程序,在这上面栽了一个大跟斗。        程序功能如下:通过客户端与服务器的通信,实现文件的传输,客户端每次发送1k的数据,服务器每次接收1k大小数据并将数据存储到文件中,就这样一发一收的循环发送接...
怎么能使recv正确的循环接收数据
void <em>recv</em>loop()rnrn char buf[1024];rn int bytes = 0;rn rnrn while(1)rn rn bytes = <em>recv</em>(mSocket, buf, sizeof(buf), 0);rn rn rn if (bytes!=0)rnrnAfxMessageBox(buf);rnrnrnrn这样写根本接受不到数据,请高手们给指点一二
recv接收数据不完整,请问如何解决??谢谢
我send给服务器一个包,就开始<em>recv</em>,但是收到的字节远小于服务器应该给我返回的字节rnrn因为我用抓包工具看用IE跟服务器通讯的封包是:IE发一个包,服务器返回好多包,第一个包是信息之类的,后面就都是乱码,UTF8格式的rnrn现在我自己写软件,只能得到第一个包,收到一些信息,后面的UTF8格式的数据全都收不到,再次<em>recv</em>就阻塞了没数据了。。rnrn我用char 和 WCHAR指针都不能接收到数据(之前我以为是这个问题),请问各位兄弟们,我要怎样收到所有的包呢?rnrn我的<em>recv</em>缓冲区绝对是够大的。谢谢!
如何在accept断开的情况下结束recv函数
功能:rn程序等待连接,每接到一个连接就会开启一个<em>recv</em>线程,我的程序现在的情况是<em>recv</em>等待时间一长,当网关有信息要传递到我的程序时,网关就会重新连接我的程序,导致accept接到一个连接,重复开启<em>recv</em>线程,我想在重复开启<em>recv</em>线程之前,关闭先前的<em>recv</em>线程,rn怎么办?rn
send()函数recv()函数的处理问题
我想发送rnchar info[]="hello word"rnrn在send()<em>函数</em>中应该是send(s,info,strlen(info),0);还是(s,info,strlen(info)+1,0);rnrn同时在接受上述信息时应该用<em>recv</em>(s,&NenInfo,st[color=#FF0000]rlen(info),[/color]0)还是rn<em>recv</em>(s,&NenInfo,[color=#FF0000]strlen(info)+1[/color],0)
SOCKET编程recv函数问题
我Win 7系统用VS2008写SOCKET程序下载一个文件:rn我send.... GET /down.exern CHAR szRecvBuffer[1000] = NULL;rn WORD wSize = sizeof(szRecvBuffer);rnrn ZeroMemory(szRecvBuffer, wSize);rnrn WORD wRecvLen = 0;rn*| wRecvLen = <em>recv</em>(Socket, szRecvBuffer, wSize, NULL);rnrn puts(szRecvBuffer);rnrn如果在*标记的那句加入断点,按一下F10执行一下<em>recv</em><em>函数</em>的时候,第一次wRecvLen会返回1000.rn文件信息和内容连在一起。rn但是如果没有断点,<em>直接</em><em>运行</em>程序,<em>recv</em><em>函数</em>只会返回272(也就是文件信息的一些内容)rn然后在下一回是内容。rn请问这是为什么?
recv函数超时问题
使用socket编程实现2台电脑之间的通信,其中一台是服务器,程序如下:rn servfd = socket()rnrn rnrn setsockopt(); rnrn bind();rn rnrn listen();rn while(1)rn rn clifd = accept(servfd,(struct sockaddr*)&cliaddr,&length);rn if (clifd < 0)rnrn rnrn perror("1");rnrn rnrn else if ((pid = fork()) < 0)rn perror("2");rn else if (pid == 0) /* Child */rn rn while(1)rn rn Ret=select(0x7FFFFFFF,&readfds,NULL,NULL,&timeout);rn rn if(Ret==-1) rn printf("error "); rnrn else if (Ret==0)rn rn printf("time out");rn ...........................rn rn else rn rn length = <em>recv</em>(clifd,buf,BUFFER_SIZE,0);rn ...........................rn rn rn rn exit(0);rn rn延时设置成了5秒,现在的问题是当客户端电脑发出请求,经server端accept,建立连接后,不管客户端是否发送数据,server都不断显示time out,即Ret一直为0。而我的本意是server端的<em>recv</em><em>函数</em>只等待5秒钟,如果客户端5秒内发出了数据,则处理数据;如果5秒钟内没有数据,则<em>recv</em>不再等待,将顺序执行其他的程序,但是当客户端有数据发送时,将在下一次循环到select语句时,通过Ret>0到第三个分支来处理数据。rn请问各位,这个问题该如何解决,谢谢!rn
关于winsock的recv()函数
前提:建立了一个TCP连接,并发出了请求,现在<em>接收数据</em>。使用winsock,不使用封装socket的类。rnrn问题一:一个TCP包的大小大于系统缓存,这种情况会怎样?rn比如:系统输入缓冲区(<em>recv</em>()从该系统缓冲中去数据)大小为1024字节,有一个1524字节的tcp包发了过来。会发生什么事?rnrn问题二:程序中的缓存比较小。rn比如:系统输入缓冲区大小为1024字节,程序中的缓存(<em>recv</em>()将数据读到该缓存中)只有300字节。有一个500字节的tcp包发了过来,并进入了系统缓存。接着,<em>recv</em>()从系统缓存中读300字节的数据到程序缓存中,并将这些数据从系统缓存中删除,系统缓存中就剩下200字节的数据。这时,又来了一个500字节的tcp包,这个包会进入系统缓存么?此时调用<em>recv</em>()会将700字节(200+500)的数据一起读入程序缓存么?还是先读200字节,再次调用<em>recv</em>()时才读剩下的500字节。
socket编程中的recv函数
用<em>recv</em>()<em>函数</em>接收客户端socket发过来的数据没问题,但是当用telnet连接服务器端,并向服务器端的socket监听端口发送数据时,只接收了一个数据,就立刻往下走了,不再继续接收了。。怎么才能让它在telnet连接后,输入数据并敲入回车符时才停止接收?rnrn代码:rnServer端:rn<em>recv</em>(sockConn,<em>recv</em>Buf,100,0);rnrntelnet 10.80.1.122 6000rn//连接后输入rn500,600,700rn//结果服务器端socket只接收到了5这个字符。rnrnrn请大虾们不吝赐教,新手轻拍。。
请问winsock的recv函数
当我的客户端调用<em>recv</em>()时,如果此时服务器没有发过来信息,此时,<em>recv</em>()是立 rn即返回还是直到接受到数据才返回。一直都没看懂。请大虾指教! rn 同时,send和<em>recv</em><em>函数</em>可不可以同时使用,即在调用<em>recv</em>的时候在调用send来发送消息 rn呢?请指点! rn
【急】关于recv函数?
socket编程中的<em>recv</em><em>函数</em>在阻塞模式下会等到有send的时候才会执行<em>recv</em>,执行完毕后继续向下执行。rn问题:rn1)一个<em>recv</em>对应一个send吗?rn2)<em>recv</em><em>函数</em>会不会出现send 100个字节,但只接收了50个字节就向下执行的情况?rn即:<em>recv</em>会不会不完全接收send发送的数据而造成数据的丢失?还是说<em>recv</em>肯定会全部接收完毕了rn才继续向下执行?(这个问题的前提是传给<em>recv</em><em>函数</em>的数组空间足够容纳一次send发送的数据)。rn
关于recv函数的问题
在网上看到这么一段话rnrn这里只描述同步Socket的<em>recv</em><em>函数</em>的执行流程。当应用程序调用<em>recv</em><em>函数</em>时,<em>recv</em>先等待s的发送缓冲中的数据被协议传送完毕,如果协议在传送s的发送缓冲中的数据时出现网络错误,那么<em>recv</em><em>函数</em>返回SOCKET_ERROR,如果s的发送缓冲中没有数据或者数据被协议成功发送完毕后,<em>recv</em>先检查套接字s的接收缓冲区,如果s接收缓冲区中没有数据或者协议正在<em>接收数据</em>,那么<em>recv</em>就一直等待,只到协议把数据接收完毕。当协议把数据接收完毕,<em>recv</em><em>函数</em>就把s的接收缓冲中的数据copy到buf中([color=#FF0000]注意协议接收到的数据可能大于buf的长度,所以 在这种情况下要调用几次<em>recv</em><em>函数</em>才能把s的接收缓冲中的数据copy完。<em>recv</em><em>函数</em>仅仅是copy数据,真正的<em>接收数据</em>是协议来完成的[/color]),<em>recv</em><em>函数</em>返回其实际copy的字节数。如果<em>recv</em>在copy时出错,那么它返回SOCKET_ERROR;如果<em>recv</em><em>函数</em>在等待协议<em>接收数据</em>时网络中断了,那么它返回0。rnrnrnrnrnsend的数据不是只能小于buf的长度吗,为什么协议接受到得数据有可能大于buf的长度rnrn
recv函数的调用的问题
PORTPARAM* portparam1=(PORTPARAM*)pParam;rn sockaddr_in addr;rn addr.sin_family=AF_INET; rn addr.sin_addr.S_un.S_un_b.s_b1=portparam1->a; rn addr.sin_addr.S_un.S_un_b.s_b2=portparam1->b;rn addr.sin_addr.S_un.S_un_b.s_b3=portparam1->c;rn addr.sin_addr.S_un.S_un_b.s_b4=portparam1->d; rn addr.sin_port=htons(portparam1->iPort);rn SOCKET sck_Conn;rn sck_Conn=socket(AF_INET,SOCK_STREAM,0);rn if(sck_Conn==INVALID_SOCKET)rn rn delete pParam;rn AfxMessageBox("创建失败");rn return 0;rn rn elsern AfxMessageBox("创建成功");rn sck_Conn=socket(AF_INET,SOCK_STREAM,0);rn int ddd=connect(sck_Conn,(sockaddr*)&addr,sizeof(addr));rn if(ddd==SOCKET_ERROR)rn rn closesocket(sck_Conn);rn AfxMessageBox("连接失败");rn delete pParam;rn return 0;rn rn elsern AfxMessageBox("连接成功");rn char buffer[256];rn strcpy(buffer,"");rn ddd=<em>recv</em>(sck_Conn,buffer,256,MSG_PEEK);rn if(ddd==SOCKET_ERROR)rn rn closesocket(sck_Conn);rn AfxMessageBox("接受失败");rn delete pParam;rn return 0;rn rn elsern AfxMessageBox("接受成功");rn if(strcmp(buffer,"")!=0)rn rn CString aa="";rn for(int i=0;i128||buffer[i]iPort,buffer); rn AfxMessageBox(aa);rn closesocket(sck_Conn);rn rn if(g_message.GetLength()>30000)rn rn g_message="";rn rn g_message=aa+g_message; rn ::SetWindowText(portparam1->hwnd,g_message);rn// CListBox *pList=(CListBox*)portparam1->hwnd;rn// pList->AddString(g_message);rn rn rn else if(strcmp(buffer,"")==0)rn AfxMessageBox("buffer为空");rn delete pParam;rn return 0;rn上面是我编写的端口扫描的扫描线程的<em>函数</em>,在connect之后调用<em>recv</em><em>函数</em>接受返回的数据,为什么<em>运行</em>时,只能返回本地主机的端口具体信息,而扫描局域网其他主机时,<em>recv</em><em>函数</em>调用是成功的,但buffer里却是空的,没有接受到字符?rn还有就是这个程序在用集线器连接的网络中能扫描到本机的端口信息,而在机房里的服务器的局域网中,返回的buffer也是空,这是怎么回事?rn哪位大哥给解决一下!急切盼望中rn
recv函数的阻塞问题
<em>recv</em>是阻塞<em>函数</em>,如果没有接收到数据,程序应该阻塞在那,就像accept那样。我在客户端写了接收程序,rn for(int i=0;i);rn rn可是我发现,不开服务器端,<em>直接</em><em>运行</em>客户端,程序并没有阻塞在<em>recv</em>,打印了四次12就退出了。请问这是什么原因?
recv函数的问题?
我用WinSocket API写了一个从www服务器中获得网页内容的程序。rn但在使用<em>recv</em><em>函数</em>时遇到了如下问题:rn当获取某些较小的(几百个字节到几千个字节)GIF/JPG图像文件时,rn<em>recv</em><em>函数</em>总是只能获得很少的一部分数据,rn然后就阻塞(我用的是阻塞模式)。rn过了一会儿<em>recv</em>返回0值,说获取完了。rn但事实上还有大部分数据没有取得。rn对html,swf等文件却没有这样的情况。rn为什么呢?rn有写过代理服务器程序的吗?有没有遇到这样的问题?
关于recv send函数
对于发送大量数据的情况下,需要用循环吗,他们的参数说明要发送的长度。还需要用循环吗?rnstatic 可以实现文件变量的隐藏,为什么?rn
直接运行出错,调试运行为何却可以?
我编写了一个通信显示程序,通信部分放在VIEW类中。初始化SOCKET部分放在ON_CREAT中,在VIEW中析构<em>函数</em>中close掉SOCKET。现在出现了一个问题:调试<em>运行</em>时,程序显示正常;但<em>直接</em><em>运行</em>却常常出现SOCKET初始化错误。我有几个问题向大家请教:rn1、为什么开机第一次<em>直接</em><em>运行</em>正常后,随后<em>直接</em><em>运行</em>常常出现SOCKET初始化错误?rn2、调试<em>运行</em>时,程序为什么又正常显示?rn3、SOCKET初始化代码最好放在VIEW类中,还是DOC类中,或是其它类中(老实说,我不知道它们的区别,似乎都可以)?<em>接收数据</em>代码又应该放在哪个类中(程序是用MFC标准生成)?rn4、关闭SOCKET代码放在VIEW的析构<em>函数</em>中是否会执行?放在哪个<em>函数</em>中合适?如果不关闭SOCKET,退出程序时,是否自动关闭?rnrn请大家不吝赐教!rn
串口接收数据程序,单步调试可以收到数据,但是直接运行却收不到
我是通过另外一台电脑上的串口调试工具发送数据,每100毫秒发送一次,发送内容是chinarn单步调试的时候可以接收到数据,但是<em>直接</em><em>运行</em>就收不到数据了!rn一下是单步调试的截图、<em>直接</em><em>运行</em>的截图和源代码rnrnrn图一单步调试rn[img=http://b25.photo.store.qq.com/http_imgload.cgi?/rurl4_b=5d7bf12b09d07872516bec392a6260685acabd7e31969cda82ae51c15d21f51bd8195810ccb3abde377bdb33960a095ad202f60fa7b9226d819380054e18f2919a2f8bd445671b57b2254e2015907c199845c53f&a=28&b=25][/img]rnrn图二 单步调试 缓冲区lpinbuffer中显示,接收到了数据chinachinachinachinachinarn[img=http://b28.photo.store.qq.com/http_imgload.cgi?/rurl4_b=5d7bf12b09d07872516bec392a62606856eec51134a0328f4c2ede2c50264c35538a159157877b7b657495e16c9023f4068b684c6929f22fedcf822d62eb83cc58d82ed9cb9aaf85187271005dd05301b01da65e&a=28&b=28][/img]rnrn图三图三 <em>直接</em><em>运行</em>,但是收不到数据rn[img=http://b28.photo.store.qq.com/http_imgload.cgi?/rurl4_b=5d7bf12b09d07872516bec392a62606877b9878e99a4248a64b8b53c7c0ee8ccb50b23bc8d42f6522f0591d134b1d5d2daae6dd312f9bef6b89c2e695dd3289e2730019ba49a1573974d68c1ebc505661e083126&a=28&b=28][/img]rnrn下面是源代码:rnrn#include rn#include rnint main()rn rn BOOL bReadStatus;rn char lpInBuffer[1024]=0; rn DWORD dwBytestoRead=1024;rn DWORD dwBytesRead;rn DWORD dwErrorFlags; rn DCB dcb;rn COMSTAT ComStat;rn COMMTIMEOUTS TimeOuts;rn OVERLAPPED m_osRead;rn HANDLE hCom; //全局变量,串口句柄rnrn hCom=CreateFile("COM2", //COM2口rn GENERIC_READ|GENERIC_WRITE, //允许读和写rn 0, //独占方式rn NULL,rn OPEN_EXISTING, //打开而不是创建rn FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, //重叠方式rn NULL);rn if(hCom ==INVALID_HANDLE_VALUE)rn rn printf("打开COM失败!");rn return FALSE;rn rnrn SetupComm(hCom,1024,1024); //输入缓冲区和输出缓冲区的大小都是1024rn //设定读超时rn TimeOuts.ReadIntervalTimeout=200;rn TimeOuts.ReadTotalTimeoutMultiplier=1000;rn TimeOuts.ReadTotalTimeoutConstant=1000;rnrn TimeOuts.WriteTotalTimeoutMultiplier=100;rn TimeOuts.WriteTotalTimeoutConstant=500;rn //设定写超时rnrnrn GetCommState(hCom,&dcb);rnrn dcb.BaudRate=9600;//波特率为9600rn dcb.ByteSize=8;//每个字节有8位rn dcb.Parity=0;//无奇偶校验位rn dcb.StopBits=1;//一个停止位rnrn SetCommState(hCom,&dcb);rn PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);rn memset(&m_osRead,0,sizeof(OVERLAPPED));rn m_osRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);rnrn/////////////////////////////开始读//////////////////////////////rn while(1)rn rn ClearCommError(hCom,&dwErrorFlags,&ComStat);rnrn dwBytesRead=min(dwBytestoRead,(DWORD)ComStat.cbInQue);rn printf("接收%d,%d\n",ComStat.cbInQue,dwBytesRead);rn rn if(ComStat.cbInQue==0)rn printf("Com Error\n");rn rn bReadStatus=ReadFile(hCom,lpInBuffer,dwBytestoRead,&dwBytesRead,&m_osRead);rn puts(lpInBuffer);rn if(!bReadStatus) //如果ReadFile<em>函数</em>返回FALSErn rn if(GetLastError()==ERROR_IO_PENDING)//GetLastError()<em>函数</em>返回ERROR_IO_PENDING,表明串口正在进行读操作rn rn WaitForSingleObject(m_osRead.hEvent,2000);rn // PurgeComm(hCom, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);rn return dwBytesRead;rn rn return 0;rn rn printf("Receiveed data:\n"); rn puts(lpInBuffer); rn //printf("%s\n",lpInBuffer);rn PurgeComm(hCom,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);rn // CloseHandle(hCom); rn rn //return dwBytesRead; rn
网络编程 recv()函数
<em>recv</em>()是编程语言<em>函数</em>。 <em>函数</em>原型int <em>recv</em>( _In_ SOCKET s, _Out_ char *buf, _In_ int len, _In_ int flags); 这里只描述同步Socket的<em>recv</em><em>函数</em>的执行流程。当应用程序调用<em>recv</em><em>函数</em>时: (1)<em>recv</em>先等待套接字s的发送缓冲中的数据被协议传送完毕,如果协议在传送s的发送缓冲中的数据时出现网络
关于 recv函数
/* int <em>recv</em>( SOCKET s, char FAR *buf, int len, int flags);(1)<em>recv</em>先等待s的发送缓冲中的数据被协议传送完毕, 如果协议在传送s的发送缓冲中的数据时出现网络错误,那么<em>recv</em><em>函数</em>返回SOCKET_ERROR,(2)如果s的发送缓冲中没有数据或者数据被协议成功发送完毕后, <em>recv</em>先检查套接字s的接收缓冲区,如果s接收缓冲区中没有
recv函数的问题``
我写了个socket 服务程序,用的是消息模型,能和对方通信,即FD_READ,FD_ACCEPT这些都能收到,但是我在FD_READ里<em>recv</em>的时候,返回值不是-1,而是对方发送过来的数据的长度,但是buf里面却没数据,全都是''(buf里面原来没收到数据时都是"烫"这个字,即没初化时的内容),请教什么原因啊``
select与recv函数
rn最近拿SDK练手,写个了FTP的客户端。下面是我写的MLSD后的接收<em>函数</em>。rn1, FD_ZERO(&fds);FD_SET(nSocket,&fds);tv.tv_sec=10;tv.tv_usec = 0;放在循环外可以吗?溢出时间设置多少合适。rn2,select第一个参数要传nSocket+1还是NULL;rn3,接收文件时,为什么看到很多人会把<em>recv</em>最后个参数设置成MSG_PEEK?rnrn[code=C/C++]LPSTR FtpSocket::_GetNextLine(SOCKET nSocket, LPDWORD dwLen)rnrn BOOL bSuccess = FALSE;rn INT nRecv = 0;rn rn fd_set fds;rn timeval tv;rn rn while (nRecv < MAX_REPLY_LEN)rn rn FD_ZERO(&fds);rn FD_SET(nSocket,&fds);rn tv.tv_sec=10;rn tv.tv_usec = 0;rn if (select(nSocket+1,&fds,NULL,NULL,&tv)> 0)rn rn if (<em>recv</em>(nSocket, &lpszBuffer[nRecv], 1, 0) ;rn *dwLen = nRecv - 1;rn return lpszBuffer;rn rn elsern rn return NULL;rn rn[/code]
关于RECV函数的问题
我在做一个通讯的项目,需要一个外面的接受<em>函数</em>RECV一直<em>运行</em>着,同时SEND方法要发送后要等待服务器回复,如何调整使RECV不出问题,现在在SEND中使用TERMINATETHREAD来关掉一直<em>运行</em>着的RECV,但有明显的内存泄漏
linux 网络编程 recv函数
使用select检测到有数据可读,但调用<em>recv</em><em>函数</em>却并未读取到数据,返回值为0,这个大概是什么原因造成的呢?
关于recv函数的疑问
<em>recv</em><em>函数</em>的疑问,情况如下:rnrn现在这里是一个服务端程序,现在accept<em>函数</em>成功返回一个链接套接字句柄,而后又接受到另一个链接,所以现在一共两个套接字句柄,我们称其为h1和h2。rnrn请问,这两个套接字句柄不同,是不是公用一个缓冲区。rnrn具体一点,客户端1通过套接字h1 发送给服务端程序一串数据。在服务端这边,使用<em>recv</em>(h2,……);是否可以接收到数据(前提是是客户端2没有通过h2给服务端程序发送数据)。rnrn总结一句,就是想知道接收缓冲区是不是按照每个套接字句柄独立分配的,还是所有的链接用一个缓冲区。rnrn谢谢。
recv()函数的参数解析--MSG_PEEK
<em>recv</em>()的原型是ssize_t <em>recv</em>(int sockfd, void *buf, size_t len, int flags);  我们在编写<em>函数</em>时,通常flags设置为0,此时<em>recv</em>()<em>函数</em>读取tcp 缓冲区中的数据到buf中,并从tcp 缓冲区中移除已读取的数据。如果把flags设置为MSG_PEEK,仅仅是把tcp 缓冲区中的数据读取到buf中,没有把已读取的数据从tcp
关于recv()和send()函数
比如说,先用send()<em>函数</em>发了一段数据,然后用send()发了另一段数据,另一端,也分别用了两个<em>recv</em>()接收,那这两段数据是不是一定会被正确接收,第一个<em>recv</em>()接收第一段数据,第二个<em>recv</em>()接收第二段数据,还是第一个可能会收到第二个的一部分,或第二个也可能受到第一个的一部分呢?
recv函数不太懂
WSAIoctl(m_SOCKET, SIO_RCVALL, &optval, sizeof(optval), NULL, 0, &dwBytesRet, NULL, NULL);rn设置了接受所有数据后,用<em>recv</em><em>函数</em>来抓包,但我发现在不同的电脑上效果不一样,我在笔记本上就可以抓到所有的数据包(包括发送出去的及别的机器发送过来的数据),但在我的台式机上就自能抓到别的机器向我的机器发送的数据包,而不能抓到我的机器向别的机器发送的数据包。不知道这是为什么。
recv函数使用实例
<em>recv</em><em>函数</em>使用实例 本节将讲解一个<em>recv</em><em>函数</em>使用实例。在程序中,连接到北京大学的FTP服务器,然后用<em>recv</em><em>函数</em>取得ftp服务器返回的信息。北京大学的FTP服务器域名如下所示。 ftp.pkp.edu.cn 在终端中输入下面的命令,取得这个域名的IP地址。 ping ftp.pku.edu.cn 终端中显示的结果如下所示。 PING vine...
recv函数的问题
我用WinSocket API写了一个从www服务器中获得网页内容的程序。rn但在使用<em>recv</em><em>函数</em>时遇到了如下问题:rn当获取某些较小的(几百个字节到几千个字节)GIF/JPG图像文件时,rn<em>recv</em><em>函数</em>总是只能获得很少的一部分数据,rn然后就阻塞(我用的是阻塞模式)。rn过了一会儿<em>recv</em>返回0值,说获取完了。rn但事实上还有大部分数据没有取得。rn对html,swf等文件却没有这样的情况。rn为什么呢?rn有写过代理服务器程序的吗?有没有遇到这样的问题?
问个recv函数的问题
想实现通过socket来发送命令,即服务器端每次收到命令处理后继续等待客户端发送来的命令,用了seng、<em>recv</em><em>函数</em>,这两<em>函数</em>都是阻塞的。rn客户端有程序:rn......rnif (connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr))==-1)rnrn perror("connect");rn exit(1);rnrnif ((sendbytes=send(sockfd,buf,6,0))==-1)rnrn perror("send");rn exit(1);rn......rn服务器端程序:rnif ((new_sock = accept(serv_sock, (struct sockaddr *)&their_addr, &sin_size)) == -1)rnrn exit_fatal("accept");rnrn......rnwhile(1)rnrn ......rn if((<em>recv</em>bytes = <em>recv</em>(new_sock,buf,6,0))==-1)rn rn exit_fatal("<em>recv</em>");rn rn ...... rnrn......rn但最后测试的结果却是客户端发送一次后,如命令字是AAAAAA,服务器端却会连续的调用<em>recv</em><em>函数</em>接受到AAAAAArn即最后结果是rnAAAAAArnAAAAAArnAAAAAArnAAAAAArn......rn怎么会出现这种情况呢,如何修改才能使服务器端收到一个AAAAAA后等待客户端继续发送命令呢。rn谢谢rn
关于服务器端Recv函数
编写一个简单聊天程序,需要服务器中转,服务器端用win32API编程,客户端无所谓。rn现在有一个问题:当多个客户端连接在服务器上,在服务器端调用Recv<em>函数</em>接收信息时,怎样判定,此次接收信息时,该用哪一个套接字接收呢?也就是怎样判定,此次信息,是哪一个客户端发送过来的呢?rn小弟菜鸟,恳请大侠们帮助,谢谢!!!
send和recv函数的问题
我在网上看到rn这是发送、接收<em>函数</em>的原型rnint send( SOCKET s, const char FAR *buf, int len, int flags ); rnint <em>recv</em>( SOCKET s, char FAR *buf, int len, int flags ); rnrn看到网上说rn[color=#FF0000]send仅仅是把buf中的数据copy到s的发送缓冲区的剩余空间里[/color]rn[color=#FF0000]<em>recv</em><em>函数</em>仅仅是copy数据,真正的<em>接收数据</em>是协议来完成的[/color]rn这两句话我明白,就是SOCKET对象底层维护着一个接收和发送的缓存。在发送和接收的时候,都是对这个缓存操作的。rnrn现在我的问题是。如果服务器A 的 <em>recv</em>正在等待对方的数据堵塞在那里。对方客户A 的send已经把他要发送的数据copy到了他的缓冲区里,这时,突然对方关掉了SOCKET那么复制进客户A的发送缓存中的数据是否还会发送到我这边?我这边是接收到完整的数据。还是返回服务器A 的<em>recv</em><em>函数</em>返回SOCKET_ERROR?rnrn请高手指点
socket编程recv函数
linux下socket编程使用<em>recv</em><em>函数</em><em>接收数据</em>,在没有数据到来时,<em>recv</em><em>函数</em>为何还执行,资料上说在没有数据到来时<em>recv</em><em>函数</em>处于等待状态,可是我的程序在没有数据到来时<em>recv</em><em>函数</em>还是会执行,请大神指教。rn简单描述一下我的<em>recv</em><em>函数</em>:<em>recv</em>(sockfd,buf,len,MSG_WAITALL);
recv函数的使用和本质
n 适用人群n n windows网络编程的初学者n nnn 课程概述n n 课程简介:n这部教程是windows网络编程课程的第一部分课程:tcp/ip协议n后续会有第二部分课程:udp/ip协议以及第三部分课程http协议的课程发布。希望能够帮助到大家。n课程内容:nc/s模型的编码,5种windows网络模型:select,异步选择,事件选择,重叠io,完成端口,以及基础理论知识的讲解。n课程分八章,总课时100课时左右,每日更新2~5节.n课程代码会带大家一行一行书写,保证大家都能够学会。n课程适合人群:n网络编程爱好者,网络编程初学者n课程章节:n第一章 c/s模型的讲解以及代码实现n第二章 select模型的讲解以及代码实现n第三章 异步选择模型的讲解以及代码实现n第四章 事件选择模型的讲解以及代码实现n第五章 重叠i/o模型的讲解以及代码实现n第六章 完成端口模型的讲解以及代码实现n第七章 tcp/ip基础知识的讲解,包括网络分层,三次握手,四次挥手,协议头等等。n n
在$.ajax的sccess函数直接结束当前外部函数
大题问题是,单击一个按钮后,首先调用一个.ajax在一个数据库表中验证输入的数据是否存在。验证完全后,接下来会有其他的.ajax执行提交值到另一个表。rn现在要做的是,在第一个.ajax验证阶段,如果输入的值是不存在的,则<em>结束</em><em>结束</em>按钮的执行,下面也不再提交了?rn[code=javascript]rn$('#111').click(function()rnrn...rn$.ajax(rn...rnsuccess:function()rn//如果输入的数据不存在,后面的都不执行rnrn);rnrn...rn$.ajax(rn//数据存在会执行rn);rn);rn[/code]
函数WSARecvFrom接收数据的问题
WSARecvFrom这个<em>函数</em>其中一个参数是lpBuffers:一个指向WSABUF结构数组的指针。rnrn我在接收时只能接收到第一个WSABUF结构体发送过来的内容。rnrn第二个WSABUF结构体的内容没有接收到。rnrn其实也不能说没有接收到,应该是接收到了,而没有保存到第二个WSABUF结构体中。rnrn发送接收都没有提示错误,而且发送字节和接收字节都一样。rnrn本人小菜,研究了好久都不明白,下面是代码,大家帮忙看看哪里有问题。rnrn谢谢大家rnrnrn发送代码:rnrn WSABUF buf[2];rn DWORD dwSend;rn rn SOCKADDR_IN addrSend;rn addrSend.sin_addr.S_un.S_addr=inet_addr("192.168.1.188");rn addrSend.sin_family=AF_INET;rn addrSend.sin_port=htons(4567);rn rn CString strBuf1;rn CString strBuf2;rn int len;rnrn GetDlgItemText(IDC_EDIT_SEND1,strBuf1);rn len=strBuf1.GetLength();rn buf[0].buf=strBuf1.GetBuffer(len);rn buf[0].len=len+1;rnrn GetDlgItemText(IDC_EDIT_SEND2,strBuf2);rn len=strBuf2.GetLength();rn buf[1].buf=strBuf2.GetBuffer(len);rn buf[1].len=len+1;rnrn SetDlgItemText(IDC_EDIT_SEND1,"");rn SetDlgItemText(IDC_EDIT_SEND2,"");rn rn if(SOCKET_ERROR==WSASendTo(m_socket,buf,2,&dwSend,0,(SOCKADDR*)&addrSend,sizeof(SOCKADDR),NULL,NULL))rn rn MessageBox("发送数据失败!");rn return;rn rn CString str;rn str.Format("发送了%d个字节",dwSend);rn MessageBox(str);rnrnrn接收代码:rnrn WSABUF buf[2];rn buf[0].buf=new char[1024];rn buf[0].len=1024;rn buf[1].buf=new char[1024];rn buf[1].len=1024;rn DWORD dwRecv;rn DWORD dwFlg=0;rn rn int len=sizeof(SOCKADDR);rn SOCKADDR_IN addrFrom;rn if(SOCKET_ERROR==WSARecvFrom(m_socket,buf,2,&dwRecv,&dwFlg,(SOCKADDR*)&addrFrom,&len,NULL,NULL))rn rn MessageBox("<em>接收数据</em>失败!");rn return;rn rn rn SetDlgItemText(IDC_EDIT_RECV1,buf[0].buf);rn SetDlgItemText(IDC_EDIT_RECV2,buf[1].buf);rnrn CString str;rn str.Format("接收了%d个字节",dwRecv);rn MessageBox(str);
spcomm接收数据函数
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;rn BufferLength: Word);rnvarrn tmpArray:array[0..4096] of Byte;rn ArraySize,i: DWORD;rn Count:DWORD;rn tmpStr:string;rn pStr:PChar;rnbeginrn if Check1.Checked thenrn beginrn pStr:=Buffer;rn tmpStr:=string(pStr);rn Dec(PStr); pstr:=pstr-1; rn for i:=0 to Length(tmpStr)-1 dorn beginrn inc(PStr); pstr:=pstr+1; rn tmpArray[i]:=Byte(PSTR^);rn Memo2.Lines.Add(IntToHEX(Ord(tmpArray[i]),2));rn end;rn exit;rn end;rn pStr:= Buffer;rn memo2.Lines.Add(pStr);rnend;rnrn谁能帮忙给注释一下啊?rn哪个变量是接收到的数据16进制?
fgets读取文本文件结束后,再次调用gets函数想键盘输入,却直接读到'\0',为何??
如题, 代码是做的CPP 13章的练习题,如下rn红色字体那一行, gets<em>函数</em><em>运行</em>后<em>直接</em>读取了空字符'\0', 导致提示"待写入文件open fail"rn为何? 前面用fgets<em>函数</em>已经读完了文件,缓冲区为何还有个'\0'?哪里来的?rnrn#includern#includern#define ARRAYSIZE 256rn#define NAMESIZE 30rn#define SPACE ' 'rnchar find(char);rnint main()rnrn static int a,b;rn int i,j,k;rn char ch;rn FILE *fp1,*fp2;rn char temp[ARRAYSIZE];rn char name[NAMESIZE];rn printf("Tell me the file name you want to use\n");rn gets(name);rn if((fp1=fopen(name,"r"))==NULL)rn rn fprintf(stderr,"File %s open failed\n",name);rn exit(0);rn rn printf("How many rows do U need?\n");rn scanf("%d",&a);rn printf("How many cols do U need?\n");rn scanf("%d",&b);rn rn char array1[a][b];rnrn for(i=0;i && j
STC单片机接收数据之如何判断数据结束
大家好,我是刚接触这方面的菜鸟。我用的STC单片机从串口不断<em>接收数据</em>,数据格式$K:CCCC 或 $J:CCCC,当接收到$K:CCCC表示接收进行中,当收到$J:CCCC表示接收<em>结束</em>,要进入下一次接收。但实际测试的时候,并没有接收到$J:CCCC,所以无法判断数据接收完了(而且有时又会收到不止一个$J:CCCC)。我现在另一个想法是判断接收到的这个数据在3S内不变,就进入下一次接收,但不知道怎么用代码实现,求大神赐教!!!
如何监视出口接收数据的起始和结束
我用一个线程监视串口数据的接收,但数据是随机过来的,即不知道数据什么时候发过来,数据长度也是随机的,请教一下我怎么知道我要的这次数据何时开始何时<em>结束</em>,谢谢!
recv函数阻塞的相关问题
[color=#FF0000]int nLen = <em>recv</em>(m_SOCKET, buf, 102400, 0);[/color]rnrn这样的阻塞,如果服务器端要向我发送数据,假设我的网速又超级无敌卡,可服务端要向我发送90000字节数据,那我的<em>recv</em>是一直阻塞到全部接收了90000字节数据才返回,还是先返回已经接收到的数据?
send和recv函数问题请教
如何使用send<em>函数</em>发送一个double型的数组,例如, double Data[6], 还有,怎么用<em>recv</em><em>函数</em>接受这6个数值呢?
关于send,recv函数的看法
两<em>函数</em>均有len参数。rnA,B两端为异步select下,rn A循环调用send发送,每次发送1Byte(len=1),共发送10次;rn B循环调用<em>recv</em>,每次接收10Bytes(len=10),接收10次才完毕。rn A调用send发送,一次发送10Bytes(len=10);rn B循环调用<em>recv</em>,每次接收1Bytes(len=1),接收10次才完毕。rnrnA,B两端为同步(默认)下,rn A循环调用send发送,每次发送1Byte(len=1),共发送10次;rn B循环调用<em>recv</em>,每次接收10Bytes(len=10),接收1次即可。rn A调用send发送,一次发送10Bytes(len=10);rn B循环调用<em>recv</em>,每次接收1Bytes(len=1),接收10次才完毕。rnrn 因此看出异步select与默认情况下,send,<em>recv</em>的行为不同。rnrn请大家说说你是怎么看这一情况的rn
recv函数的flag参数问题
请问Unix下<em>recv</em><em>函数</em>的flag参数在设置成MSG_WAITALL时,编译不过,提示:'MSG_WAITALL' was not declared in this scope,是什么原因?要不要包含什么头文件?
WinSocket中recv函数的问题
我用WinSocket API写了一个从www服务器中获得网页内容的程序。rn但在使用<em>recv</em><em>函数</em>时遇到了如下问题:rn当获取某些较小的(几百个字节到几千个字节)GIF/JPG图像文件时,rn<em>recv</em><em>函数</em>总是只能获得很少的一部分数据,rn然后就阻塞(我用的是阻塞模式)。rn过了一会儿<em>recv</em>返回0值,说获取完了。rn但事实上还有大部分数据没有取得。rn对html,swf等文件却没有这样的情况。rn为什么呢?rn有写过代理服务器程序的吗?有没有遇到这样的问题?
socket编程:recv(...)函数问题求救
这个问题折磨我两天了,从去年到今年,sigh rn rn问题是这样的: rn rn使用阻塞的socket 流式 TCP 服务,rn(<em>recv</em>是阻塞调用的)rn rn 用<em>recv</em>(sockfd, buffer, length, 0)从网络<em>接收数据</em>到缓冲区buffer, 如果应该接收173个字节大小的数据,但是实际上只收到145个字节,为什么会这样? rn rn请问怎样接收那28个没有收到的数据,不要重传的说rn rn rn我试过再次调用<em>recv</em>()接收剩下的28个字节,但是程序就堵塞在<em>recv</em>()了,再也执行不下去了 rn头都大了,sigh rnrn
关于 Winsocket recv()函数一问。
我在 server 端发送 230400 字节的数据(不知一次发送行不行,我用setsockopt()<em>函数</em>,把sndbuf 设成这么大的,再用 getsockopt() 检测一下,得知返回的sndbuf 的大小为 230400 ,这是不是说明我设对了,也就是说我可以一次性的发送 230400 个字节的数据)。rn在client 端我检测了一下,不能一次接收 230400 个字节的数据,必须分几次接收,不知这如何实现?请大师帮忙。rnrnrn
非阻塞模式下 recv()函数的返回值
设置非阻塞模式,在没有数据到来时,<em>recv</em>()返回值是什么?返回-1还是返回0?
send recv函数 错误处理问题
对send和<em>recv</em>的返回值应该怎么处理?rn严谨一点的方法,我想了一天,没有想到,求指点rn是否要对WSAGetLastError()得到的错误码中比较重要的几个做单独处理?
HOOK API socket recv 函数 的 替换函数
HOOK后,成功修改为自己替换<em>函数</em>的地址,成功跳到了替换<em>函数</em>rnrn我的替换<em>函数</em>定义如下:rnrn[code=VB.NET]Private Function MyRecv(ByVal s As IntPtr, ByVal buf() As byte, ByVal length As Integer, ByVal flags As Integer) As Integerrn[/code]rnrn也试过rnrn[code=VB.NET]Private Function MyRecv(ByVal s As IntPtr, ByVal bufPtr As IntPtr, ByVal length As Integer, ByVal flags As Integer) As Integer[/code]rnrn无论哪种都BUF 都是空的,length 也是一长串16进制数据,而s与flags 是一样的!rnrn如果加多一个参数,如下:rnrnrn[code=VB.NET]Private Function MyRecv(ByVal s As IntPtr, ByVal bufPtr As IntPtr, ByVal length As Integer, ByVal flags As Integer,ByVal flags2 As Integer) As Integer[/code]rnrnlength 就能 为 256 ,应该就是正确的吧,不过 BUF 还是没办法获得数据rnrn要怎么样才可以正确获得参数的值?rnrn先谢谢各位。rnrn
vc++2005下直接启动release程序可以运行,但直接点击exe却无法运行
有这样一个问题rn使用vc++2005环境编译程序,同时调用和配置了clr,rn将编译程序定为“release”,然后vc++2005环境下启动程序(点击那个▷),程序编译完成后可以<em>直接</em><em>运行</em>起来。rn但程序编译成功后,<em>运行</em>bin目录下生成的.exe文件,程序无法出现,观察任务管理器中,发现.exe出现后,过一会自动消失,也也就说程序自己<em>结束</em>了,没有<em>运行</em>起来。rnrn请问,这个问题是什么原因,怎么解决?rn
ftp客户端recv函数阻塞问题!
我自己编写的客户端与serv-u成功建立了连接,但send后,<em>recv</em>却阻塞了,返回-1,和我们学校的ftp服务器也是一样。诡异的是我一位老师的ftp客户端和ser-u也阻塞在那个地方了,但与学校的服务器又不会了。rn还有,win7命令行下ftp通信一切正常!rn对了,我的客户端与自己编写的服务端通信一切正常,实现了数据传输!
recv函数报10054错误
各位大虾:rn我写linux服务端,利用<em>recv</em><em>函数</em>进行接收.但服务端总是receive失败.报10054 WSAECONNRESET错误,网上说服务端自动关闭。rn我的服务端与客户端是放在同一台电脑上的。rnrn相关代码如下:rnrn /*The Windows sockets listen function places a socketrn *a stace where it is listening for an incoming connection*/rn /*accept a connection*/rn SOCKET nClientSocket = INVALID_SOCKET;rn BOOLEAN bIsInSet = NO;rn struct fd_set set;rn struct fd_set all_set;rn struct timeval timeout;rn memset(&set,0,sizeof(fd_set));rn memset(&all_set,0,sizeof(fd_set));rn memset(&timeout,0,sizeof(timeval));rn timeout.tv_sec = MAX_SELECT_TIME;rn timeout.tv_usec = 0;rn /*Add the listening socketing into the socket set*/rn CServer::FDZero(&set);rn CServer::FDSet(pServer->m_nListenSocket,&all_set);rn set = all_set;rn rn /*loop*/rn while(YES == pServer->m_bRunning)rn rn set = all_set;rn nRet = select(pServer->m_nListenSocket+1,&set,(fd_set*)0,(fd_set*)0,(struct timeval*)&timeout);rn if(SOCKET_ERROR != nRet && 0 != nRet)rn rn /*put a socket into a list*/rn WaitForSingleObject(pServer->m_hMutex,INFINITE);rn for(UINT32 i = 0;i < set.fd_count;i++)rn rn /*Initialize the variable*/rn /*Check where i does exist in the set indeed*/rn bIsInSet = CServer::FDIsSet(set.fd_array[i],&set);rn if(YES == bIsInSet)rn rn /*A new client connection*/rn /*If i is father,that will deverid children*/rn if(set.fd_array[i] == (UINT32)pServer->m_nListenSocket)rn rn INT nClientSockLen = sizeof(sockaddr_in);rn nClientSocket = accept(pServer->m_nListenSocket,(struct sockaddr*)&client_addr,&nClientSockLen);rn if(INVALID_SOCKET != nClientSocket)rn rn /*Doesn't know this sentence's function*/rn if(set.fd_count < FD_SETSIZE)rn rn ULONG nArgs = 0;rn ioctlsocket(set.fd_array[i],FIONBIO,&nArgs);rn CServer::FDSet(nClientSocket,&all_set);rn rn elsern rn WRITELOG(LOG_OPEN,"%s""CServer::ListenThread() select pool exceeds socket array size");rn rn rn elsern rn /*Accept the socket error*/rn WRITELOG(LOG_OPEN,"%s","CServer::ListenThread() select pool accept socket error");rn rn rn elsern rn /*Add the socket to list*/rn /*Where the client if offline,what do I do?*/rn /*Handle Rtsp Message*/rn CHAR szRecvBuf[MAX_BUF_SIZE] = 0;rn /*Peek message,check the message is legal*/rn nRet = <em>recv</em>(set.fd_array[i],szRecvBuf,MAX_BUF_SIZE,MSG_PEEK);rn if(0 < nRet)rn rn /*<em>recv</em> rtsp message successfully*/rn CServer* pServer = CServer::m_pInstance;rn pServer->m_listSocket.Add(set.fd_array[i]);rn rn else if(0 == nRet)rn rn /*client shuts down*/rn WRITELOG(LOG_OPEN,"%s","CServer::ListenThread() client must shutdown failed");rn CServer::FDClr(set.fd_array[i],&all_set);rn rn elsern rn /*network failed*/rn INT32 error = WSAGetLastError();rn WRITELOG(LOG_OPEN,"CServer::ListenThread() the connection is broken down[%d][%s]",rn error,strerror2(error));rn //CServer::FDClr(set.fd_array[i],&set);rn CServer::FDClr(set.fd_array[i],&all_set);rn rnrn rn rn rn ReleaseMutex(pServer->m_hMutex);rn rn else if(0 == nRet)rn rn //INT32 error = WSAGetLastError();rn //WRITELOG(LOG_OPEN,"CServer::ListenThread() time limit expired[%d][%s]",error,strerror2(error));rn rn elsern rn INT32 error = WSAGetLastError();rn WRITELOG(LOG_OPEN,"CServer::ListenThread() select pool error[%d][%s]",error,strerror2(error));rn break;rn rn Sleep(MAX_SLEEP_TIME);rnrnrnrn其中 strerror2 这个<em>函数</em>是我自己实现的。rn代码在 :rnnRet = <em>recv</em>(set.fd_array[i],szRecvBuf,MAX_BUF_SIZE,MSG_PEEK);rn报错,我是利用两级 select I/O 复用,所以上面用 msg_peek没有用参数0。rn但 <em>recv</em> 收到一定数目消息后,挂掉。报 10054 WSAECONNRESET错误。rnrn大虾有解决方案么?
~~~~recv()函数10038(WSAENOTSOCK)错误~~~~
DWORD WINAPI ClientThread(LPVOID lpParam)rnrn SOCKET sock = (SOCKET)lpParam;rn char szBuffer[DEFAULT_BUFFER];rn int iRet, nLeft, idx;rn rn while (true)rn rn iRet = <em>recv</em>(sock, szBuffer, DEFAULT_BUFFER, 0);rn if (0 == iRet)rn break;rn else if (SOCKET_ERROR == iRet)rn rn cout << "<em>recv</em>() failed:" << WSAGetLastError() << endl;rn break;rn rn szBuffer[iRet] = '\0';rn cout << "The Message Resieved: " << szBuffer << endl;rn rn cout << "ClientThread exit!" << endl;rn return 0;rnrnrnrn以上是我在接受一个连接以后 创建的一个线程 lpParam 传进来一个accept()反回来的socket rn现在的问题是 客户端发送一次数据 这个服务线程可以<em>接收数据</em> 但是紧接着 在循环中第二次执行<em>recv</em>()时 发生10038(WSAENOTSOCK)错误 为什么呀? <em>recv</em>()只能执行一次???rn还请各位指教!rn
多线程中的RECV函数问题??
我想基于TCP/IP下建一个服务器和多个客户段,rn我在服务器是用多线程接收客户段传过来的消息,rn现在我的问题是当服务器接收一个客户发送过来的消息还好,当要是多个客户段传过来的消息时,就发生了阻塞,有没有那个大哥能帮我解决一下(我是利用创建单个线程跟客户连接的,既一个线程对应一个客户段)???
!!!!recv()函数10038(WSAENOTSOCK)错误!!!!!
DWORD WINAPI ClientThread(LPVOID lpParam)rnrn SOCKET sock = (SOCKET)lpParam;rn char szBuffer[DEFAULT_BUFFER];rn int iRet, nLeft, idx;rn rn while (true)rn rn iRet = <em>recv</em>(sock, szBuffer, DEFAULT_BUFFER, 0);rn if (0 == iRet)rn break;rn else if (SOCKET_ERROR == iRet)rn rn cout << "<em>recv</em>() failed:" << WSAGetLastError() << endl;rn break;rn rn szBuffer[iRet] = '\0';rn cout << "The Message Resieved: " << szBuffer << endl;rn rn cout << "ClientThread exit!" << endl;rn return 0;rnrnrnrn以上是我在接受一个连接以后 创建的一个线程 lpParam 传进来一个accept()反回来的socket rn现在的问题是 客户端发送一次数据 这个服务线程可以<em>接收数据</em> 但是紧接着 在循环中第二次执行<em>recv</em>()时 发生10038(WSAENOTSOCK)错误 为什么呀? <em>recv</em>()只能执行一次???rn还请各位指教!
请教关于recv()函数的一些问题。。。
[code=C/C++]rn// ...rnWSAAsyncSelect(temClient, m_hWnd, WM_CLIENT_READCLOSE, FD_READ|FD_CLOSE);rn// ...rnrnLRESULT CChatServerDlg::OnReceiveData(WPARAM wParam, LPARAM lParam)rnrn char headBuff[sizeof(stMsgHeader)];rn memset(headBuff, 0, sizeof(headBuff));rn int num = 0;rnrn switch (WSAGETSELECTEVENT(lParam))rn rn case FD_READ:rn <em>recv</em>(m_LinkList.GetAt(m_LinkList.FindIndex(i)), headBuff, strlen(headBuff), 0);rn break;rn rnrn[/code]rnrn如上代码:rn因为strlen(headBuff)始终为0,所以,程序将不停调用OnReceiveData()<em>函数</em>。rnrn<em>运行</em>结果也正是这样。rnrn我的问题是:rnrn1:那是不是用<em>recv</em>()接收发来的数据时,若未接收完,服务器将一直触发自定义的OnReceiveData()回调<em>函数</em>??rnrn2:OnReceiveData()<em>函数</em>是不是只能调用一次<em>recv</em>()?rn我曾尝试在客户端每次发两次相同的数据:rn strDst = _T("1");rn send(g_ServerSocket, strDst.GetBuffer(0), strDst.GetLength(), 0);rnrn strDst = _T("2");rn send(g_ServerSocket, strDst.GetBuffer(0), strDst.GetLength(), 0);rn服务端这边也接收两次,但是第2次就不成功了,返回SOCKET_ERRORrn而如果只接收一次,则接收的值竟是"12"rnrn3:如果OnReceiveData()<em>函数</em>里没有调用<em>recv</em>(),那是不是整个<em>函数</em>都不会被执行??rn我试过,如果把<em>recv</em>()<em>函数</em>删掉,OnReceiveData()<em>函数</em>就不会被触发,而加上,才会触发,非常诡异,这叫什么逻辑?!
recv函数超时,如何解决?
下面的代码实现发送HTTP请求到服务器,然后接收服务器返回的响应数据。主要代码如下:rnrnSOCKET sock;rnstring serverHostName=”127.0.0.1”;rnUINT serverPort=80;rnsring url=”http:// 127.0.0.1/index.htm”;rnsockaddr_in serverAddr;rnhostent* host;rnint retCode;rnstring str;rnchar buffer[4096+1];rnrnhost=gethostbyname(serverHostName.c_str());rnif(host==NULL)rnrn cout<<<
谁能给个可以直接运行的排序函数
如题,需要:快速排序,希尔排序,简单选择排序rn谢谢
winsock recv函数使用注意
Winsock int <em>recv</em>( SOCKET s, char FAR *buf, int len, int flags 支持MSG_WAITALL ); 在使用这个<em>函数</em>的时候为了能够一次性接收客户端的封包,我尝试使用了MSG_WAITALL的标志,但是这个标志使用上竟然有点奇怪,网上资料也相对比较少,最后在
使用recv函数遇到的问题
我用WinSocket API写了一个从www服务器中获得网页内容的程序。rn但在使用<em>recv</em><em>函数</em>时遇到了如下问题:rn当获取某些较小的(几百个字节到几千个字节)GIF/JPG图像文件时,rn<em>recv</em><em>函数</em>总是只能获得很少的一部分数据,rn然后就阻塞(我用的是阻塞模式)。rn过了一会儿<em>recv</em>返回0值,说获取完了。rn但事实上还有大部分数据没有取得。rn对html,swf等文件却没有这样的情况。rn为什么呢?rn有写过代理服务器程序的吗?有没有遇到这样的问题?
关于 recv函数 第二个参数
char <em>recv</em>Buf[100];rnmemset(<em>recv</em>Buf ,0 ,100 );rn<em>recv</em>(ClientSocket, <em>recv</em>Buf ,100 , 0);rn-------------------------------------rn上述写法第二个参数没问题,请问怎么姜<em>recv</em>buf改成string类型 使用,用string.c_str()不行,因为是 const char *类型,而第二个参数是char *类型,求大神解答
关于::recv()函数的阻塞问题
在传送一个文件时,如果发送放在文件未能传送完时断开了连接,接收方的::<em>recv</em>()该如何返回?
send()或recv()函数问题。
char buffer[1024];rnchar temp[1024];rnint rcv = <em>recv</em>(s,buffer,1024, 0);rniEnd = send(pDlg->m_hSocket, temp, ilen,0);rn这里面的第二个参数要求是char *,如果要发送或是接收unsigned char *型的怎么办呢?强制转成char *,信息会不会丢失?
hook IE 的send recv函数
各位大神,求助啊!rn我现在要hook ie的send和<em>recv</em><em>函数</em>,想把网页的内容拿下来,dll已经写好了,还写了个将它注入IE的程序,通过IceWorld查看也证明这个Dll也成功的注入IE了,但是我自己的MySend<em>函数</em>不起作用,不知道是为什么。希望有经验的大神们帮忙看看吧。谢啦!rnrnrn// dllmain.cpp : 定义 DLL 应用程序的入口点。rn#include "stdafx.h"rn#include rn#include rn#include "detours.h"rn#pragma comment(lib, "ws2_32.lib")rn#pragma comment (lib,"detours.lib")rn#pragma comment (lib,"detoured.lib")rnint (WINAPI *pSend)(SOCKET s, const char* buf,int len, int flags) = send;rnint WINAPI MySend(SOCKET s, const char* buf,int len, int flags);rnint (WINAPI *pRecv)(SOCKET s, __out_bcount_part(len, return) __out_data_source(NETWORK) char* buf,int len, int flags) = <em>recv</em>;rnint WINAPI MyRecv(SOCKET s, __out_bcount_part(len, return) __out_data_source(NETWORK) char* buf,int len, int flag);rnrnint WINAPI MySend(SOCKET s, const char* buf, int len, int flags)rnrnFILE *pSendLogFile;rn fopen_s(&pSendLogFile, "C: \\SendLog.txt", "a+");rn fprintf(pSendLogFile, "%s\n", buf);rnMessageBox(NULL,"Error!send","Error in Detours!",MB_OK);rn fclose(pSendLogFile);rn return pSend(s, buf, len, flags);rnrn rnint WINAPI MyRecv(SOCKET s, char* buf, int len, int flags)rnrnFILE *pRecvLogFile;rn fopen_s(&pRecvLogFile, "C: \\RecvLog.txt", "a+");rn fprintf(pRecvLogFile, "%s\n", buf);rnMessageBox(NULL,"Error!<em>recv</em>","Error in Detours!",MB_OK);rn fclose(pRecvLogFile);rn return pRecv(s, buf, len, flags);rnrnrnrnBOOL APIENTRY DllMain( HMODULE hModule,rn DWORD ul_reason_for_call,rn LPVOID lpReservedrn)rnrnint error;rnswitch (ul_reason_for_call)rnrncase DLL_PROCESS_ATTACH:rnDisableThreadLibraryCalls(hModule);rnDetourTransactionBegin();rnDetourUpdateThread(::GetCurrentThread());rnDetourAttach(&(PVOID&)pSend, MySend);rnerror = DetourTransactionCommit();rnif(NO_ERROR!=error)rnrnMessageBox(NULL,"Error!","Error in Detours!",MB_OK);rnrnrnDetourTransactionBegin();rnDetourUpdateThread(::GetCurrentThread());rnDetourAttach(&(PVOID&)pRecv, MyRecv);rnerror = DetourTransactionCommit();rnif(NO_ERROR!=error)rnrnMessageBox(NULL,"Error!","Error in Detours!",MB_OK);rnrnbreak;rnrncase DLL_THREAD_ATTACH:rncase DLL_THREAD_DETACH:rncase DLL_PROCESS_DETACH:rnDetourTransactionBegin();rnDetourUpdateThread(GetCurrentThread());rnDetourDetach(&(PVOID&)pSend, MySend);rnerror = DetourTransactionCommit();rnMessageBox(NULL,"Detour ends","Prompt!",MB_OK);rnrnDetourTransactionBegin();rnDetourUpdateThread(GetCurrentThread());rnDetourDetach(&(PVOID&)pRecv, MyRecv);rnerror = DetourTransactionCommit();rnMessageBox(NULL,"Detour ends","Prompt!",MB_OK);rnbreak;rn; rnreturn TRUE;rnrn
大文件的传输问题 recv函数
各位大侠,小弟谢了一个文件传输的程序,平时用着都行,但是文件过大的时候,就会出现问题.........rn比如说,传了一个16M的文件,就接收不完全了......rn我改了几种接收的方案(发送端是C#做的,都是<em>直接</em>把16M的数据<em>直接</em>发过来,而且确实发出去了,这点已经验证过):rn第一种,如下图,先从服务端发一个文件长度过来,然后根据这个长度(代码里的len),用setsockopt<em>函数</em>设置缓冲区大小为len,然后一次性把数据全部用<em>recv</em><em>函数</em>拷过来,结果是这样的:rnrn[img=http://hi.csdn.net/attachment/201011/19/138161_1290142536PH1z.jpg][/img]rnrn可见setsockopt<em>函数</em>返回值是正常的,但ioctlsocket<em>函数</em>得到的大小却只有8760,而且不同时候测试的结果还不一样...实在是很诡异,话说len = 16793658也没有溢出吧,到底是怎么回事?rnrn第二种,如下图,使用默认的缓冲区大小,循环读取缓冲区的内容,直至读取完毕,但是收到的内容(c_len的大小)远小于len的大小,而且就是在这时候,ioctlsocket却指示缓冲区被读完了(arg = 0了)....我就无语了rnrn[img=http://hi.csdn.net/attachment/201011/19/138161_1290142546Pqur.jpg][/img]rnrn类似的是,不同时候可以得到不同的结果,比如说这次:rn[img=http://hi.csdn.net/attachment/201011/19/138161_1290142557uogv.jpg][/img]rnrn求大神们帮看一下,或者提点建议........小文件的时候确实是没问题的 -.-!rn
HTML ppt课件下载
很好的HTML教程,适合于静态网页设计,很容易上手。 相关下载链接:[url=//download.csdn.net/download/zhangleileizhang/2554456?utm_source=bbsseo]//download.csdn.net/download/zhangleileizhang/2554456?utm_source=bbsseo[/url]
数据库编程下载
数据库编程,数据库的相关知识,大家好好看看 相关下载链接:[url=//download.csdn.net/download/sb645431521/3591679?utm_source=bbsseo]//download.csdn.net/download/sb645431521/3591679?utm_source=bbsseo[/url]
DOTNET帮助文档制作,下载
可以将.net 类中的注释生产说明文档的工具,方便快捷高效! 相关下载链接:[url=//download.csdn.net/download/caigen008/4206343?utm_source=bbsseo]//download.csdn.net/download/caigen008/4206343?utm_source=bbsseo[/url]
相关热词 c#串口测试应用程序 c# 匹配 正则表达式 c#防止窗体重绘 c#读写txt文件 c#挖地雷源代码 c#弹框选项 c# 移除 队列 c# 密码写入配置文件 c# 获取可用内存大小 c# 嵌入excel编辑
我们是很有底线的