设为首页 加入收藏

TOP

基于TCP协议的socket编程实例
2014-11-23 21:26:53 来源: 作者: 【 】 浏览:21
Tags:基于 TCP 协议 socket 编程 实例

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


  套接字:好比电话机。


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


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


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


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


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


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


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


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


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


  然后运用recv和send进行通话。


  2. 客户端程序的编写:


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


  请求连接:connect()。


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


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


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


  #include


  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


  #include


  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);


  }


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇基于UDP协议的socket编程实例 下一篇volatile语义及线程安全singleton..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: