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. js一周时间表

    <div class="datetext"> <img class="dateLeft" src="./images/dateLef ...

  2. 不用typsescript也能使用类型增强功能

    由于 JS 的弱类型.宽松的编写规范.以及开发工具的弱鸡支持,我们在维护前人的代码时,经常会出现不知道某一个方法或字段命名来自于哪里,一定要在全局搜索以后慢慢筛查才能找到 同样我们在使用接口返回的对象 ...

  3. RichTextBox FlowDocument类型操作

      最近研究微信项目,套着web版微信协议做了一个客户端,整体WPF项目MVVM架构及基本代码参考于:http://www.cnblogs.com/ZXdeveloper/archive/2016/1 ...

  4. rest framework Request

    要求 如果你正在做基于REST的Web服务的东西......你应该忽略request.POST. -马尔科姆Tredinnick,Django开发组 REST框架的Request类继承了标准HttpR ...

  5. 【测试技术分享】在Linux下安装Python3

    导语:Python在linux环境下没有安装包,同时很多系统没有Python环境,即使有Python环境也是Python2.x,顺应时代,现在开始进行安装Python3的教程. 一.安装依赖 sudo ...

  6. FreeBSD——艺术、科学、哲学概论

    FreeBSD--艺术.科学.哲学概论→→→→→概论: 信息都有一定的时效性.那么现在是什么时间?现在已经发布了 FreeBSD 12.2,距离下一个版本 13.0 还有约 4 个月. 『约定』 使用 ...

  7. BeetleX使用bootstrap5开发SPA应用

        在早期版本BeetleX.WebFamily只提供了vuejs+element的集成,由于element只适合PC管理应用开发相对于移动应用适配则没这么方便.在新版本组件集成了bootstra ...

  8. Apache JMeter 5.4.1 Build Development

                    1. 说明 经过漫长的等待终于将开发环境搭建成功了!网络慢真的是伤不起!grade,确实要比maven简洁.....嗯!真香! 2. 工具准备 JDK1.8+ 这... ...

  9. Activity类组成分析(一)Instrumentation

    目录 前言 解剖 继承关系 重要成员 Instrumentation 总结 前言 要了解清楚StartActivity的过程,Activity对象实例的构造过程是重要组成部分:而要弄清楚Activit ...

  10. 实验一 Python程序设计入门

    学号20184307 2019-2020-2 <Python程序设计>实验1报告 课程:<Python程序设计> 班级: 1843 姓名: 章森洋 学号:20184307 实验 ...