Windows 环境下的 Socket 编程 3 - 基于 TCP 的服务器/客户端
创始人
2024-02-03 18:42:21

基于 TCP 的服务器端/客户端

绝大多数 TCP 服务器端都按照如下顺序调用:
在这里插入图片描述
在 Windows 环境下,代码表示为:

	WSADATA wsaData;SOCKET hServSock, hClntSock;SOCKADDR_IN servAddr, clntAddr;int szClntAddr;/*Windows 环境 Socket 编程必须*/if(WSAStartup(MAKEWORD(2,2), &wsaData) != 0)//错误处理/*创建套接字,使用 IPv4 协议族、面向连接的 TCP 数据传输方式,对于 IPv4 协议族,第三个参数总是为 0 */hServSock = socket(PF_INET, SOCK_STREAM, 0);if(hServSock == INVALID_SOCKET)//错误处理/*设置协议族的地址信息*/memset(&servAddr, 0, sizeof(servAddr));servAddr.sin_family = AF_INET;					//地址族设置为 IPv4servAddr.sin_addr.s_addr = htonl(INADDR_ANY);	//设置 IP 地址servAddr.sin_port = htons(atoi(argv[1]));		//设置端口号/*分配套接字地址*/if(bind(hServSock, (SOCKADDR *)&servAddr, sizeof(servAddr)) == SOCKET_ERROR)//错误处理/*等待连接请求*/if(listen(hServSock, 5) == SOCKET_ERROR)//错误处理/*受理客户端连接请求*/szClntAddr = sizeof(clntAddr);hClntSock = accept(hServSock, (SOCKADDR *)&clntAddr, &szClntAddr);if(hClntSock == INVALID_SOCKET)//错误处理/*接收数据*/strLen = recv(hClntSock, message, BUF_SIZE,0);/*发送数据*/send(hClntSock, (const char *)&calculation_result, sizeof(int), 0);closesocket(hClntSock);closesocket(hServSock);WSACleanup();

绝大多数 TCP 客户端都按照如下顺序调用:
在这里插入图片描述
在 Windows 环境下,代码表示为:

    WSADATA wsaData;SOCKET hClntSock;SOCKADDR_IN servAddr;/*Windows 环境 Socket 编程必须*/if(WSAStartup(MAKEWORD(2,2), &wsaData) != 0)//错误处理/*创建套接字,使用 IPv4 协议族、面向连接的 TCP 数据传输方式,对于 IPv4 协议族,第三个参数总是为 0 */hClntSock = socket(PF_INET, SOCK_STREAM, 0);if(hClntSock == INVALID_SOCKET)//错误处理/*设置协议族的地址信息*/memset(&servAddr, 0, sizeof(servAddr));servAddr.sin_family = AF_INET;servAddr.sin_addr.s_addr = inet_addr(argv[1]);servAddr.sin_port = htons(atoi(argv[2]));/*连接到服务器*/if(connect(hClntSock, (SOCKADDR *)&servAddr, sizeof(servAddr)) == SOCKET_ERROR)//错误处理/*发送数据*/send(hClntSock, message, strLen, 0);/*接收数据*/recv(hClntSock, &result, sizeof(int), 0);closesocket(hClntSock);WSACleanup();

基于 TCP 的服务器端-客户端函数调用关系
在这里插入图片描述
客户端只能等到服务器端调用 listen 函数后才能调用 connect 函数。

TCP 细节

TCP 套接字的数据收发无边界。服务器端即使调用 1 次 send 函数传输 40 字节的数据,客户端有可能通过 4 次 recv 函数调用每次读取 10 字节。也就是说,客户端可以缓慢的分批接收。
TCP 套接字的 I/O 是有缓冲的。send 函数调用后,数据将移至输出缓冲区;在适当的时候(不管是分别传送还是一次性传送)传向对方的输入缓冲区。 recv 函数调用后,从输入缓冲区读取数据。

  • I/O 缓冲区在每个 TCP 套接字中单独存在。
  • I/O 缓冲区在创建套接字时(调用 socket 函数)自动生成。
  • 即使关闭套接字也会继续传递输出缓冲中遗留的数据
  • 关闭套接字将丢失输入缓冲区中的数据
    TCP 不会因为缓冲溢出而丢失数据。这是因为 TCP 会控制数据流(滑动窗口)。

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...