新足迹

 找回密码
 注册

精华好帖回顾

· 从钱到钱(全篇完结最后在61楼,能把所有的文字连起来读更有意思)85楼新的感受 (2011-12-22) 新澳之旅 · 老公的早餐(改进滴煎饼果子+小米粥) (2008-10-21) 净心
· 布村2014 Mazda 3 Maxx购车感受 (2014-3-3) 魅影骑士 · 大头烘焙--应景的咕咕霍夫(Kugelhopf) (2010-12-21) datou2z
Advertisement
Advertisement
查看: 2966|回复: 34

谁懂API? [复制链接]

发表于 2013-2-21 13:12 |显示全部楼层
此文章由 tennisBoy 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 tennisBoy 所有!转贴必须注明作者、出处和本声明,并保持内容完整
谁能解释一这下缓冲区的程序?

//缓冲区可写性测试
                                if (FD_ISSET(sockinfo->socket, &fdwrite))
                                {
                                        sockok--;
                                       
                                        //继续发送剩余部分
                                        sockinfo->wsaBuf.buf = sockinfo->buf + sockinfo->bytesend;
                                        sockinfo->wsaBuf.len = sockinfo->bytesrecv - sockinfo->bytesend;
                                        if (WSASend(sockinfo->socket,
                                                &(sockinfo->wsaBuf), 1, &datasend, 0,
                                                NULL, NULL) == SOCKET_ERROR)
                                        {
                                                if (WSAGetLastError() != WSAEWOULDBLOCK)
                                                {
                                                        printf("Send failed with error\n");
                                                        FreeSocketInfo(index);
                                                }
                                               
                                                continue;
                                        }
                                        else
                                        {
                                                //增加已发送数据计数
                                                sockinfo->bytesend += datasend;
                                                //二者相等时说明接收数据已发送完毕
                                                if (sockinfo->bytesend == sockinfo->bytesrecv)
                                                {
                                                        sockinfo->bytesend = 0;
                                                        sockinfo->bytesrecv = 0;
                                                        ZeroMemory(sockinfo->wsaBuf.buf,BUFFERSIZE);
                                                }
Advertisement
Advertisement

发表于 2013-2-21 15:14 |显示全部楼层
此文章由 鱼羊鲜 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 鱼羊鲜 所有!转贴必须注明作者、出处和本声明,并保持内容完整
什么语言

特殊贡献奖章

发表于 2013-2-21 16:03 |显示全部楼层
此文章由 kr2000 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 kr2000 所有!转贴必须注明作者、出处和本声明,并保持内容完整
什么api,干什么的缓冲
代码也不全

你这样问问题能找到答案就出奇了

发表于 2013-2-21 16:05 |显示全部楼层
此文章由 IsDonIsGood 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 IsDonIsGood 所有!转贴必须注明作者、出处和本声明,并保持内容完整
貌似C++。
头像被屏蔽

禁止发言

发表于 2013-2-21 16:11 |显示全部楼层
此文章由 coolmate 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 coolmate 所有!转贴必须注明作者、出处和本声明,并保持内容完整
很简单的程序啊。你想知道什么?不是一切都写在code里面了么?这个是IBM的什么东西吧?谁的sample?

发表于 2013-2-21 16:13 |显示全部楼层
此文章由 porcorosso 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 porcorosso 所有!转贴必须注明作者、出处和本声明,并保持内容完整
我懂!很简单啊,你这样这样就可以了。。。面试都是这样回答的。。。

Advertisement
Advertisement

发表于 2013-2-21 17:40 |显示全部楼层
此文章由 wil 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 wil 所有!转贴必须注明作者、出处和本声明,并保持内容完整
经过鉴定不是java

发表于 2013-2-21 17:41 |显示全部楼层
此文章由 yolandalinz 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 yolandalinz 所有!转贴必须注明作者、出处和本声明,并保持内容完整
是c。 测试的对象是wsaBuf.buf, 也就是所谓的端口缓存。这段代码是往一个端口写东西的一部分。一班般还会有一个listener在读端口缓存的数据。这段代码做的事情是检查端口缓存是否可写 FD_ISSET中'f'd按我猜是file discriptor的缩写,isset就是英文本意。 如果能找到'这个端口并且缓存可写入,就写入数据并且发送。 wsa应该是一个library的前缀。 如果不可写就报错。 如果数据发可了就记录下已发了那些数据和数据的大小。大概就这么多。
守望先锋Horcruxes#6153
头像被屏蔽

禁止发言

发表于 2013-2-21 19:59 |显示全部楼层
此文章由 coolmate 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 coolmate 所有!转贴必须注明作者、出处和本声明,并保持内容完整
不是C,是C++

发表于 2013-2-22 09:37 |显示全部楼层
此文章由 yolandalinz 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 yolandalinz 所有!转贴必须注明作者、出处和本声明,并保持内容完整
coolmate 发表于 2013-2-21 19:59
不是C,是C++

不好说。这代码里面没看见什么cpp的明显特征,而且cpp向下可以跑c的代码,所以说不准是c还是cpp。
守望先锋Horcruxes#6153

发表于 2013-2-22 09:44 |显示全部楼层
此文章由 garyyang 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 garyyang 所有!转贴必须注明作者、出处和本声明,并保持内容完整
CPP的可能性大一点,

http://curl.haxx.se/mail/lib-2008-06/att-0133/multi_socket.cpp
搜索FD_ISSET

用C#的飘过~
Advertisement
Advertisement

发表于 2013-2-22 11:54 |显示全部楼层
此文章由 tennisBoy 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 tennisBoy 所有!转贴必须注明作者、出处和本声明,并保持内容完整
garyyang 发表于 2013-2-22 09:44
CPP的可能性大一点,

http://curl.haxx.se/mail/lib-2008-06/att-0133/multi_socket.cpp

Thanks, this is win_socket codes for select() model,  I don't understand its sending and receiv\ing buffer working process, do you have any specific doc about it?

发表于 2013-2-22 13:23 |显示全部楼层
此文章由 tennisBoy 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 tennisBoy 所有!转贴必须注明作者、出处和本声明,并保持内容完整
yolandalinz 发表于 2013-2-21 17:41
是c。 测试的对象是wsaBuf.buf, 也就是所谓的端口缓存。这段代码是往一个端口写东西的一部分。一班般还会有 ...

多谢, 这是 winsock() codes for select() 模型,能介绍一下缓冲区的工作原理?


ntSelectModel.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdlib.h>
#include "winsock2.h"
#include <conio.h>

//winsock 2.2 library
#pragma comment(lib,"ws2_32.lib")

#define PORT 8888
#define BUFFERSIZE 100
#define ADDR  "127.0.0.1"
#define ECHO   0xFE
#define REPLY  0xFF

//套接字环境
typedef struct _tagSOCKET_INFO {
        OVERLAPPED overlap;
        WSABUF wsaBuf;
        char buf[BUFFERSIZE];
        SOCKET socket;
        DWORD bytesend;
        DWORD bytesrecv;
} SOCKET_INFO, * LPSOCKET_INFO;

BOOL CreateSocketInfo(SOCKET s);
void FreeSocketInfo(DWORD Index);

DWORD totalsocks = 0;
LPSOCKET_INFO socklist[FD_SETSIZE];


#pragma hdrstop

//---------------------------------------------------------------------------


#pragma argsused
int main(int argc, char* argv[])
{
  //监听、连接套接字
        SOCKET listensocket,acceptsocket;
        //服务端地址
        SOCKADDR_IN serAddr;
        WSADATA wsaData;
        //select集合
        struct fd_set fdwrite,fdread;
        //缓冲区准备好的套接字计数
        DWORD index,sockok;
        //套接字工作模式
        ULONG sockmode;
        DWORD flags;
        //接收发送数据计数
        DWORD datasend,datarecv;
        //客户端地址
        SOCKADDR_IN  cliAddr;
        int cliAddrLen;

        //初始化Winsock 2.2
        printf("\nInitialising Winsock...\n");
        if (WSAStartup(MAKEWORD(2,2),&wsaData) != 0)
        {
                fprintf(stderr,"WSAStartup() failed %d\n, WSAGetLastError()");
                exit(0);
        }
        printf("Initialised successfully.\n");

        //创建监听socket
        printf("\nCreating TCP socket...\n");
        if((listensocket = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0,
          WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET)
        {
                printf("Creation of socket failed %d\n", WSAGetLastError());
                WSACleanup();
                return 0;
        }

        //设置SOCKADDR_IN地址结构
        serAddr.sin_family = AF_INET;
        serAddr.sin_addr.s_addr = htonl(INADDR_ANY);
        //  serAddr.sin_addr.s_addr = inet_addr(ADDR);
        serAddr.sin_port = htons(PORT);

        //绑定套接字
        if (bind(listensocket, (SOCKADDR *) &serAddr, sizeof(serAddr))
          == SOCKET_ERROR)
        {
                printf("bind failed with error %d\n", WSAGetLastError());
                closesocket(listensocket);
                WSACleanup();
                return 0;
        }

        //监听连接
        if (listen(listensocket, 5))
        {
                printf("listen failed with error %d\n", WSAGetLastError());
                closesocket(listensocket);
                WSACleanup();
                return 0;
        }

        printf("Listening on the %s:%d...\n",
                inet_ntoa(serAddr.sin_addr), htons(serAddr.sin_port));

        //更改监听套接字工作模式至非阻塞模式+select

        sockmode = 1;
        if (ioctlsocket(listensocket, FIONBIO, &sockmode) == SOCKET_ERROR)
        {
                printf("ioctlsocket() failed \n");
                return 0;
        }

        while(TRUE)
        {
                //初始化读写套接字集合
                FD_ZERO(&fdread);
                FD_ZERO(&fdwrite);
                //将监听套接字添加到集合中,以便检查连接请求
                FD_SET(listensocket, &fdread);
               
                //根据缓冲区当前的状态来为套接字设置可读性及可写性测试
                //譬如当收到数据以后则要测试缓冲区的可写性
                //否则就测试其可读性

                for (index = 0; index < totalsocks; index++)
                        if (socklist[index]->bytesrecv > socklist[index]->bytesend)
                                FD_SET(socklist[index]->socket, &fdwrite);
                        else
                                FD_SET(socklist[index]->socket, &fdread);
                        //选择感兴趣的套接字集合
                        if ((sockok = select(0, &fdread, &fdwrite,
                                NULL, NULL)) == SOCKET_ERROR)
                        {
                                fprintf(stderr, "select failed: %d\n", WSAGetLastError());
                                return -1;
                        }
                        //检查到来的连接请求
                        if (FD_ISSET(listensocket, &fdread))
                        {
                                sockok--;
                                //cliAddrLen必须初始化为cliAddr的大小
                                cliAddrLen=sizeof(cliAddr);
                                if ((acceptsocket = accept(listensocket,
                                        (sockaddr*)&cliAddr,&cliAddrLen)) != INVALID_SOCKET)
                                {
                                        //接受连接并将新的套接字设置为非阻塞模式
                                        sockmode = 1;
                                        if (ioctlsocket(acceptsocket, FIONBIO, &sockmode) == SOCKET_ERROR)
                                        {
                                                printf("ioctlsocket() failed with error %d\n", WSAGetLastError());
                                                return 0;
                                        }
                                        //为新套接字创建工作环境
                                        if (CreateSocketInfo(acceptsocket) == FALSE)
                                                return 0;
                                        printf("successfully got a connection from %s:%d.\n",
                                                inet_ntoa(cliAddr.sin_addr), ntohs(cliAddr.sin_port));
                                }
                                else
                                {               
                                        if (WSAGetLastError() != WSAEWOULDBLOCK)
                                        {
                                                printf("accept() failed with error %d\n", WSAGetLastError());
                                                return 0;
                                        }
                                       
                                }
                        }
                        //为所有的sockok套接字检查读写通知
                        for (index = 0; sockok > 0 && index < totalsocks; index++)
                        {
                                LPSOCKET_INFO sockinfo = socklist[index];
                               
                                //缓冲区可读性测试
                                if (FD_ISSET(sockinfo->socket, &fdread))
                                {
                                        sockok--;
                                       
                                        sockinfo->wsaBuf.buf = sockinfo->buf;
                                        sockinfo->wsaBuf.len = BUFFERSIZE;
                                        flags = 0;
                                        if (WSARecv(sockinfo->socket,
                                                &(sockinfo->wsaBuf), 1, &datarecv,
                           &flags, NULL, NULL) == SOCKET_ERROR)
                                        {
                                                if (WSAGetLastError() != WSAEWOULDBLOCK)
                                                {
                                                        printf("Receive failed with error\n");
                                                        FreeSocketInfo(index);
                                                }
                                               
                                                continue;
                                        }
                                        else
                                        {
                                                //cliAddrLen必须初始化为cliAddr的大小
                                                cliAddrLen=sizeof(cliAddr);
                                               
                                                //获取客户端地址信息
                                                if(getpeername(sockinfo->socket,(sockaddr*)&cliAddr,&cliAddrLen))
                                                {
                                                        printf("getpeername failed with error %d\n", WSAGetLastError());
                                                }
                                               
                                                printf( "The following data comes from %s:%d\n",
                                                        inet_ntoa(cliAddr.sin_addr),htons(cliAddr.sin_port));
                                                //接收的数据量
                                                sockinfo->bytesrecv = datarecv;
                                                //显示接收到的数据
                                                printf("%s\n",sockinfo->wsaBuf.buf);
                                                printf("Waiting to receive data...\n");
                                                //若发现exit则退出处理循环
                                                if(strncmp(sockinfo->wsaBuf.buf,"exit",sizeof("exit"))==0)
                                                {
                                                        printf("exit the receiving loop\n");
                                                        break;
                                                }       
                                                //连接关闭,则接收到0字节
                                                if (datarecv == 0)
                                                {
                                                        FreeSocketInfo(index);
                                                        continue;
                                                }
                                        }
                                }
                                //缓冲区可写性测试
                                if (FD_ISSET(sockinfo->socket, &fdwrite))
                                {
                                        sockok--;
                                       
                                        //继续发送剩余部分
                                        sockinfo->wsaBuf.buf = sockinfo->buf + sockinfo->bytesend;
                                        sockinfo->wsaBuf.len = sockinfo->bytesrecv - sockinfo->bytesend;
                                        if (WSASend(sockinfo->socket,
                                                &(sockinfo->wsaBuf), 1, &datasend, 0,
                                                NULL, NULL) == SOCKET_ERROR)
                                        {
                                                if (WSAGetLastError() != WSAEWOULDBLOCK)
                                                {
                                                        printf("Send failed with error\n");
                                                        FreeSocketInfo(index);
                                                }
                                               
                                                continue;
                                        }
                                        else
                                        {
                                                //增加已发送数据计数
                                                sockinfo->bytesend += datasend;
                                                //二者相等时说明接收数据已发送完毕
                                                if (sockinfo->bytesend == sockinfo->bytesrecv)
                                                {
                                                        sockinfo->bytesend = 0;
                                                        sockinfo->bytesrecv = 0;
                                                        ZeroMemory(sockinfo->wsaBuf.buf,BUFFERSIZE);
                                                }
                                        }
                                }
                        }
        }

        WSACleanup();
        getch();
        return 0;
}
//---------------------------------------------------------------------------

void FreeSocketInfo(DWORD Index)
{
       
        LPSOCKET_INFO sockinfo = socklist[Index];
        DWORD loop;
       
        closesocket(sockinfo->socket);
       
        printf("Closing socket.....\n");
       
        GlobalFree(sockinfo);
       
        //从数组中移除
        for (loop = Index; loop < totalsocks-1; loop++)
        {
                socklist[loop] = socklist[loop + 1];
        }
        //递减已关闭连接套接字的计数
        totalsocks--;

'7d


BOOL CreateSocketInfo(SOCKET s)
{
        LPSOCKET_INFO sockinfo;
       
        printf("Accepted socket!\n");
        //从堆上分配内存
        if ((sockinfo = (LPSOCKET_INFO) GlobalAlloc(GPTR,
                sizeof(SOCKET_INFO))) == NULL)
        {
                printf("GlobalAlloc() failed\n");
                return FALSE;
        }
       
        //套接字相关
        sockinfo->socket=s;
        sockinfo->bytesend=sockinfo->bytesrecv =0;
       
        socklist[totalsocks]=sockinfo;
        //递增已接受连接套接字的计数
        totalsocks++;

   return TRUE;

发表于 2013-2-22 13:40 |显示全部楼层
此文章由 鱼羊鲜 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 鱼羊鲜 所有!转贴必须注明作者、出处和本声明,并保持内容完整

发表于 2013-2-22 14:08 |显示全部楼层
此文章由 tennisBoy 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 tennisBoy 所有!转贴必须注明作者、出处和本声明,并保持内容完整
鱼羊鲜 发表于 2013-2-22 13:40

中等程序员必需的水准!

发表于 2013-2-22 14:45 |显示全部楼层
此文章由 garyyang 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 garyyang 所有!转贴必须注明作者、出处和本声明,并保持内容完整
tennisBoy 发表于 2013-2-22 12:23
多谢, 这是 winsock() codes for select() 模型,能介绍一下缓冲区的工作原理?

希望有人可以帮你。 中等程序员至少可以读懂中文comment吧? 我觉得它写得已经很清楚了
88足迹, 一个无聊多于乐趣的地方。
Advertisement
Advertisement

发表于 2013-2-22 14:49 |显示全部楼层
此文章由 鱼羊鲜 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 鱼羊鲜 所有!转贴必须注明作者、出处和本声明,并保持内容完整
中等程序员?
头像被屏蔽

禁止发言

发表于 2013-2-22 15:24 |显示全部楼层
此文章由 coolmate 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 coolmate 所有!转贴必须注明作者、出处和本声明,并保持内容完整
什么是中等程序员?

这个就是基本的读程序能力,而且是写的比较清楚的程序,comment也算清楚。还是中文的?你在澳洲上班?楼主你还是先好好看看书吧。
签名被屏蔽

发表于 2013-2-22 15:33 |显示全部楼层
此文章由 酱油瓶 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 酱油瓶 所有!转贴必须注明作者、出处和本声明,并保持内容完整
要不谁先把它翻译成c#或者java, 要不vb也行

发表于 2013-2-22 18:49 |显示全部楼层
此文章由 yolandalinz 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 yolandalinz 所有!转贴必须注明作者、出处和本声明,并保持内容完整
这段程序确实已经很清楚了。而且还有注释,再解释下去就变成逐行解读了,不至于吧。 我现在在公司也就是个cpp junior程序员,对windows下面那一片library不是很熟,估计请到windows下写cpp的能解释的比较清楚。我不了解wsa库是怎么工作的。
守望先锋Horcruxes#6153

发表于 2013-2-22 18:54 |显示全部楼层
此文章由 tennisBoy 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 tennisBoy 所有!转贴必须注明作者、出处和本声明,并保持内容完整
yolandalinz 发表于 2013-2-22 18:49
这段程序确实已经很清楚了。而且还有注释,再解释下去就变成逐行解读了,不至于吧。 我现在在公司也就是个c ...

我问的是缓冲区的工作原理那段.


Advertisement
Advertisement

发表于 2013-2-22 18:59 |显示全部楼层
此文章由 北风 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 北风 所有!转贴必须注明作者、出处和本声明,并保持内容完整
这里的朋友耐心真是好

发表于 2013-2-22 20:04 |显示全部楼层
此文章由 tennisBoy 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 tennisBoy 所有!转贴必须注明作者、出处和本声明,并保持内容完整
大家很热心, 令我很感动!

发表于 2013-2-23 19:33 |显示全部楼层
此文章由 yolandalinz 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 yolandalinz 所有!转贴必须注明作者、出处和本声明,并保持内容完整
我只是猜一下,缓冲区应该只是一片内存,这片内存是和特定端口绑定的,就是同时只能接受同一个操作。而'在用这片内存的时候,有一个flag记住了当前的状态,即是否可操作,就想像mutex lock 一样。 如果有process在读或者在写,那这片区域就是不可操作的。如果没有人在用的话,如果我要写了,我就先把这片区域锁起来,然后开始写,然后执行发送操作(怎么发出去就是wsa库干的事情了).然后呢,等发完了。我就说好了,下面就是listener的事了。然后listener就去不断刷那个端口,直到发现别人(wsa库收到新的数据并且完成写入了),这个时候这片区域就会被标记成可读,于是listener说,我要读数据了,别人不准动它。等读完了之后,它又把锁打开,说你们爱干嘛干嘛,反正在在这片区域被再次标记成可读之前,我是不会动它的。然后不管是你要写新数据,或者wsa收到新数据只要再标记了已读,我就来查。
守望先锋Horcruxes#6153

发表于 2013-2-23 20:45 |显示全部楼层
此文章由 tennisBoy 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 tennisBoy 所有!转贴必须注明作者、出处和本声明,并保持内容完整
yolandalinz 发表于 2013-2-23 19:33
我只是猜一下,缓冲区应该只是一片内存,这片内存是和特定端口绑定的,就是同时只能接受同一个操作。而'在 ...

不错, 基本这样, 但我不懂 ‘缓冲区可写性测试“ 程序。

发表于 2013-2-23 22:57 |显示全部楼层
此文章由 heixiu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 heixiu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
鱼羊鲜 发表于 2013-2-21 15:14
什么语言

代码是英文,注释是中文
Advertisement
Advertisement

发表于 2013-2-24 10:59 |显示全部楼层
此文章由 yolandalinz 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 yolandalinz 所有!转贴必须注明作者、出处和本声明,并保持内容完整
缓冲区可写行性测试不是下面一片代码,只是那一行代码,应该是用fd_isset去测试所给端口的 fdwrite标签是否被set了,如果被set就说明可写,于是进入if里面开始写
守望先锋Horcruxes#6153

发表于 2013-2-24 20:14 |显示全部楼层
此文章由 joerkky 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 joerkky 所有!转贴必须注明作者、出处和本声明,并保持内容完整
Win32的C语言Socket编程啊。。。10多年前的代码到现在还是这么写。。。

首先呢,代码写错了,最开头应该是while不是if

FD_ISSET是阻塞调用,如果socket关闭了或者出错了就直接返回false,否则等到socket可用,才返回true,或者timeout也返回false

阻塞调用是因为你用socket收发数据,socket需要时间来完成操作,比如你发送10M的数据,不可能一蹴而就。select或者FD_ISSET就等在那,直到它发送成功或者失败

socket其实跟stream没什么区别,你让它发送10M的数据,它可能发送了1400个字节就返回了,后面的数据你得继续调用send发送。这就是这段程序的意思。

解释完毕,分数拿来。

发表于 2013-2-25 17:44 |显示全部楼层
此文章由 tennisBoy 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 tennisBoy 所有!转贴必须注明作者、出处和本声明,并保持内容完整
To yolandalinz, joerkky

不太对, 就到此为止吧, 谢谢。

发表于 2013-2-27 20:51 |显示全部楼层
此文章由 float 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 float 所有!转贴必须注明作者、出处和本声明,并保持内容完整
高手真多啊

发表回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Advertisement
Advertisement
返回顶部