C++ socket TCP开发基本流程总结

Sockets编程有三种:

(1).流步套接字(SOCK_STREAM);

(2).数据报套接字(SOCK_DGRAM);

(3).原始套接字(SOCK_RAW);

而基于TCP的socket编程是采用的流步套接字,具体编程步骤如下:

服务器端编程的步骤:

1:加载套接字库,创建套接字(WSAStartup()/socket());

2:绑定套接字到一个IP地址和一个端口上(bind());

3:将套接字设置为监听模步等待连接请求(listen());

4:请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept());

5:用返回的套接字和客户端进行通信(send()/recv());

6:返回,等待另一连接请求;

7:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。

客户端编程的步骤

1:加载套接字库,创建套接字(WSAStartup()/socket());

2:向服务器发出连接请求(connect());

3:和服务器端进行通信(send()/recv());

4:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。

第一步: 加载/释放Winsock库:

1.加载方法:

WSADATA wsa;

/*初始化socket资源*/

if(WSAStartup(MAKEWORD(1,1),&wsa) != 0)

{

return;   //代表失败

}

2.释放方法:

WSACleanup();

第二步: 构造SOCKET:

1.服务端:构造监听SOCKET,流步SOCKET.

SOCKET Listen_Sock =socket(AF_INET, SOCK_STREAM, 0)

2.客户端:构造通讯SOCKET,流步SOCKET.

SOCKET Client_Sock = socket(AF_INET, SOCK_STREAM, 0)

第三步: 配置监听地址和端口:

1.服务端: SOCKADDR_IN serverAddr

ZeroMemory((char *)&serverAddr,sizeof(serverAddr));

serverAddr.sin_family = AF_INET;

serverAddr.sin_port = htons(1234);          /*本地监听端口:1234*/

serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);/*有IP*/

第四步:   绑定SOCKET:

1.服务端:绑定监听SOCKET.

  bind(Listen_Sock,(struct sockaddr *)&serverAddr,sizeof(serverAddr))

第五步: 服务端/客户端连接:

1.服务端:等待客户端接入.

SOCKET Command_Sock = accept(Listen_Sock,...)

2.客户端:请求与服务端连接.

int ret = connect(Client_Sock, ...)

第六步: 收/发数据:

1.服务端:等待客户端接入.charbuf[1024].

接收数据:recv(Command_Sock,buf,...)

发送数据:send(Command_Sock,buf,...)

2.客户端:请求与服务端连接.charbuf[1024].

发送数据:send(Client_Sock,buf,...)

接收数据:recv(Client_Sock,buf,...)

第七步: 关闭SOCKET:

1.服务端:关闭SOCKET.

closesocket(Listen_Sock)

closesocket(Command_Sock)

2.客户端:关闭SOCKET.

closesocket(Client_Sock)

服务端:

#include <WINSOCK2.H>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
void main()
{
 //创建套接字
 WORD myVersionRequest;
 WSADATA wsaData;
 myVersionRequest=MAKEWORD(1,1);
 int err;
 err=WSAStartup(myVersionRequest,&wsaData);
 if (!err)
 {
  printf("已打开套接字\n");
 }
 else
 {
  //进一步绑定套接字
  printf("嵌套字未打开!");
  return;
 }
 SOCKET serSocket=socket(AF_INET,SOCK_STREAM,0);//创建了可识别套接字
 //需要绑定的参数
 SOCKADDR_IN addr;
 addr.sin_family=AF_INET;
 //addr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//ip地址
  addrSrv.sin_addr.S_un.S_addr=inet_addr("192.168.245.221");
 addr.sin_port=htons(6000);//绑定端口
 bind(serSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR));//绑定完成
 listen(serSocket,5);//其中第二个参数代表能够接收的最多的连接数
 //开始进行监听
 SOCKADDR_IN clientsocket;
 int len=sizeof(SOCKADDR);
 while (1)
 {
  SOCKET serConn=accept(serSocket,(SOCKADDR*)&clientsocket,&len);//如果这里不是accept而是conection的话,就会不断的监听
  char sendBuf[100];

  sprintf(sendBuf,"welcome %s to bejing",inet_ntoa(clientsocket.sin_addr));//找对对应的IP并且将这行字打印到那里
  send(serConn,sendBuf,strlen(sendBuf)+1,0);
  char receiveBuf[100];//接收
  recv(serConn,receiveBuf,strlen(receiveBuf)+1,0);
  printf("%s\n",receiveBuf);
  closesocket(serConn);//关闭
 WSACleanup();//释放资源的操作
 }
}

客户端:

#include <WINSOCK2.H>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
void main()
{
 int err;
 WORD versionRequired;
 WSADATA wsaData;
 versionRequired=MAKEWORD(1,1);
 err=WSAStartup(versionRequired,&wsaData);//协议库的版本信息
 if (!err)
 {
  printf("客户端嵌套字已经打开!\n");
 }
 else
 {
  printf("客户端的嵌套字打开失败!\n");
  return;//结束
 }
 SOCKET clientSocket=socket(AF_INET,SOCK_STREAM,0);
 SOCKADDR_IN clientsock_in;
 clientsock_in.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
 clientsock_in.sin_family=AF_INET;
 clientsock_in.sin_port=htons(6000);
 //bind(clientSocket,(SOCKADDR*)&clientsock_in,strlen(SOCKADDR));//注意第三个参数
 //listen(clientSocket,5);
 connect(clientSocket,(SOCKADDR*)&clientsock_in,sizeof(SOCKADDR));//开始连接
 char receiveBuf[100];
 recv(clientSocket,receiveBuf,101,0);
 printf("%s\n",receiveBuf);
 send(clientSocket,"hello,this is client",strlen("hello,this is client")+1,0);
 closesocket(clientSocket);
 WSACleanup();
}
时间: 2024-10-19 15:11:33

C++ socket TCP开发基本流程总结的相关文章

Socket &amp; TCP &amp;HTTP

1.TCP协议的三次握手和四次挥手2.SOCKET连接与TCP连接3.SOCKET详解 3.1 socket套接字的起源 3.2 套接字描述符 3.3. SOCKET连接的程序 4.TCP/IP.Http,Socket关系研究,TCP和UDP的区别 1.TCP协议的三次握手和四次挥手 TCP协议的三次握手和四次挥手是很经典的内容 内容来源于 http://blog.csdn.net/whuslei/article/details/6667471 http://blog.csdn.net/zeng

TCP状态变迁流程

主动建立TCP链接情况: 被动建立TCP链接情况 主动断开链接的情况 被动断开连接的情况 在TIME_WAIT阶段需要停留2倍的MSL,MSL即Maximum Segment Lifetime,表示任何报文被丢弃前在网络内的最长时间,TCP/IP详解中额外注解了:RFC793指出MSL为2min,然而实现中常用的值是30s,1min或2min.如此处理的原因是:当TCP之行一个主动关闭,并发回最后一个ACK,该连接必须在TIME_WAIT状态停留的时间为2被的MSL,这样可让TCP再次发送最后的

Photon服务器引擎(二)socket/TCP/UDP基础及Unity聊天室的实现

Photon服务器引擎(二)socket/TCP/UDP基础及Unity聊天室的实现 我们平时说的最多的socket是什么呢,实际上socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API). 通过Socket,我们才能使用TCP/IP协议.实际上,Socket跟TCP/IP协议没有必然的联系.Socket编程接口在设计的时候,就希望也能适应其他的网络协议.所以说,Socket的出现只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,

【转】Windows Socket TCP/UDP

Windows Socket编程,发现这篇文章不错,就拿过来分享下,转载地址:http://www.cnblogs.com/fantasy-blog/archive/2013/04/21/3033935.html SOCKET网络编程 (WINDOWS SOCKET) 1.前言 网上看了很多Socket的资料,将理解的知识总结下,详细介绍下VC下windows sockets编程,并结合服务器和客户端的两个实例(TCP/UDP)讲解下. 2.SOCKET相关原理 在网络编程中最常用的方案便是Cl

使用ranch tcp开发服务端

Ranch: 简单来说,Ranch就是一个tcp acceptor pool,用于高并发下的tcp连接建立与管理.可以设置并发链接最大数量,在不关闭socket连接的情况下可以动态升级连接池.Cowboy就是使用的ranch. https://github.com/ninenines/ranch 下面通过改造ranch自带的reverse example实现简易的服务端. game_server.app.src {application, game_server, [ {description,

unp第七章补充之socket tcp 产生 rst响应的情况

socket tcp 产生 rst响应的情况(属于硬错误) 1.     syn发送到服务器主机,但是目的端口并未运行.则产生一个ECONRFUSED错误.客户端立即返回.比如telnet 192.168.1.55 8889,条件:55主机在局域网上并且可达(也可以换成可以到达的网络ip地址),但是8889这个端口并未使用(可能服务器已经关闭),则服务器(对方主机tcp内核)发送一个rst相应给客户端,于是客户端立即关闭. 注意一下,如果输入的网络ip不可达的话,客户端将会持续发送syn,最后产

学习敏捷开发的流程

一.什么是敏捷开发? 在软件工程的语境里,"敏捷流程"不是指某一种具体的方法论或过程,而是一系列价值观和方法论的集合. 二.敏捷开发的原则 1.  尽早并持续地交付有价值的软件以满足顾客需求. 2.  敏捷流程欢迎需求的变化, 并利用这种变化来提高用户的竞争优势. 3.  经常发布可用的软件,发布间隔可以从几周到几个月,能短则短. 4.  业务人员和开发人员在项目开发过程中应该每天共同工作. 5.  以有进取心的人为项目核心,充分支持信任他们 6.  无论团队内外,面对面的交流始终是最

关于socket tcp 断线重连

这个问题困扰过我几次,都没有来得及研究,今天研究一下. 首先写一个最简易的socket tcp程序,连接成功后再关闭服务器然后再用客户端各种操作看是什么情况 测试表明 (1)客户端已经连接,当服务端关闭程序时,客户端调用send函数发送失败,WSAGetLastError() 返回10054(远程主机强迫关闭了一个现有的连接) (2)客户端已经连接,当客户端关闭程序时,服务端调用recv函数接收失败,WSAGetLastError() 返回10054(远程主机强迫关闭了一个现有的连接) ,这时对

c#异步Socket Tcp服务器实现

原创性申明 本文作者: 小竹zz  本文地址:http://blog.csdn.net/zhujunxxxxx 转载请注明出处. 介绍 我之前写过一篇IOCP的文章: http://blog.csdn.net/zhujunxxxxx/article/details/43573879 这个比异步socket性能好,因为它复用对象了. 在c#中微软已经提供了TcpListener和TcpClient来实现Tcp的通讯,这部分已经有人写了比较好的异步服务器代码 http://www.cnblogs.c