基于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,我们接着做别的事情,当有 事件发生时,他会通知我们 ...
随机推荐
- MYSQL-SQLSERVER获取某个数据库的表记录数
MYSQL: 1,可以使用MYSQL的系统表的记录数(亲测,有时候,会不准确,被坑了一把,如果还是想通过此方式实现查询表记录数,可以按照文章后的链接进行操作) use information_sche ...
- 【odoo】ref 1-6说明
(0,_ ,{'field': value}) 这将创建一个新的记录并连接它 (1,id,{'field': value}): 这是更新一个已经连接了的记录的值 ( ...
- 开源项目renren-fast-vue开发环境部署(前端部分)
开源项目renren-fast-vue开发环境部署(前端部分) 说明:renren-fast是一个开源的基于springboot的前后端分离手脚架,当前版本是3.0 开发文档需要付费,官方的开发环境部 ...
- golang 矩阵乘法、行列式、求逆矩阵
package matrix import ( "math" "github.com/astaxie/beego" ) type Matrix4 struct ...
- salesforce零基础学习(一百零二)Limitation篇之 CPU Limit
本篇参考: https://help.salesforce.com/articleView?id=000339361&type=1&mode=1 https://developer.s ...
- 「HTML+CSS」--自定义按钮样式【004】
前言 Hello!小伙伴! 首先非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出- 哈哈 自我介绍一下 昵称:海轰 标签:程序猿一只|C++选手|学生 简介:因C语言结识编程,随后转入计算机 ...
- iovec结构体使用说明
http://blog.163.com/lichuan0502@126/blog/static/9933534820111033228285/
- .NET 6 Preview 3 中 ASP.NET Core 的更新和改进
原文:bit.ly/2Qb56NP 作者:Daniel Roth 译者:精致码农-王亮 .NET 6 预览版 3 现已推出,其中包括许多对新的 ASP.NET Core 改进.以下是本次预览版的新内容 ...
- ubuntu20.04开机显示recovering journal死机的解决方法
事发突然,在今天开机的时候无法进入登陆界面,一直卡在黑屏界面,屏幕上只显示几行代码,且任何按键都无法起作用 /dev/sdb2:recovering journal /dev/sdb2:Clearin ...
- 连续函数离散化-以SOGI为例
0. 引言 0.1 本文内容 基于SOGI函数,将s域传递函数转换为离散的z域函数,并以m语言形式进行实现,在simulink中封装为m-function并进行验证 0.2 学到什么 离散化方法 函数 ...