基于TCP协议的socket编程生动活泼的解释

以下是对基于tcp协议的网络编程的一些重要知识点:

用打电话的过程来模仿tcp协议的网络传输。

套接字:好比电话机。

我们先要装电话机(加载套接字库),作为服务器的一方必须与电话机形成一对一的关系才能接到电话(绑定bind),要想接到电话必须守候在电话机旁边(监听listen),当有电话过来的时候,服务器必须拿起电话(accept),在这个过程中,当服务器得知客户端的详细信息后,于是接收和发送消息(recvsend),最后放下电话(释放套接字),离开电话机(释放资源)。

作为客户端,要想给服务器打电话,同样装电话(加载套接字库),就必须请求电信局帮忙连接(请求连接connect),当服务器端接受以后,就可以进行通话(sendrecv)。

首先我们在运用tcp协议方面的知识去编程的时候得了解的步骤:

1.       服务器端的程序编写:

首先,加载套接字库。WSAStartup()进行加载,参看msdn

创建套接字:SOCKET创建对象。

绑定到本地的主机和端口:用bind()函数

进行监听:listen()进行监听。其中这个函数可以设置消息队列的数目,超过这个数再请求就会失败。

当有客户端请求的时候,则accept()进行接受请求。

然后运用recvsend进行通话。

2. 客户端程序的编写:

   首先加载套接字库。WSAStartup(),同上

   请求连接:connect()。

   当服务器统一建立连接的时候,就可以用recv()与send()进行通信了。

以下分别是一个服务器端和一个客户端的程序:

#include <stdio.h>//注意:我们还得在工程中加载dll,加载的是WS2_32.lib库文件。

#include <WINSOCK2.H>

void main()

{

       WORD wVersionRequested;

       WSADATA wsaData;

       int err;

       wVersionRequested = MAKEWORD( 1,1 ); 

       err = WSAStartup( wVersionRequested, &wsaData );

       if ( err != 0 ) {

              return;

       }

       if ( LOBYTE( wsaData.wVersion ) != 1 ||

        HIBYTE( wsaData.wVersion ) != 1 )

       {                    

              WSACleanup( );

              return;

       }

       SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);

      

       SOCKADDR_IN addrSrv;

       addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);

       addrSrv.sin_family=AF_INET;

       addrSrv.sin_port=htons(6000);

      

       bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

      

       listen(sockSrv,5);

      

       //     SOCKET sockClient;

       SOCKADDR_IN addrConn;

       int len=sizeof(SOCKADDR);

       while (1)

       {

              SOCKET sockClient=accept(sockSrv,(SOCKADDR*)&addrConn,&len);

             

              char szBuffer[100];

              sprintf(szBuffer,"welcome %s to http://www.sunxin.org",

                     inet_ntoa(addrConn.sin_addr));

              send(sockClient,szBuffer,sizeof(szBuffer)+1,0);

              char szRecv[100];

              recv(sockClient,szRecv,100,0);

              printf("%s",szRecv);

       }

      

}

客户端的程序:

#include <stdio.h>

#include <WINSOCK2.H>

void main()

{

       WORD wVersionRequested;

       WSADATA wsaData;

       int err;

       wVersionRequested = MAKEWORD( 1, 1 );

       err = WSAStartup( wVersionRequested, &wsaData );

       if ( err != 0 ) {

              return;

       }

       if ( LOBYTE( wsaData.wVersion ) != 1 ||

        HIBYTE( wsaData.wVersion ) != 1 )

       {                   

              WSACleanup( );

              return;

       }

       SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);

      

       SOCKADDR_IN addrSrv;

      

       addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");

       addrSrv.sin_family=AF_INET;

       addrSrv.sin_port=htons(6000);

      

       connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

       char szBuffer[100];

       recv(sockClient,szBuffer,100,0);

       printf("%s",szBuffer);

       send(sockClient,"this is zhang san",sizeof("this is zhang san")+1,0);

}

posted @ 2009-11-29 22:07  luck_net  阅读(477)  评论(3编辑  收藏  举报