1. 概述:简单的基于Windows API的socket点对点聊天程序,为了方便初学者,本文代码均采用阻塞原理编写。

2. 代码样例

Server.cpp(服务端)

#include <cstdio>
#include <cstdlib>
#include <iostream>
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <Winsock2.h> using namespace std; #pragma comment(lib,"ws2_32.lib") const short HOST_PORT = 4500;
const char *HOST_IP = "127.0.0.1"; int main(void)
{
int maxConnectTimeout = 20;
char revData[255] = "\0";
sockaddr_in sain;
sockaddr_in remote_sain;
SOCKET sClient;
SOCKET sServer;
WSADATA wsaData;
int remoteLen = sizeof(remote_sain);
WORD sockVersion = MAKEWORD(2,2);
if (WSAStartup(sockVersion,&wsaData) != 0)
{
return 0;
}
sServer = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (sServer == INVALID_SOCKET)
{
printf("[-] SOCKET CREATE ERROR\n");
return 0;
}else{
printf("[*] SOCKET CREATE SUCCESS\n");
}
sain.sin_family = AF_INET;
sain.sin_port = htons(HOST_PORT);
sain.sin_addr.S_un.S_addr = INADDR_ANY; if (bind(sServer,(SOCKADDR*)&sain,sizeof(sain)) == SOCKET_ERROR)
{
printf("[-]CANNOT BIND\n");
return 0;
}else{
printf("[*]BIND SUCCESS\n");
} if (listen(sServer,5) == SOCKET_ERROR)
{
printf("[-]LISTENING ERROR\n");
return 0;
}else{
printf("[*]LISTENING SUCCESS\n");
}
while(1)
{
printf("\n[*]Listening Remote-PC ...\n\n");
sClient = accept(sServer,(SOCKADDR*)&remote_sain,&remoteLen);
if (sClient == INVALID_SOCKET)
{
printf("[-]SOCKET RECV ERROR ...");
continue;
}
printf("[+]PC from %s \n",inet_ntoa(remote_sain.sin_addr));
while (1)
{
int ret = recv(sClient,revData,255,0);
if (ret > 0)
{
revData[ret] ='\0';
printf("%s\n",revData);
}
}
closesocket(sClient);
break;
}
printf("[-]Server OFF!");
closesocket(sServer);
WSACleanup();
return 0;
}

Client.cpp(客户端)

#include <cstdio>
#include <cstdlib>
#include <iostream>
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <Winsock2.h> using namespace std; #pragma comment(lib,"ws2_32.lib") const short HOST_PORT = 4500;
const char *HOST_IP = "127.0.0.1"; int main(void)
{
int Recvret = 0;
char Sendbuff[255] = "\0";
char Recvbuff[255] = "\0";
WSADATA wsData;
WORD sockVersion = MAKEWORD(2,2);
sockaddr_in Remote_sain;
if (WSAStartup(sockVersion,&wsData) != 0)
{
printf("[-]SOCKET STARTUP ERROR\n");
return 0;
}else{
printf("[*]SOCKET STARTUP SUCCESS\n");
} SOCKET sClient = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (sClient == INVALID_SOCKET)
{
printf("[-]SOCKET CREATE ERROR\n");
return 0;
}else{
printf("[*]SOCKET CREATE SUCCESS\n");
} Remote_sain.sin_addr.S_un.S_addr = inet_addr(HOST_IP);
Remote_sain.sin_port = htons(HOST_PORT);
Remote_sain.sin_family = AF_INET;
if (connect(sClient,(SOCKADDR*)&Remote_sain,sizeof(Remote_sain)) == SOCKET_ERROR)
{
printf("[-]Can not connect to the Server\n");
closesocket(sClient);
return 0;
}else{
printf("[*]Listening to %s:%d ...OK\n",HOST_IP,HOST_PORT);
} while (1)
{
if (Recvret = recv(sClient,Recvbuff,255,0) != 0)
{
Recvbuff[Recvret] = '\0';
printf("[*]Server(%s):\n",HOST_IP);
}
gets(Sendbuff);
send(sClient,Sendbuff,255,0);
printf("[*]Client:%s\n",Sendbuff);
}
closesocket(sClient);
return 0;
}

基于C++简单Windows API的socket编程(阻塞模式)的更多相关文章

  1. winsock教程- windows下的socket编程(c语言实现)

    winsock教程- windows下的socket编程(c语言实现) 使用winsock进行socket 编程     这是一个学习windows下socket编程(c语言)的快速指南.这是因为一下 ...

  2. 使用Windows API进行串口编程

    使用Windows API进行串口编程   串口通信一般分为四大步:打开串口->配置串口->读写串口->关闭串口,还可以在串口上监听读写等事件.1.打开和关闭串口Windows中串口 ...

  3. c++之socket,阻塞模式

    这里描述下socket的阻塞模式: 首先,socket有几个函数 socket() 创建socket bind() 绑定socket到一个地址 listen() 开启soket监听 accept()  ...

  4. Python Socket单线程+阻塞模式

    Python之旅]第五篇(二):Python Socket单线程+阻塞模式 python Socket单线程 Socket阻塞模式 串行发送 摘要:  前面第五篇(一)中的一个Socket例子其实就是 ...

  5. Linux下TCP网络编程与基于Windows下C#socket编程间通信

    一.linux下TCP网络编程基础,需要了解相关函数 Socket():用于套接字初始化. Bind():将 socket 与本机上的一个端口绑定,就可以在该端口监听服务请求. Listen():使s ...

  6. 简单理解php的socket编程

    php的socket编程算是比较难以理解的东西吧,不过,我们只要理解socket几个函数之间的关系,以及它们所扮演的角色,那么理解起来应该不是很难了,在笔者看来,socket编程,其实就是建立一个网络 ...

  7. 简单理解php的socket编程【网摘】

    php的socket编程算是比较难以理解的东西吧,不过,我们只要理解socket几个函数之间的关系,以及它们所扮演的角色,那么理解起来应该不是很难了,在笔者看来,socket编程,其实就是建立一个网络 ...

  8. 看到关于socket非阻塞模式设置方式记录一下。

    关于socket的阻塞与非阻塞模式以及它们之间的优缺点,这已经没什么可言的:我打个很简单的比方,如果你调用socket send函数时: 如果是阻塞模式下: send先比较待发送数据的长度len和套接 ...

  9. NIO Socket非阻塞模式

    NIO主要原理和适用 NIO 有一个主要的类Selector,这个类似一个观察者,只要我们把需要探知的socketchannel告诉Selector,我们接着做别的事情,当有 事件发生时,他会通知我们 ...

随机推荐

  1. @MockBean 注解后 bean成员对象为 null?

    笔者在写自测的时候遇到的问题: 我想模拟一个Bean,并在之后使用Mockito打桩,于是使用了 @MockBean 注解(spring集成mockito的产物),但代码编写好了后启动测试却报Null ...

  2. 单元测试 - SpringBoot2+Mockito实战

    单元测试 - SpringBoot2+Mockito实战 在真实的开发中,我们通常是使用SpringBoot的,目前SpringBoot是v2.4.x的版本(SpringBoot 2.2.2.RELE ...

  3. Python字典与集合

    一 字典创建.访问.添加.删除.修改.内建函数.内建方法 创建,列表不能作为键,因为键不能变?字典也不能作为键 dict1 = {} dict2 = {'name':'qq','sex':'male' ...

  4. 深入理解Java并发框架AQS系列(二):AQS框架简介及锁概念

    深入理解Java并发框架AQS系列(一):线程 深入理解Java并发框架AQS系列(二):AQS框架简介及锁概念 一.AQS框架简介 AQS诞生于Jdk1.5,在当时低效且功能单一的synchroni ...

  5. vim宏录制的操作

    1:在vim编辑器normal模式下输入qa(其中a为vim的寄存器) 2:此时在按i进入插入模式,vim编辑器下方则会出现正在录制字样,此时便可以开始操作. 3:需要录制的操作完成后,在normal ...

  6. 高精地图技术专栏 | 基于空间连续性的异常3D点云修复技术

    1.背景 1.1 高精资料采集 高精采集车是集成了测绘激光.高性能惯导.高分辨率相机等传感器为一体的移动测绘系统.高德高精团队经过多年深耕打造的采集车,具有精度高.速度快.数据产生周期短.自动化程度高 ...

  7. 搞懂 ZooKeeper 集群的数据同步

    本文作者:HelloGitHub-老荀 Hi,这里是 HelloGitHub 推出的 HelloZooKeeper 系列,免费开源.有趣.入门级的 ZooKeeper 教程,面向有编程基础的新手. 项 ...

  8. vue 快速入门 系列 —— 虚拟 DOM

    其他章节请看: vue 快速入门 系列 虚拟 DOM 什么是虚拟 dom dom 是文档对象模型,以节点树的形式来表现文档. 虚拟 dom 不是真正意义上的 dom.而是一个 javascript 对 ...

  9. Elasticsearch 集群优化-尽可能全面详细

    Elasticsearch 集群优化-转载参考1 基本配置 基本配置,5台配置为 24C 125G 17T 的主机,每台主机上搭建了一个elasticsearch节点. 采用的elasticsearc ...

  10. ss 命令简介

    1. 简介 ss 使用 netlink 与内核 tcp_diag 模块通信获取 socket 信息,用法和输出结果类似于 netstat 命令 语法格式如下 ss [options] [ FILTER ...