VC面向对象的方式 写一个基于TCP的 客户端服务端程序 (SOCKET)

简介: SOCKET accept( SOCKET s, struct sockaddr FAR*addr, int FAR *addrlen);   //最后一个参数一定要赋值为 SOCKADDR结构体的长度 否则调用失败 这个MSDN的解释有     SOCKET是网络编程的接口   目...

SOCKET accept( SOCKET s, struct sockaddr FAR*addr, int FAR *addrlen);   //最后一个参数一定要赋值为 SOCKADDR结构体的长度 否则调用失败 这个MSDN的解释有

 

 

SOCKET是网络编程的接口   目前的C/S模式的开发都是基于 SOCKET 的

 

TCP服务器编写流程  :

  创建socket----------->配置SOCKADDR_IN 并调用bind()函数绑定到socket----------->监听套接字调用listen()函数--------->调用accept()函数等待连接到来并且返回用于通信的socket----------------- ->双方通信 ----------------->通信结束closesocket

 

TCP 客户端编写流程 :

创建socket----------->配置SOCKADDR_IN  (服务器端信息)------->connect连接到服务器端 ------>用本地创建的套接字进行通信  -------->通信结束 closesocket

 

 

 

1.   我这里将服务器端封装了一个 SocketSrv类   先启动服务端后启动客户端 

/*
面向对象的套接字编程 服务端  
基于TCP协议 
*/
#include <iostream>
#include "winsock.h"
#pragma comment(lib,"ws2_32.lib")
using namespace std ;
class  SocketSrv
{
public :
 BOOL InitSocketLibrary() //初始化套接字库
 {
  WSADATA wsa ;
  if(WSAStartup(MAKEWORD(1,1),&wsa) )
   return FALSE ;
  return TRUE ;
 }
 void  CreateSocket()
 {
  m_socket=::socket(AF_INET,SOCK_STREAM,0) ;  //创建一个套接字
 }
 BOOL  Bind(int port)   //绑定端口
 {
  SOCKADDR_IN addr ;
  addr.sin_family=AF_INET ;
  addr.sin_port=htons(port);
  addr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);  //绑定本地网卡的任何IP   
  if(SOCKET_ERROR==::bind(m_socket,(SOCKADDR*)&addr,sizeof(SOCKADDR)))
   return FALSE ;
  return TRUE ;
 }
 void Listen()
 {
  ::listen(m_socket,5) ;  //最大连接5  监听端口
 }
    

 void  Accept()
 {  
  this->len=sizeof(SOCKADDR) ;
  tem=::accept(m_socket,(SOCKADDR*)&addr,&len) ;
 }

 ~SocketSrv()
 { 
  ::closesocket(m_socket) ;//关闭套接字
 }

 void  CloseTemSocket()
 {
  ::closesocket(tem) ;
 }

 void Recv(char *buf,int sizeofbuf)
 {
        recv(tem,buf,sizeofbuf,0) ;
 }
    void Send(char *sendbuf,int length)
 {
  send(tem,sendbuf,length,0) ;
 }
 SOCKET m_socket ;
 SOCKET tem ;
 SOCKADDR_IN addr;
 int len;
};


void main()
{
 SocketSrv sock;
 sock.InitSocketLibrary() ;
 sock.CreateSocket() ;
 sock.Bind(9999) ;
 sock.Listen() ;
 cout<<"服务器启动成功:"<<endl ;
 sock.Accept() ;
 char  buf[100] ;
 char  senddata[]="recvived data" ;
 sock.Recv(buf,100) ;
 cout<<"recv  date :"<<buf<<endl ;
 sock.Send(senddata,strlen(senddata)+1) ;
    sock.CloseTemSocket()  ;//关闭用于临时通话的 socket
}

 

 

 

2.

/*
客户端 TCP    SockerSrv 我们自己写的类来实现 网络编程
*/
#include <iostream>
#include "winsock.h"
#pragma comment(lib,"ws2_32.lib")
using namespace std ;
void   main()
{
 
    ::WSADATA  wsa ;
 ::WSAStartup(MAKEWORD(1,1),&wsa) ;
 SOCKET s=::socket(AF_INET,SOCK_STREAM,0) ;
 SOCKADDR_IN addr ;
 addr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1") ;  //将服务器地址转换为网络字节序 的ULONG类型
 addr.sin_family=AF_INET;
 addr.sin_port=htons(9999) ;  //将端口转换为网路字节序    也就是高位先存   在计算机中一般是是 低位先存
    ::connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));
 char buf[]="hello !" ;
 char recvbuf[100] ;
 send(s,buf,strlen(buf)+1,0) ;
 recv(s,recvbuf,100,0) ;
 cout<<"服务器说:"<<recvbuf <<endl ;
 
 
}

目录
相关文章
|
1月前
|
存储 网络协议 Ubuntu
【C++网络编程】Socket基础:网络通讯程序入门级教程
【C++网络编程】Socket基础:网络通讯程序入门级教程
55 7
|
17天前
|
网络协议 Linux Go
Go语言TCP Socket编程(下)
Go语言TCP Socket编程
|
17天前
|
网络协议 Ubuntu Unix
Go语言TCP Socket编程(上)
Go语言TCP Socket编程
|
17天前
|
存储 网络协议 关系型数据库
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
|
23天前
|
网络协议 Linux Windows
TCP/IP、Http、Socket之间的区别
TCP/IP、Http、Socket之间的区别
|
26天前
|
网络协议 Ubuntu Unix
Linux 下使用 socket 实现 TCP 客户端
Linux 下使用 socket 实现 TCP 客户端
|
27天前
|
安全 程序员
|
1月前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。
|
1月前
|
程序员 开发者 Python
Python网络编程基础(Socket编程) 错误处理和异常处理的最佳实践
【4月更文挑战第11天】在网络编程中,错误处理和异常管理不仅是为了程序的健壮性,也是为了提供清晰的用户反馈以及优雅的故障恢复。在前面的章节中,我们讨论了如何使用`try-except`语句来处理网络错误。现在,我们将深入探讨错误处理和异常处理的最佳实践。
|
1月前
|
Python
Python网络编程基础(Socket编程) 使用try-except处理网络错误
【4月更文挑战第11天】在网络编程中,错误处理和异常管理是非常重要的部分。网络操作经常因为各种原因而失败,比如网络断开、服务器无响应、地址不正确等。因此,学会如何使用Python的异常处理机制来捕获和处理这些错误,是编写健壮的网络应用的关键。