咨询下异步socket

小乔家人 2020-03-09 10:55:51
事情是这样的,我同事不知道哪弄了段python的rdp端口嗅探的源码,这东西本身其实没啥技术含量,但他在哪吹嘘python比c++写的快,这我就不能忍了,无非就是开若干个线程,起异步socket,分别connect,然后有返回的判断返回是否是需要的。
不过知易行难,毕竟不是专业写C++的,socket更不熟悉,网上抄抄改改一两百行代码不知bug凡几。。。问题在哪也不知道给大家丢脸了


void NThreadProc(void* p);


SOCKET NInitCreateSocket(int nID)
{
SOCKET connfd;
struct sockaddr_in servaddr;
char buff[128];
int n;
//printf("end %d", nPort);
if ((connfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
printf("create socket error: %d(errno: %d)\n", GetLastError(), nID);
return INVALID_SOCKET;
}
unsigned long ul = 1;
int ret = ioctlsocket(connfd, FIONBIO, (unsigned long*)&ul); //设置成非阻塞模式
if (ret == SOCKET_ERROR) //设置失败
{
printf("create socket error: %d(errno: %d)\n", GetLastError(), nID);
closesocket(connfd);
return INVALID_SOCKET;
}
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(nID +10333);
if (bind(connfd, (struct sockaddr*) & servaddr, sizeof(servaddr)) == -1) {
printf("bind socket error: %d(errno: %d)\n", GetLastError(), nID);
closesocket(connfd);
return INVALID_SOCKET;
}
DWORD TimeOut = 100;//设置接收超时6秒
if (::setsockopt(connfd, SOL_SOCKET, SO_RCVTIMEO, (char*)&TimeOut, sizeof(TimeOut)) == SOCKET_ERROR) {
closesocket(connfd);
printf("setsockopt error: %d(errno: %d)\n", GetLastError(), nID);
return INVALID_SOCKET;
}
return connfd;
}

int NConnect(SOCKET s,int nPort)
{
if (nPort > 65535)
{
closesocket(s);
if (nPort > 65535)
{
printf("thread %d,end time %d(ms),port %d\n", nPort % g_nCount ,GetTickCount() - g_uStartTime, nPort);
//delete g_SocketList;
//g_SocketList = NULL;
}

return 0;
}

struct sockaddr_in servaddr1;
memset(&servaddr1, 0, sizeof(servaddr1));
servaddr1.sin_family = AF_INET;
servaddr1.sin_port = htons(nPort);
servaddr1.sin_addr.S_un.S_addr = inet_addr(address);
connect(s, (struct sockaddr*) & servaddr1, sizeof(servaddr1));
fd_set writeset;
FD_ZERO(&writeset);
FD_SET(s, &writeset);
timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 10000000;
int ret = select(0, NULL, &writeset, NULL, &tv);
if (ret<= 0)
{
//closesocket(connfd);
NConnect(s, nPort + g_nCount);
return 0;
}

if (send(s, (char*)sendbuf, sizeof(sendbuf), 0) < 0) {
//closesocket(connfd);
NConnect(s, nPort + g_nCount);
printf("send msg error: %d(SOCKET: %d,send port =%d,ret = %d)\n", GetLastError(), s,nPort,ret);
return 0;
}

char buff[128] = {0};
//printf("======waiting for client's request======\n");
while (1) {
int n = recv(s, buff, 128, 0);
//buff[n] = '\0';
//printf("recv msg from client: %s\n", buff);
if(n > 0)
n = CompairType((BYTE*)buff);
if (n > 0)
{
g_port = nPort;
printf("\n port =%d,type %d\n", nPort, n);
printf("\n port =%d,type %d\n", nPort, n);
}
else
{
NConnect(s, nPort + g_nCount);
}
return 0;

}

}
int NInit(int nCount)
{
g_nCount = nCount;
g_SocketList = new SOCKET[nCount];
for (int i = 0; i < nCount; i++)
{
g_SocketList[i] = NInitCreateSocket(i);
}
printf("start time %d\n", g_uStartTime = GetTickCount());
for (int i = 0; i < nCount; i++)
{
POINT* pt = new POINT;
pt->x = g_SocketList[i];
pt->y = i;
_beginthread(NThreadProc, sizeof(POINT), pt);
}
return 0;
}



void NThreadProc(void* p)
{

POINT* p1 = (POINT*)p;
NConnect(p1->x,p1->y);
}
int main(int argc ,char** argv)
{
WSADATA a;
WSAStartup(MAKEWORD(1,0),&a);
/*int nPort = 80;
int nTime1 = GetTickCount();
for (int i = 0; i < 1000; i++)
{
int* a = new int[1];
a[0] = i;
_beginthread(ThreadProc,sizeof(int),a);
}

int nTime2 = GetTickCount();
printf("start time %d\n", nTime2);*/
NInit(100);


getchar();
WSACleanup();
}


...全文
632 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
worldy 2020-03-16
  • 打赏
  • 举报
回复

引用 17 楼 小乔家人 的回复:
[quote=引用 14 楼 gouyanfen 的回复:]
[quote=引用 13 楼 小乔家人 的回复:]
[quote=引用 10 楼 gouyanfen 的回复:]
你同学说python比C++写的快也没问题的,C++本来就写的慢,只是运行起来快,python都是包装好的肯定快了。不能否认python写东西快,只是效率嘛就看需要了。

python写起来肯定比c++快,这个没问题,反对的是python跑起来比c++快[/quote]
这问题还用争吗,能说出这样的话说明水平还太次。你跟他争论这个问题本身就错了,这问题根本就不需要争论。[/quote]
当然需要争论,就好比不会卸汽车轮胎的人你问他是用气枪快还是用扳手快,他不会用工具也没见到工具的前提条件下用哪个快,怎么不需要争论。我俩主业搞翻译的业余爱好者,争论的自然是我能不能用c写的比他python那段代码快,而不是你们专业搞软件的来写。[/quote]




业余用python
专业用C

运行速度由快到慢:汇编 、C、C++、其他再经封装的高级语言(如phthon)
开发效率由高到低 :高级封装的语言(如python)、C++、C、汇编
小乔家人 2020-03-16
  • 打赏
  • 举报
回复
引用 14 楼 gouyanfen 的回复:
[quote=引用 13 楼 小乔家人 的回复:] [quote=引用 10 楼 gouyanfen 的回复:] 你同学说python比C++写的快也没问题的,C++本来就写的慢,只是运行起来快,python都是包装好的肯定快了。不能否认python写东西快,只是效率嘛就看需要了。
python写起来肯定比c++快,这个没问题,反对的是python跑起来比c++快[/quote] 这问题还用争吗,能说出这样的话说明水平还太次。你跟他争论这个问题本身就错了,这问题根本就不需要争论。[/quote] 当然需要争论,就好比不会卸汽车轮胎的人你问他是用气枪快还是用扳手快,他不会用工具也没见到工具的前提条件下用哪个快,怎么不需要争论。我俩主业搞翻译的业余爱好者,争论的自然是我能不能用c写的比他python那段代码快,而不是你们专业搞软件的来写。
小乔家人 2020-03-16
  • 打赏
  • 举报
回复
引用 15 楼 worldy 的回复:
[quote=引用 13 楼 小乔家人 的回复:] [quote=引用 10 楼 gouyanfen 的回复:] 你同学说python比C++写的快也没问题的,C++本来就写的慢,只是运行起来快,python都是包装好的肯定快了。不能否认python写东西快,只是效率嘛就看需要了。
python写起来肯定比c++快,这个没问题,反对的是python跑起来比c++快[/quote] 应该是disconnect后,可以回收重用[/quote] 有没有异步disconnect的示例
小乔家人 2020-03-16
  • 打赏
  • 举报
回复
引用 18 楼 worldy 的回复:
[quote=引用 17 楼 小乔家人 的回复:] [quote=引用 14 楼 gouyanfen 的回复:] [quote=引用 13 楼 小乔家人 的回复:] [quote=引用 10 楼 gouyanfen 的回复:] 你同学说python比C++写的快也没问题的,C++本来就写的慢,只是运行起来快,python都是包装好的肯定快了。不能否认python写东西快,只是效率嘛就看需要了。
python写起来肯定比c++快,这个没问题,反对的是python跑起来比c++快[/quote] 这问题还用争吗,能说出这样的话说明水平还太次。你跟他争论这个问题本身就错了,这问题根本就不需要争论。[/quote] 当然需要争论,就好比不会卸汽车轮胎的人你问他是用气枪快还是用扳手快,他不会用工具也没见到工具的前提条件下用哪个快,怎么不需要争论。我俩主业搞翻译的业余爱好者,争论的自然是我能不能用c写的比他python那段代码快,而不是你们专业搞软件的来写。[/quote] 业余用python 专业用C 运行速度由快到慢:汇编 、C、C++、其他再经封装的高级语言(如phthon) 开发效率由高到低 :高级封装的语言(如python)、C++、C、汇编 [/quote] python之类的好几种常规开发语言我都会一点,只不过不是主业,也不做网络方面的东西所以不熟,不讨论这个了,我就求一个异步socket重用的示例,得能通过。
worldy 2020-03-13
  • 打赏
  • 举报
回复
引用 13 楼 小乔家人 的回复:
[quote=引用 10 楼 gouyanfen 的回复:]
你同学说python比C++写的快也没问题的,C++本来就写的慢,只是运行起来快,python都是包装好的肯定快了。不能否认python写东西快,只是效率嘛就看需要了。

python写起来肯定比c++快,这个没问题,反对的是python跑起来比c++快[/quote]

应该是disconnect后,可以回收重用
gouyanfen 2020-03-12
  • 打赏
  • 举报
回复
你同学说python比C++写的快也没问题的,C++本来就写的慢,只是运行起来快,python都是包装好的肯定快了。不能否认python写东西快,只是效率嘛就看需要了。
worldy 2020-03-12
  • 打赏
  • 举报
回复
lz应该明白,多线程应用并不是线程越多就越快,因为线程本质就是时间片。如果你的CPU只有一个核,那么原理上,对于相同的任务做成多线程执行肯定不会比单线程执行快!!!因为,多线程就需要耗费好多的资源用于线程调度,并且多线程之间往往需要需要线程同步而必须将数据锁定。。。

win环境下winsock应用最经典的应用是IOCP(完成端口),使用的是线程池,线程池的线程数量一般限制在CPU的核心数的2倍,再多的线程就没有意义,再多就会降低整体的执行效率
zgl7903 2020-03-12
  • 打赏
  • 举报
回复
引用 6 楼 小乔家人 的回复:
[quote=引用 4 楼 zgl7903 的回复:] 异步Connect以后,可以使用 select 查看可写状态, Connect成功后socket 会变成可写(可发送状态)

//联机到服务器
BOOL bConnectOK = FALSE;
{
  SOCKADDR_IN server;
  memset(&server, 0, sizeof(server));
  server.sin_family = AF_INET;
  server.sin_addr.s_addr = htonl(m_dwServerIPAddr);
  server.sin_port = htons((WORD)m_dwServerPort);
  int iconnect = connect(m_CommSock, (struct sockaddr*)&server, sizeof(server));
  if(iconnect == 0) //直接成功
  {
    bConnectOK = 1;
    break;
  }

  fd_set writefds;
  FD_ZERO(&writefds);
  FD_SET(m_CommSock, &writefds);
  timeval tOut = {1, 0};
  if( select(0, NULL, &writefds, NULL, &tOut) > 0 && FD_ISSET(m_CommSock, &writefds) )
  {
    bConnectOK = 2;
    break;
  }
}while(0);
你这不对吧?异步socket会直接返回true吗? 通篇求得其实是异步socket如何重用,因为是客户端,connectex之后不知如何断开连接并重用,直接disconnectex再connect会报10022[/quote] 关键在下面的 select 上
小乔家人 2020-03-12
  • 打赏
  • 举报
回复
引用 5 楼 smwhotjay 的回复:
还要检查下win下的最大连接并发数。比如以前xp默认最大10.
和这个没关系吧?电脑是server 2008并无限制。通篇求得其实是异步socket如何重用,因为是客户端,connectex之后不知如何断开连接并重用,直接disconnectex再connect会报10022
小乔家人 2020-03-12
  • 打赏
  • 举报
回复
引用 4 楼 zgl7903 的回复:
异步Connect以后,可以使用 select 查看可写状态, Connect成功后socket 会变成可写(可发送状态)

//联机到服务器
BOOL bConnectOK = FALSE;
{
  SOCKADDR_IN server;
  memset(&server, 0, sizeof(server));
  server.sin_family = AF_INET;
  server.sin_addr.s_addr = htonl(m_dwServerIPAddr);
  server.sin_port = htons((WORD)m_dwServerPort);
  int iconnect = connect(m_CommSock, (struct sockaddr*)&server, sizeof(server));
  if(iconnect == 0) //直接成功
  {
    bConnectOK = 1;
    break;
  }

  fd_set writefds;
  FD_ZERO(&writefds);
  FD_SET(m_CommSock, &writefds);
  timeval tOut = {1, 0};
  if( select(0, NULL, &writefds, NULL, &tOut) > 0 && FD_ISSET(m_CommSock, &writefds) )
  {
    bConnectOK = 2;
    break;
  }
}while(0);
你这不对吧?异步socket会直接返回true吗? 通篇求得其实是异步socket如何重用,因为是客户端,connectex之后不知如何断开连接并重用,直接disconnectex再connect会报10022
gouyanfen 2020-03-12
  • 打赏
  • 举报
回复
引用 13 楼 小乔家人 的回复:
[quote=引用 10 楼 gouyanfen 的回复:] 你同学说python比C++写的快也没问题的,C++本来就写的慢,只是运行起来快,python都是包装好的肯定快了。不能否认python写东西快,只是效率嘛就看需要了。
python写起来肯定比c++快,这个没问题,反对的是python跑起来比c++快[/quote] 这问题还用争吗,能说出这样的话说明水平还太次。你跟他争论这个问题本身就错了,这问题根本就不需要争论。
小乔家人 2020-03-12
  • 打赏
  • 举报
回复
引用 10 楼 gouyanfen 的回复:
你同学说python比C++写的快也没问题的,C++本来就写的慢,只是运行起来快,python都是包装好的肯定快了。不能否认python写东西快,只是效率嘛就看需要了。
python写起来肯定比c++快,这个没问题,反对的是python跑起来比c++快
小乔家人 2020-03-12
  • 打赏
  • 举报
回复
引用 9 楼 worldy 的回复:
lz应该明白,多线程应用并不是线程越多就越快,因为线程本质就是时间片。如果你的CPU只有一个核,那么原理上,对于相同的任务做成多线程执行肯定不会比单线程执行快!!!因为,多线程就需要耗费好多的资源用于线程调度,并且多线程之间往往需要需要线程同步而必须将数据锁定。。。 win环境下winsock应用最经典的应用是IOCP(完成端口),使用的是线程池,线程池的线程数量一般限制在CPU的核心数的2倍,再多的线程就没有意义,再多就会降低整体的执行效率
效率可后面再考虑,我现在想知道的就是socket如何重用,客户端connect之后如何不closesocket换个端口仍能connnect
小乔家人 2020-03-12
  • 打赏
  • 举报
回复
引用 8 楼 zgl7903 的回复:
[quote=引用 6 楼 小乔家人 的回复:] [quote=引用 4 楼 zgl7903 的回复:] 异步Connect以后,可以使用 select 查看可写状态, Connect成功后socket 会变成可写(可发送状态)

//联机到服务器
BOOL bConnectOK = FALSE;
{
  SOCKADDR_IN server;
  memset(&server, 0, sizeof(server));
  server.sin_family = AF_INET;
  server.sin_addr.s_addr = htonl(m_dwServerIPAddr);
  server.sin_port = htons((WORD)m_dwServerPort);
  int iconnect = connect(m_CommSock, (struct sockaddr*)&server, sizeof(server));
  if(iconnect == 0) //直接成功
  {
    bConnectOK = 1;
    break;
  }

  fd_set writefds;
  FD_ZERO(&writefds);
  FD_SET(m_CommSock, &writefds);
  timeval tOut = {1, 0};
  if( select(0, NULL, &writefds, NULL, &tOut) > 0 && FD_ISSET(m_CommSock, &writefds) )
  {
    bConnectOK = 2;
    break;
  }
}while(0);
你这不对吧?异步socket会直接返回true吗? 通篇求得其实是异步socket如何重用,因为是客户端,connectex之后不知如何断开连接并重用,直接disconnectex再connect会报10022[/quote] 关键在下面的 select 上 [/quote] 不是,我不是这个问题,我现在那段代码的问题是初始化和connect第一次运行是没问题的,select之后没得到结果或者得到结果了进入recv后我socket并不想close掉,想循环再利用当前socket换个端口再次conect的时候报错10022,看网上说的是需要先disconnectex,但那是服务端的逻辑吧?我这个就是个客户端
zgl7903 2020-03-10
  • 打赏
  • 举报
回复
异步Connect以后,可以使用 select 查看可写状态, Connect成功后socket 会变成可写(可发送状态)

//联机到服务器
BOOL bConnectOK = FALSE;
{
  SOCKADDR_IN server;
  memset(&server, 0, sizeof(server));
  server.sin_family = AF_INET;
  server.sin_addr.s_addr = htonl(m_dwServerIPAddr);
  server.sin_port = htons((WORD)m_dwServerPort);
  int iconnect = connect(m_CommSock, (struct sockaddr*)&server, sizeof(server));
  if(iconnect == 0) //直接成功
  {
    bConnectOK = 1;
    break;
  }

  fd_set writefds;
  FD_ZERO(&writefds);
  FD_SET(m_CommSock, &writefds);
  timeval tOut = {1, 0};
  if( select(0, NULL, &writefds, NULL, &tOut) > 0 && FD_ISSET(m_CommSock, &writefds) )
  {
    bConnectOK = 2;
    break;
  }
}while(0);
smwhotjay 2020-03-10
  • 打赏
  • 举报
回复

还要检查下win下的最大连接并发数。比如以前xp默认最大10.
小乔家人 2020-03-09
  • 打赏
  • 举报
回复
嗯,看了一下资料,看明白了,connect 得判断WSAEWOULDBLOCK,然后要重用得disconnectex,要不然就close掉再重新开辟,虽然怎么写还不会,不过大概知道错在哪了
小乔家人 2020-03-09
  • 打赏
  • 举报
回复
33X9是敏感词?X=8
小乔家人 2020-03-09
  • 打赏
  • 举报
回复

UINT g_uStartTime = 0;
UINT g_uEndTime = 0;
int g_nCount = 0;
SOCKET* g_SocketList = NULL;
把全局贴一下 我原来是起1000个线程,发现80结束的很快(80,1080,2080......66080)不知道为啥? 然后调试的时候发现定33X9条件断点不进入 各种奇怪问题,而且如果我从89开始跟,33X9能被检测到,但是不下断就无法被检测到怀疑是超时设置的问题,但不能确定
第一章 概论 .................................................................................................................. 1 1.1 网络的历史................................................................. ...................................... 1 1.2 OSI 模型........................................................................................................... 3 1.3 Internet 体系模型.............................................................................................. 4 1.4 客户/服务器模型............................................................................................... 5 1.4 UNIX 的历史 ................................................................................................... 7 1.4.1 Unix 诞生前的故事 ................................................................................. 7 1.4.2 UNIX 的诞生.......................................................................................... 8 1.4.3 1979 – UNIX 第七版 ............................................................................. 10 1.4.4 UNIX 仅仅是历史吗?............................................................................. 11 1.5 Linux 的发展.................................................................................................. 11 1.5.1 Linux 的发展历史 .................................................................................. 12 1.5.2 什么叫 GNU? ...................................................................................... 12 1.5.3 Linux 的特色 ........................................................................................ 13 1.5.4 硬件需求............................................................................................... 14 1.5.5 Linux 可用的软件 ................................................................................. 14 1.5.6 为什么选择 Linux ? ............................................................................ 15 1.6 Linux 和 Unix 的发展 .................................................................................... 15 第二章 UNIX/Linux 模型...............................................................................................17 2.1 UNIX/Linux 基本结构.......................................................................................17 2.2 输入和输出......................................................................................................19 2.2.1 UNIX/Linux 文件系统简介 ......................................................................19 2.2.2 流和标准 I/O 库......................................................................................20 2.3 进程 ................................................................................................................21 第三章 进程控制 ..........................................................................................................22 3.1 进程的建立与运行 ...........................................................................................22 3.1.1 进程的概念 ............................................................................................22 3.1.2 进程的建立 ............................................................................................22 3.1.3 进程的运行 ............................................................................................24 3.1.4 数据和文件描述符的继承 .......................................................................29 3.2 进程的控制操作...............................................................................................31 3.2.1 进程的终止 ............................................................................................31 3.2.2 进程的同步 ............................................................................................32 3.2.3 进程终止的特殊情况 ..............................................................................33 3.2.4 进程控制的实例 .....................................................................................33 3.3 进程的属性......................................................................................................38 3.3.1 进程标识符 ............................................................................................38 3.3.2 进程的组标识符 .....................................................................................39 3.3.3 进程环境................................................................................................40 3.3.4 进程的当前目录 .....................................................................................42 3.3.5 进程的有效标识符..................................................................................43 3.3.6 进程的资源 ............................................................................................44 3.3.7 进程的优先级.........................................................................................45 3.4 守护进程 .........................................................................................................46 3.4.1 简介.......................................................................................................46 3.4.2 守护进程的启动 ............................................................................................46 3.4.3 守护进程的错误输出 ..............................................................................46 3.4.4 守护进程的建立 .....................................................................................48 3.5 本章小结 .........................................................................................................49 第四章 进程间通信.......................................................................................................50 4.1 进程间通信的一些基本概念 .............................................................................50 4.2 信号 ................................................................................................................50 4.2.1 信号的处理 ............................................................................................52 4.2.2 信号与系统调用的关系...........................................................................54 4.2.3 信号的复位 ............................................................................................55 4.2.4 在进程间发送信号..................................................................................56 4.2.5 系统调用 alarm()和 pause()......................................................................58 4.2.6 系统调用 setjmp()和 longjmp().................................................................62 4.3 管道 ................................................................................................................63 4.3.1 用 C 来建立、使用管道 ..........................................................................65 4.3.2 需要注意的问题 .....................................................................................72 4.4 有名管道 .........................................................................................................72 4.4.1 有名管道的创建 .....................................................................................72 4.4.2 有名管道的 I/O 使用...............................................................................73 4.4.3 未提到的关于有名管道的一些注意 .........................................................75 4.5 文件和记录锁定...............................................................................................75 4.5.1 实例程序及其说明..................................................................................75 4.5.2 锁定中的几个概念..................................................................................78 4.5.3 System V 的咨询锁定..............................................................................78 4.5.4 BSD 的咨询式锁定 .................................................................................79 4.5.5 前面两种锁定方式的比较 .......................................................................81 4.5.6 Linux 的其它上锁技术 ............................................................................81 4.6 System V IPC ...................................................................................................84 4.6.1 ipcs 命令 ................................................................................................85 4.6.2 ipcrm 命令..............................................................................................86 4.7 消息队列(Message Queues)...........................................................................86 4.7.1 有关的数据结构 .....................................................................................86 4.7.2 有关的函数 ............................................................................................89 4.7.3 消息队列实例——msgtool,一个交互式的消息队列使用工具 ..................94 4.8 信号量(Semaphores) .........................................................................................97 4.8.1 有关的数据结构 .....................................................................................98 4.8.2 有关的函数 ............................................................................................99 4.8.3 信号量的实例——semtool,交互式的信号量使用工具........................... 103 4.9 共享内存(Shared Memory) .............................................................................. 109 4.9.1 有关的数据结构 ................................................................................... 109 4.9.2 有关的函数 .......................................................................................... 110 4.9.3 共享内存应用举例——shmtool,交互式的共享内存使用工具................... 112 4.9.4 共享内存与信号量的结合使用 .............................................................. 114 第五章 通信协议简介 ................................................................................................. 120 5.1 引言 .............................................................................................................. 120 5.2 XNS(Xerox Network Systems)概述.............................................................. 120 5.2.1 XNS 分层结构...................................................................................... 120 IPX/SPX 协议概述........................................................................................ 122 5.3 5.3.1 网际包交换(IPX) ............................................................................. 122 5.3.2 排序包交换(SPX)............................................................................. 124 5.4 Net BIOS 概述................................................................................................ 124 5.5 Apple Talk 概述 .............................................................................................. 125 5.6 TCP/IP 概述................................................................................................... 126 5.6.1 TCP/IP 结构模型 .................................................................................. 126 5.6.2 Internet 协议(IP)............................................................................... 127 5.6.3 传输控制协议(TCP) ......................................................................... 132 5.6.4 用户数据报文协议................................................................................ 134 5.7 小结 .............................................................................................................. 135 第六章 Berkeley 套接字 ............................................................................................. 136 6.1 引言 ............................................................................................................. 136 6.2 概述 ............................................................................................................. 136 6.2.1 Socket 的历史...................................................................................... 136 6.2.2 Socket 的功能...................................................................................... 136 6.2.3 套接字的三种类型............................................................................... 138 6.3 Linux 支配的网络协议................................................................................... 141 6.3.1 什么是 TCP/IP? ................................................................................... 141 6.4 套接字地址................................................................................................... 142 6.4.1 什么是 Socket? .................................................................................. 142 6.4.2 Socket 描述符...................................................................................... 142 6.4.3 一个套接字是怎样在网络上传输数据的?............................................ 143 6.5 套接字的一些基本知识 ................................................................................. 144 6.5.1 基本结构............................................................................................. 144 6.5.2 基本转换函数...................................................................................... 145 6.6 基本套接字调用............................................................................................ 147 6.6.1 socket() 函数....................................................................................... 147 6.6.2 bind() 函数 ......................................................................................... 148 6.6.3 connect()函数 ...................................................................................... 150 6.6.4 listen() 函数........................................................................................ 151 6.6.5 accept()函数 ........................................................................................ 152 6.6.6 send()、recv()函数 ............................................................................... 154 6.6.7 sendto() 和 recvfrom() 函数 ................................................................. 155 6.6.8 close()和 shutdown()函数...................................................................... 156 6.6.9 setsockopt() 和 getsockopt() 函数 ......................................................... 157 6.6.10 getpeername()函数.............................................................................. 157 6.6.11 gethostname()函数.............................................................................. 158 6.7 DNS 的操作.................................................................................................. 158 6.7.1 理解 DNS............................................................................................ 158 6.7.2 和 DNS 有关的函数和结构 .................................................................. 158 6.7.3 DNS 例程............................................................................................ 159 6.8 套接字的 Client/Server 结构实现的例子.......................................................... 160 6.8.1 简单的流服务器 .................................................................................. 161 6.8.2 简单的流式套接字客户端程序 ............................................................. 163 6.8.3 数据报套接字例程(DatagramSockets)............................................... 165 6.9 保留端口 ...................................................................................................... 169 6.9.1 简介.................................................................................................... 169 6.9.2 保留端口............................................................................................. 170 6.10 五种 I/O 模式................................................................................................. 179 6.10.1 阻塞 I/O 模式 .................................................................................... 179 6.10.2 非阻塞模式 I/O.................................................................................. 180 6.10.3 I/O 多路复用 ..................................................................................... 181 6.10.4 信号驱动 I/O 模式 ............................................................................. 182 6.10.5 异步 I/O 模式 .................................................................................... 185 6.10.6 几种 I/O 模式的比较.......................................................................... 186 6.10.7 fcntl()函数 ......................................................................................... 186 6.10.8 套接字选择项 select()函数.................................................................. 187 6.11 带外数据..................................................................................................... 190 6.11.1 TCP 的带外数据 ................................................................................ 190 6.11.2 OOB 传输套接字例程(服务器代码 Server.c) ................................... 193 6.11.3 OOB 传输套接字例程(客户端代码 Client.c).................................... 196 6.11.4 编译例子 ........................................................................................... 199 6.12 使用 Inetd(Internet 超级服务器) ............................................................... 199 6.12.1 简介.................................................................................................. 199 6.12.2 一个简单的 inetd 使用的服务器程序 hello inet service.......................... 199 6.12.3 /etc/services 和 /etc/inetd.conf 文件 ..................................................... 200 6.12.4 一个复杂一些的 inetd 服务器程序 ...................................................... 201 6.12.5 一个更加复杂的 inetd 服务器程序 ...................................................... 203 6.12.6 程序必须遵守的安全性准则............................................................... 205 6.12.7 小结.................................................................................................. 205 6.13 本章总结 .................................................................................................... 205 第七章 网络安全性..................................................................................................... 206 7.1 网络安全简介 ................................................................................................ 206 7.1.1 网络安全的重要性................................................................................ 206 7.1.2 信息系统安全的脆弱性......................................................................... 207 7.2 Linux 网络不安全的因素 ................................................................................ 209 7.3 Linux 程序员安全........................................................................................... 211 7.3.1 系统子程序 .......................................................................................... 212 7.3.2 标准 C 函数库....................................................................................... 214 7.3.3 书写安全的 C 程序................................................................................ 216 7.3.4 SUID/SGID 程序指导准则...................................................................... 217 7.3.5 root 程序的设计.................................................................................... 218 7.4 小结 .............................................................................................................. 219 第八章 Ping 例程 ....................................................................................................... 220 8.1 Ping 命令简介 ................................................................................................ 220 8.2 Ping 的基本原理............................................................................................. 220 8.3 小结 .............................................................................................................. 221 第九章 tftp 例程......................................................................................................... 222 9.1 tftp 协议简介.................................................................................................. 222 9.2 tftp 的使用 ..................................................................................................... 222 9.3 tftp 的原理 ..................................................................................................... 223 9.3 tftp 的基本结构 .............................................................................................. 223 9.4 小节 .............................................................................................................. 225 第十章 远程命令执行 ................................................................................................. 226 10.1 引言 ............................................................................................................ 226 10.2 rcmd 函数和 rshd 服务器............................................................................... 227 10.3 rexec 函数和 rexecd 服务器........................................................................... 233 第十一章 远程注册..................................................................................................... 235 11.1 简介............................................................................................................. 235 11.2 终端行律和伪终端........................................................................................ 235 11.3 终端方式字和控制终端................................................................................. 239 11.4 rlogin 概述.................................................................................................... 242 11.5 窗口环境...................................................................................................... 242 11.6 流控制与伪终端方式字................................................................................. 243 11.7 rlogin 客户程序............................................................................................. 245 11.8 rlogin 服务器 ................................................................................................ 246 第十二章 远程过程调用.............................................................................................. 249 12.1 引言 ............................................................................................................ 249 12.2 远程过程调用模型 ....................................................................................... 249 12.3 传统过程调用和远程过程调用的比较 ........................................................... 250 12.4 远程过程调用的定义.................................................................................... 252 12.5 远程过程调用的有关问题............................................................................. 252 12.5.1 远程过程调用传送协议....................................................................... 253 12.5.2 Sun RPC ........................................................................................... 254 12.5.3 Xerox Courier .................................................................................... 254 12.5.4 Apollo RPC........................................................................................ 255 12.6 stub 过程简介............................................................................................... 256 12.7 rpcgen 简介 .................................................................................................. 256 12.8 分布式程序生成的例子 ................................................................................ 257 12.8.1 我们如何能够构造出一个分布式应用程序........................................... 257 12.9 小结 ............................................................................................................ 283 第十三章 远程磁带的访问 .......................................................................................... 284 13.1 简介 ............................................................................................................ 284 13.2 Linux 磁带驱动器的处理 .............................................................................. 285 13.3 rmt 协议....................................................................................................... 285 13.4 rmt 服务器设计分析 ..................................................................................... 286 第十四章 WWW 上 HTTP 协议.................................................................................. 290 14.1 引言............................................................................................................ 290 14.2 HTTP 客户请求........................................................................................... 290 14.2.1 客户端 .............................................................................................. 290 14.2.2 服务器端........................................................................................... 290 14.2.3 Web 请求简介.................................................................................... 291 14.2.4 HTTP – HyperText Transfer Protocol 超文本传输协议 ........................... 295 14.3 Web 编程 .................................................................................................... 297 14.4 小结 ........................................................................................................... 301 附录 A 有关网络通信的服务和网络库函数................................................................... 302 附录 B Vi 使用简介..................................................................................................... 319 B.1 Vi 基本观念................................................................................................... 319 B.1.1 进入与离开.......................................................................................... 319 B.1.2 Vi 输入模式 ......................................................................................... 319 B.2 Vi 基本编辑................................................................................................... 320 B.2.1 删除与修改.......................................................................................... 320 B.3 Vi 进阶应用................................................................................................... 320 B.3.1 移动光标 ............................................................................................. 320 B.3.2 进阶编辑命令 ...................................................................................... 322 B.3.3 文件命令 ............................................................................................. 322 附录 C Linux 下 C 语言使用与调试简介 ...................................................................... 324 C.1 C 语言编程 ................................................................................................... 324 C.2 什么是 C? ..................................................................................................... 324 C.3 GNU C 编译器............................................................................................... 324 C.3.1 使用 GCC ............................................................................................ 324 C.3.2 GCC 选项 ............................................................................................ 325 C.3.3 优化选项 ............................................................................................. 325 C.3.4 调试和剖析选项................................................................................... 325 C.3.5 用 gdb 调试 GCC 程序.......................................................................... 326 C.4 另外的 C 编程工具 ........................................................................................ 330 C.4.1 Xxgdb.................................................................................................. 330 C.4.2 Calls .................................................................................................... 331 C.4.3 cproto .................................................................................................. 332 C.4.4 Indent .................................................................................................. 333 C.4.5 Gprof................................................................................................... 334 C.4.6 f2c 和 p2c ............................................................................................ 335 附录 D Ping 源码 ........................................................................................................ 336 附录 E TFTP 服务器程序源码 ..................................................................................... 362
一万多培训费的资料,北京权威的.NET培训机构】 【认真学习后你一定能成为优秀的.net程序员】 学习对象:1.大专及大专以上理工科学历,或有相当学历的理工科教育背景     2.热爱软件编程及软件开发工作 培养目标:IT人才市场紧缺的精通.Net应用开发的软件技术人才。 精通C#.Net、ASP.Net、ADO.Net、AJAX、WEB2.0、XML、JavaScript、SQL Server 2000、Web Service、WSE2.0、.Net Remoting、MultiThread Programming、Socket Programming、Windows Service、Data Structure、 Algorithm、OOA/OOD、UML 、VSS、Rational Rose、Visio等; 掌握Visual Studio .Net 2005开发环境; 熟练开发Web应用程序、Windows应用程序和 基于数据库的各种应用程序;熟练开发电子商务软件、电子政务软件和各种信息 管理软件.熟悉面向对象的建模、分析、设计和实施方法.掌握UML建模语言和 Rational Rose、Visio等建模工具。 第一阶段教学内容安排(200课时) 课程名称 课程内容 培训目的 C# 基本语法、面向对象的思想、数据结构和算法以及设计模式(120课时) 详细介绍.Net Framework、C# 基本语法、编程规范和编程技巧、面向对象的认识问题和分析问题的思想、以及数据结构和常用算法,学习单件模式、适配器模式和工厂模式。 深入了解.Net FrameWork、掌握C#语法,学会C#编程,掌握数据结构、常用算法和面向对象的思想。 针对循环、数组、类的概念、类的构建、类的使用、对象的创建、面向对象的思想、集合、排序、IO操作等知识点先后安排2或3个小型项目:1。制作一个通讯录;2。制作一个小游戏;3。教学管理系统。 通过实际项目深入理解和掌握C# 基本语法、面向对象的思想、类的概念和使用、对象的创建、排序、IO操作等 数据库知识和 SQL Server 2000 (40课时) 讲授数据库的基本知识和SQL Server 2000, 讲授数据库的设计和优化,学习T-SQL 和数据库编程,学习存储过程(stored procedure)和触发机制(trigger). 掌握 SQL Server 2000, 学会数据库编程, 掌握T-SQL, Stored Procedure, Trigger. C# 高级编程I (40课时) 系统地讲授多线程的基本概念、线程的设计、线程的优先级等以及线程的使用;讲授共享程序集(公有程序集)、私有程序集的组成、原理和使用;学习反射(Reflection)、属性(Attribute)的相关概念和使用。学习流(stream)的概念和IO操作、文件的读写和传输。 掌握多线程编程、文件的操作和程序集的相关概念,学习反射和属性。 第二阶段教学内容安排(400课时) 课程名称 课程内容 培训目的 ASP.Net2.0、ADO.Net2.0和Web 应用程序 (160课时) 系统讲授 ASP.Net2.0、ADO.Net2.0、 基于数据库的WEB应用程序、的开发;详细地讲授Web Service及其应用和相关的安全性问题、WSE(Web Services Enhancements)、SOAP、WSDL、UDDI、Windows Service、VSS(Visual Source Safe)。讲授用户控件和第三方控件的开发和使用。学习HTML、XML、JavaScript、水晶报表(Crystal Report)和IIS 基础以及WEB应用程序性能优化;学习Ajax、Web2.0的相关技术。 熟练开发基于数据库的Web应用程序、Windows应用程序。熟练开发Windows Service 和 Web Service、Ajax、Web2.0、XML等等. 针对ASP.Net2.0、ADO.Net2.0、Web服务(Web Service)、HTML、XML、JavaScript、水晶报表(Crystal Report)、Ajax、Web2.0等知识点先后安排2或3个小型项目:1。基于Web的文件管理系统(File Management System);2。基于Web的咨询系统(基于Web的聊天室);3。论坛系统 通过实际项目深入理解和掌握相关的技术和知识点:Asp.Net、Ajax、 Ado.Net、Web Service等。 Windows 应用程序、设计模式和Oracle数据库编程(40课时) 系统地讲授Windows应用程序的开发,学习观察者模式和Oracle数据库编程。 熟练开发基于数据库的Windows应用程序,掌握Oracle数据库编程。 C# 高级编程II (40课时) 详细讲授DNS开发、套接字(Socket)编程、TCP、UDP 编程、消息队列(MSMQ)及其编程;详细讲授远程处理(Remoting)技术,包括基本远程处理框架,配置文件及其应用, 异步远程处理技术,租约和生存期控制;系统地讲授Windows服务编程、Com+ 服务、WSE2.0的使用。 掌握 Socket 编程、TCP、 UDP编程、远程处理(Remoting)技术、Windows服务编程;Com+ 服务、WSE2.0等。 OOAD&UML (24课时) 讲授面向对象的分析设计方法、UML 语法及Rational Rose/MS Visio 工具的使用 和VSS的使用。 掌握面向对象的建模、分析、设计和实施方法.学习UML 建模语言和 Rational Rose /MS Visio 建模工具. 项目实习 (120课时) 在培训老师的指导下完成一个实际的电子商务软件项目:” Prepaid Phone Card Online Sales System”。内容包括:Application Architecture Analysis、Creating the Data Model、Design Database Schema、Programming Stored procedures、Web Application Design、App Setting、 Log in Design、 Security、 Authentication、Authorization、 Navigation Bar、Shopping Cart、Cross-Brower Support、Performance. 通过实际项目, 培养学生实战能力,包括系统分析、设计(包括功能需求分析、数据库设计、功能模块设计和详细设计)、开发、调试、测试和部署的能力。 总复习 考试与就业指导 (16课时) 串讲全部内容,并且针对实际面试情况,有侧重地进行总体复习。 在整个学习过程中有四次考试,占四个周六的时间。
价值一万八的中美 IT 培训笔记一万多培训费的资料,北京权威的.NET培训机构】 【认真学习后你一定能成为优秀的.net程序员】 学习对象:1.大专及大专以上理工科学历,或有相当学历的理工科教育背景     2.热爱软件编程及软件开发工作 培养目标:IT人才市场紧缺的精通.Net应用开发的软件技术人才。 精通C#.Net、ASP.Net、ADO.Net、AJAX、WEB2.0、XML、JavaScript、SQL Server 2000、Web Service、WSE2.0、.Net Remoting、MultiThread Programming、Socket Programming、Windows Service、Data Structure、 Algorithm、OOA/OOD、UML 、VSS、Rational Rose、Visio等; 掌握Visual Studio .Net 2005开发环境; 熟练开发Web应用程序、Windows应用程序和 基于数据库的各种应用程序;熟练开发电子商务软件、电子政务软件和各种信息 管理软件.熟悉面向对象的建模、分析、设计和实施方法.掌握UML建模语言和 Rational Rose、Visio等建模工具。 第一阶段教学内容安排(200课时) 课程名称 课程内容 培训目的 C# 基本语法、面向对象的思想、数据结构和算法以及设计模式(120课时) 详细介绍.Net Framework、C# 基本语法、编程规范和编程技巧、面向对象的认识问题和分析问题的思想、以及数据结构和常用算法,学习单件模式、适配器模式和工厂模式。 深入了解.Net FrameWork、掌握C#语法,学会C#编程,掌握数据结构、常用算法和面向对象的思想。 针对循环、数组、类的概念、类的构建、类的使用、对象的创建、面向对象的思想、集合、排序、IO操作等知识点先后安排2或3个小型项目:1。制作一个通讯录;2。制作一个小游戏;3。教学管理系统。 通过实际项目深入理解和掌握C# 基本语法、面向对象的思想、类的概念和使用、对象的创建、排序、IO操作等 数据库知识和 SQL Server 2000 (40课时) 讲授数据库的基本知识和SQL Server 2000, 讲授数据库的设计和优化,学习T-SQL 和数据库编程,学习存储过程(stored procedure)和触发机制(trigger). 掌握 SQL Server 2000, 学会数据库编程, 掌握T-SQL, Stored Procedure, Trigger. C# 高级编程I (40课时) 系统地讲授多线程的基本概念、线程的设计、线程的优先级等以及线程的使用;讲授共享程序集(公有程序集)、私有程序集的组成、原理和使用;学习反射(Reflection)、属性(Attribute)的相关概念和使用。学习流(stream)的概念和IO操作、文件的读写和传输。 掌握多线程编程、文件的操作和程序集的相关概念,学习反射和属性。 第二阶段教学内容安排(400课时) 课程名称 课程内容 培训目的 ASP.Net2.0、ADO.Net2.0和Web 应用程序 (160课时) 系统讲授 ASP.Net2.0、ADO.Net2.0、 基于数据库的WEB应用程序、的开发;详细地讲授Web Service及其应用和相关的安全性问题、WSE(Web Services Enhancements)、SOAP、WSDL、UDDI、Windows Service、VSS(Visual Source Safe)。讲授用户控件和第三方控件的开发和使用。学习HTML、XML、JavaScript、水晶报表(Crystal Report)和IIS 基础以及WEB应用程序性能优化;学习Ajax、Web2.0的相关技术。 熟练开发基于数据库的Web应用程序、Windows应用程序。熟练开发Windows Service 和 Web Service、Ajax、Web2.0、XML等等. 针对ASP.Net2.0、ADO.Net2.0、Web服务(Web Service)、HTML、XML、JavaScript、水晶报表(Crystal Report)、Ajax、Web2.0等知识点先后安排2或3个小型项目:1。基于Web的文件管理系统(File Management System);2。基于Web的咨询系统(基于Web的聊天室);3。论坛系统 通过实际项目深入理解和掌握相关的技术和知识点:Asp.Net、Ajax、 Ado.Net、Web Service等。 Windows 应用程序、设计模式和Oracle数据库编程(40课时) 系统地讲授Windows应用程序的开发,学习观察者模式和Oracle数据库编程。 熟练开发基于数据库的Windows应用程序,掌握Oracle数据库编程。 C# 高级编程II (40课时) 详细讲授DNS开发、套接字(Socket)编程、TCP、UDP 编程、消息队列(MSMQ)及其编程;详细讲授远程处理(Remoting)技术,包括基本远程处理框架,配置文件及其应用, 异步远程处理技术,租约和生存期控制;系统地讲授Windows服务编程、Com+ 服务、WSE2.0的使用。 掌握 Socket 编程、TCP、 UDP编程、远程处理(Remoting)技术、Windows服务编程;Com+ 服务、WSE2.0等。 OOAD&UML (24课时) 讲授面向对象的分析设计方法、UML 语法及Rational Rose/MS Visio 工具的使用 和VSS的使用。 掌握面向对象的建模、分析、设计和实施方法.学习UML 建模语言和 Rational Rose /MS Visio 建模工具. 项目实习 (120课时) 在培训老师的指导下完成一个实际的电子商务软件项目:” Prepaid Phone Card Online Sales System”。内容包括:Application Architecture Analysis、Creating the Data Model、Design Database Schema、Programming Stored procedures、Web Application Design、App Setting、 Log in Design、 Security、 Authentication、Authorization、 Navigation Bar、Shopping Cart、Cross-Brower Support、Performance. 通过实际项目, 培养学生实战能力,包括系统分析、设计(包括功能需求分析、数据库设计、功能模块设计和详细设计)、开发、调试、测试和部署的能力。 总复习 考试与就业指导 (16课时) 串讲全部内容,并且针对实际面试情况,有侧重地进行总体复习。 在整个学习过程中有四次考试,占四个周六的时间。
http://bbs.dbank.com/viewthread.php?tid=12225&page=1&extra=#pid131534 一万多培训费的资料,北京权威的.NET培训机构】 【认真学习后你一定能成为优秀的.net程序员】 学习对象:1.大专及大专以上理工科学历,或有相当学历的理工科教育背景     2.热爱软件编程及软件开发工作 培养目标:IT人才市场紧缺的精通.Net应用开发的软件技术人才。 精通C#.Net、ASP.Net、ADO.Net、AJAX、WEB2.0、XML、JavaScript、SQL Server 2000、Web Service、WSE2.0、.Net Remoting、MultiThread Programming、Socket Programming、Windows Service、Data Structure、 Algorithm、OOA/OOD、UML 、VSS、Rational Rose、Visio等; 掌握Visual Studio .Net 2005开发环境; 熟练开发Web应用程序、Windows应用程序和 基于数据库的各种应用程序;熟练开发电子商务软件、电子政务软件和各种信息 管理软件.熟悉面向对象的建模、分析、设计和实施方法.掌握UML建模语言和 Rational Rose、Visio等建模工具。 第一阶段教学内容安排(200课时) 课程名称 课程内容 培训目的 C# 基本语法、面向对象的思想、数据结构和算法以及设计模式(120课时) 详细介绍.Net Framework、C# 基本语法、编程规范和编程技巧、面向对象的认识问题和分析问题的思想、以及数据结构和常用算法,学习单件模式、适配器模式和工厂模式。 深入了解.Net FrameWork、掌握C#语法,学会C#编程,掌握数据结构、常用算法和面向对象的思想。 针对循环、数组、类的概念、类的构建、类的使用、对象的创建、面向对象的思想、集合、排序、IO操作等知识点先后安排2或3个小型项目:1。制作一个通讯录;2。制作一个小游戏;3。教学管理系统。 通过实际项目深入理解和掌握C# 基本语法、面向对象的思想、类的概念和使用、对象的创建、排序、IO操作等 数据库知识和 SQL Server 2000 (40课时) 讲授数据库的基本知识和SQL Server 2000, 讲授数据库的设计和优化,学习T-SQL 和数据库编程,学习存储过程(stored procedure)和触发机制(trigger). 掌握 SQL Server 2000, 学会数据库编程, 掌握T-SQL, Stored Procedure, Trigger. C# 高级编程I (40课时) 系统地讲授多线程的基本概念、线程的设计、线程的优先级等以及线程的使用;讲授共享程序集(公有程序集)、私有程序集的组成、原理和使用;学习反射(Reflection)、属性(Attribute)的相关概念和使用。学习流(stream)的概念和IO操作、文件的读写和传输。 掌握多线程编程、文件的操作和程序集的相关概念,学习反射和属性。 第二阶段教学内容安排(400课时) 课程名称 课程内容 培训目的 ASP.Net2.0、ADO.Net2.0和Web 应用程序 (160课时) 系统讲授 ASP.Net2.0、ADO.Net2.0、 基于数据库的WEB应用程序、的开发;详细地讲授Web Service及其应用和相关的安全性问题、WSE(Web Services Enhancements)、SOAP、WSDL、UDDI、Windows Service、VSS(Visual Source Safe)。讲授用户控件和第三方控件的开发和使用。学习HTML、XML、JavaScript、水晶报表(Crystal Report)和IIS 基础以及WEB应用程序性能优化;学习Ajax、Web2.0的相关技术。 熟练开发基于数据库的Web应用程序、Windows应用程序。熟练开发Windows Service 和 Web Service、Ajax、Web2.0、XML等等. 针对ASP.Net2.0、ADO.Net2.0、Web服务(Web Service)、HTML、XML、JavaScript、水晶报表(Crystal Report)、Ajax、Web2.0等知识点先后安排2或3个小型项目:1。基于Web的文件管理系统(File Management System);2。基于Web的咨询系统(基于Web的聊天室);3。论坛系统 通过实际项目深入理解和掌握相关的技术和知识点:Asp.Net、Ajax、 Ado.Net、Web Se

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧