基于C++简单Windows API的socket编程(阻塞模式)
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编程(阻塞模式)的更多相关文章
- winsock教程- windows下的socket编程(c语言实现)
winsock教程- windows下的socket编程(c语言实现) 使用winsock进行socket 编程 这是一个学习windows下socket编程(c语言)的快速指南.这是因为一下 ...
- 使用Windows API进行串口编程
使用Windows API进行串口编程 串口通信一般分为四大步:打开串口->配置串口->读写串口->关闭串口,还可以在串口上监听读写等事件.1.打开和关闭串口Windows中串口 ...
- c++之socket,阻塞模式
这里描述下socket的阻塞模式: 首先,socket有几个函数 socket() 创建socket bind() 绑定socket到一个地址 listen() 开启soket监听 accept() ...
- Python Socket单线程+阻塞模式
Python之旅]第五篇(二):Python Socket单线程+阻塞模式 python Socket单线程 Socket阻塞模式 串行发送 摘要: 前面第五篇(一)中的一个Socket例子其实就是 ...
- Linux下TCP网络编程与基于Windows下C#socket编程间通信
一.linux下TCP网络编程基础,需要了解相关函数 Socket():用于套接字初始化. Bind():将 socket 与本机上的一个端口绑定,就可以在该端口监听服务请求. Listen():使s ...
- 简单理解php的socket编程
php的socket编程算是比较难以理解的东西吧,不过,我们只要理解socket几个函数之间的关系,以及它们所扮演的角色,那么理解起来应该不是很难了,在笔者看来,socket编程,其实就是建立一个网络 ...
- 简单理解php的socket编程【网摘】
php的socket编程算是比较难以理解的东西吧,不过,我们只要理解socket几个函数之间的关系,以及它们所扮演的角色,那么理解起来应该不是很难了,在笔者看来,socket编程,其实就是建立一个网络 ...
- 看到关于socket非阻塞模式设置方式记录一下。
关于socket的阻塞与非阻塞模式以及它们之间的优缺点,这已经没什么可言的:我打个很简单的比方,如果你调用socket send函数时: 如果是阻塞模式下: send先比较待发送数据的长度len和套接 ...
- NIO Socket非阻塞模式
NIO主要原理和适用 NIO 有一个主要的类Selector,这个类似一个观察者,只要我们把需要探知的socketchannel告诉Selector,我们接着做别的事情,当有 事件发生时,他会通知我们 ...
随机推荐
- 184. 部门工资最高的员工 + join + in
184. 部门工资最高的员工 LeetCode_MySql_184 题目描述 题解分析 1.首先需要使用group by找出工资最高的值 2. 然后考虑到最高工资的可能有多位,所以使用in语句找到所有 ...
- Mybatis系列全解(四):全网最全!Mybatis配置文件XML全貌详解
封面:洛小汐 作者:潘潘 做大事和做小事的难度是一样的.两者都会消耗你的时间和精力,所以如果决心做事,就要做大事,要确保你的梦想值得追求,未来的收获可以配得上你的努力. 前言 上一篇文章 <My ...
- PCA——主成分分析
PCA(Principal Components Analysis)主成分分析是一个简单的机器学习算法,利用正交变换把由线性相关变量表示的观测数据转换为由少量线性无关比变量表示的数据,实现降维的同时尽 ...
- Spark性能调优-RDD算子调优篇(深度好文,面试常问,建议收藏)
RDD算子调优 不废话,直接进入正题! 1. RDD复用 在对RDD进行算子时,要避免相同的算子和计算逻辑之下对RDD进行重复的计算,如下图所示: 对上图中的RDD计算架构进行修改,得到如下图所示的优 ...
- 如何在 Istio 中支持 Dubbo、Thrift、Redis 以及任何七层协议?
赵化冰,腾讯云高级工程师,Istio Member,ServiceMesher管理委员,Istio 项目贡献者, Aerika 项目创建者 ,热衷于开源.网络和云计算.目前主要从事服务网格的开源和研发 ...
- C语言入门-mingw64安装+配置
OK,大家好,结合上期所说,本期让我们来配置编译器吧! 首先先下载mingw64离线包,官网下载慢,可以去群里下载,*.7z格式(有些同学可能没有解压软件,为了照顾这部分同学,笔者提供*.exe格式的 ...
- Linux系统(Centos7)最新版本Docker简易(yum)安装步骤
Docker从1.13版本之后采用时间线的方式作为版本号,分为社区版CE和企业版EE. 社区版是免费提供给个人开发者和小型团体使用的,企业版会提供额外的收费服务,比如经过官方测试认证过的基础设施.容器 ...
- 攻防世界 reverse Newbie_calculations
Newbie_calculations Hack-you-2014 题目名百度翻译成新手计算,那我猜应该是个实现计算器的题目.... IDA打开程序,发现一长串的函数反复调用,而且程序没有输入,只有输 ...
- 4、Spring教程之Spring配置
别名 alias 设置别名 , 为bean设置别名 , 可以设置多个别名 <!--设置别名:在获取Bean的时候可以使用别名获取--> <alias name="userT ...
- Python 网络编程 C/S建立Socket连接
分为客户端和服务端 服务端 server.py 客户端 1 #coding=utf-8 2 import socket 3 4 client = socket.socket() #生成socket连接 ...