C++ Winsock
由于兼容的问题更新下winsock,有较好的移植性:客户端是非阻塞的,服务器是阻塞的!
Win32控制台:
数据收发:
服务器向客户端发送一个txt文本内容和一个结构体数据;
服务器代码:
#include "stdafx.h"
#undef UNICODE #define WIN32_LEAN_AND_MEAN #include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdlib.h>
#include <stdio.h>
#include<fstream>
#include<iostream>
#include<string>
using namespace std;
// Need to link with Ws2_32.lib
#pragma comment (lib, "Ws2_32.lib")
// #pragma comment (lib, "Mswsock.lib") #define DEFAULT_BUFLEN 512
#define DEFAULT_PORT "27015" int main()//__cdecl
{
WSADATA wsaData;
int iResult; SOCKET ListenSocket = INVALID_SOCKET;
SOCKET ClientSocket = INVALID_SOCKET; struct addrinfo *result = NULL;
struct addrinfo hints; int iSendResult;
char recvbuf[DEFAULT_BUFLEN];
int recvbuflen = DEFAULT_BUFLEN; // Initialize Winsock
iResult = WSAStartup(MAKEWORD(, ), &wsaData);
if (iResult != ) {
printf("WSAStartup failed with error: %d\n", iResult);
return ;
} ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
hints.ai_flags = AI_PASSIVE; // Resolve the server address and port
iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result);
if (iResult != ) {
printf("getaddrinfo failed with error: %d\n", iResult);
WSACleanup();
return ;
} // Create a SOCKET for connecting to server
ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
if (ListenSocket == INVALID_SOCKET) {
printf("socket failed with error: %ld\n", WSAGetLastError());
freeaddrinfo(result);
WSACleanup();
return ;
} // Setup the TCP listening socket
iResult = bind(ListenSocket, result->ai_addr, (int)result->ai_addrlen);
if (iResult == SOCKET_ERROR) {
printf("bind failed with error: %d\n", WSAGetLastError());
freeaddrinfo(result);
closesocket(ListenSocket);
WSACleanup();
return ;
} freeaddrinfo(result); iResult = listen(ListenSocket, SOMAXCONN);
if (iResult == SOCKET_ERROR) {
printf("listen failed with error: %d\n", WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return ;
} // Accept a client socket
ClientSocket = accept(ListenSocket, NULL, NULL);
if (ClientSocket == INVALID_SOCKET) {
printf("accept failed with error: %d\n", WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return ;
} printf("accept success :\n"); // No longer need server socket
closesocket(ListenSocket); string shader_modifiy;
std::fstream file_read;
file_read.open("shader_test.txt", std::ios::in);
std::string transmit;
while (getline(file_read, transmit)) {
shader_modifiy += transmit;
}
shader_modifiy += '\0';
file_read.close();
char *p = new char[shader_modifiy.length()];
for (int i = ; i < shader_modifiy.length(); i++) {
p[i] = shader_modifiy[i];
}
string shader_modifiy1 = p;
delete[]p;
shader_modifiy1 += "~"; while (true) { cout << "输入(start)开始更改,输入(end)结束服务:" << endl;
cout << "输入发送内容:";
while (cin.getline(recvbuf, ))
{ string rcover = recvbuf;
if (rcover == "end")break;
if (rcover == "start") {
cout << "请以m1~m2~m3~m_roll~m_pitch~m_rotate格式输入要修改的数据(m1为m1*R,m2为m2*G,m3为m3*B):" << endl;
char transmit1[];
cin.getline(transmit1, );
string transmit_str = transmit1;
transmit_str += '\0';
string transmit_string = shader_modifiy1 + transmit_str;
char *p1 = new char[transmit_string.length()];
for (int i = ; i < transmit_string.length(); i++) {
p1[i] = transmit_string[i];
}
send(ClientSocket, p1, strlen(p1) + , ); //字符串还有个结束标志,
delete[] p1; //send(sclient,client_send.m1,)
}
}
}
return ;
}
客户端代码:
#include "stdafx.h"
#define WIN32_LEAN_AND_MEAN #include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <string>
#include<cstring>
#include<vector>
#include<sstream> // Need to link with Ws2_32.lib, Mswsock.lib, and Advapi32.lib
#pragma comment (lib, "Ws2_32.lib")
#pragma comment (lib, "Mswsock.lib")
#pragma comment (lib, "AdvApi32.lib") #define DEFAULT_BUFLEN 512
#define DEFAULT_PORT "27015"
using namespace std;
typedef struct Date {
float m1;
float m2;
float m3;
float m_roll;
float m_pitch;
float m_rotate;
}Datablock;
string test;
void splitEx(vector<string>&strs, const string& src, string separate_character)
{ int separate_characterLen = separate_character.size();//分割字符串的长度,这样就可以支持如“,,”多字符串的分隔符
int lastPosition = , index = -;
while (- != (index = src.find(separate_character, lastPosition)))
{
strs.push_back(src.substr(lastPosition, index - lastPosition));
lastPosition = index + separate_characterLen;
}
string lastString = src.substr(lastPosition);//截取最后一个分隔符后的内容
if (!lastString.empty())
strs.push_back(lastString);//如果最后一个分隔符后还有内容就入队 }
float str_float(string a) {
float b;
stringstream ss; //string 转 int
ss << a;
ss >> b;
return b;
}
int main()
{
WSADATA wsaData;
SOCKET ConnectSocket = INVALID_SOCKET; struct addrinfo *result = NULL,
*ptr = NULL,
hints;
char recvbuf[DEFAULT_BUFLEN];
int iResult;
int recvbuflen = DEFAULT_BUFLEN; // Initialize Winsock
iResult = WSAStartup(MAKEWORD(, ), &wsaData);
if (iResult != ) {
printf("WSAStartup failed with error: %d\n", iResult);
return ;
} ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
string ip;
cout << "please enter server ip:" << endl;
cin >> ip;
cout << "server ip is:" << ip << endl;
// Resolve the server address and port
iResult = getaddrinfo(ip.c_str(), DEFAULT_PORT, &hints, &result);
if (iResult != ) {
printf("getaddrinfo failed with error: %d\n", iResult);
WSACleanup();
return ;
} // Attempt to connect to an address until one succeeds
for (ptr = result; ptr != NULL; ptr = ptr->ai_next) { // Create a SOCKET for connecting to server
ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype,
ptr->ai_protocol);
if (ConnectSocket == INVALID_SOCKET) {
printf("socket failed with error: %ld\n", WSAGetLastError());
WSACleanup();
return ;
} // Connect to server.
iResult = connect(ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen);
if (iResult == SOCKET_ERROR) {
closesocket(ConnectSocket);
ConnectSocket = INVALID_SOCKET;
continue;
}
break;
}
//u_long iMode = 1;//如果设置为0,为阻塞式的
//ioctlsocket(ConnectSocket, FIONBIO, &iMode);
cout << "Connect Success!" << endl;
freeaddrinfo(result); if (ConnectSocket == INVALID_SOCKET) {
printf("Unable to connect to server!\n");
WSACleanup();
return ;
} Datablock resu_data;
while (true) {
//存储接收的字符
int len = recv(ConnectSocket, recvbuf, sizeof(recvbuf), ); //通过连接套接字接收数据
//cout << "connect" << endl; if (len > )
{
vector<string>result;
cout << "客户说:" << recvbuf << endl;
string test = recvbuf;
cout << test << endl;
splitEx(result, test, "~");
test = result[];
resu_data.m1 = str_float(result[]);
resu_data.m2 = str_float(result[]);
resu_data.m3 = str_float(result[]);
resu_data.m_roll = str_float(result[]);
resu_data.m_pitch = str_float(result[]);
resu_data.m_rotate = str_float(result[]);
cout << result[] << endl;
cout << resu_data.m1 << endl;
cout << resu_data.m2 << endl;
cout << resu_data.m3 << endl;
cout << resu_data.m_roll << endl;
cout << resu_data.m_pitch << endl;
cout << resu_data.m_rotate << endl;
memset(recvbuf, , sizeof(recvbuf));
} } return ;
}
C++ Winsock的更多相关文章
- VB6+Winsock编写的websocket服务端
早就写好了,看这方面资料比较少,索性贴出来.只是一个DEMO中的,没有做优化,代码比较草.由于没地方上传附件,所以只把一些主要的代码贴出来. 这只是服务端,不过客户端可以反推出来,其实了解了webso ...
- [转]VB Winsock 控件TCP与UDP连接实例
[-] 可能的用途 选择通讯协议 协议的设置 确定计算机的名称 TCP 连接初步 接受多个连接请求 UDP 初步 关于 Bind 方法 利用 WinSock 控件可以与远程计算机建立连接,并通过用 ...
- NetBIOS与Winsock编程接口
最近在看网络编程方面的书,由于不是通信专业出身的,以前理解的网络体系感觉就是tcp/ip,最近工作上接触到了一些光环网等乱七八糟的东西,有些基本的LC.SC连接器都不认识.花时间看了下计算机网络体系结 ...
- Winsock 入门 Echo 示例
#include <stdio.h> #include <winsock2.h> #pragma comment(lib, "ws2_32") /* Win ...
- winsock教程- windows下的socket编程(c语言实现)
winsock教程- windows下的socket编程(c语言实现) 使用winsock进行socket 编程 这是一个学习windows下socket编程(c语言)的快速指南.这是因为一下 ...
- 在VBA中调用winsock控件
如果系统没有Winsock控件的话,可以下载下面的控件MSWINSCK.OCX,然后将该文件复制到C:\Windows\System32目录下. 在VBE窗口中,从菜单"工具"-& ...
- VS2013使用winsock.h和winsock2.h发生冲突后的终极解决方法
问题:彻底无语了,不小心某个文件包含了windows.h头文件,而windows.h文件里面包含着winsock.h文件, 如果你下次使用winsock2.h文件时,位置不对,然后编译器会给你一大堆重 ...
- WIN7只能上QQ打不开网页,使用CMD输入netsh winsock reset
此类问题可以用腾讯电脑管家电脑诊所一键修复,请点击上方的[立即修复]即可. 附:手动修复步骤(来源:腾讯电脑管家电脑诊所,自动修复请点击上方的[立即修复])方案一:手动设置DNS(说明:如果您使用DN ...
- VB中WinSock控件的属性、方法、事件及应用
一.WinSock简介 Socket(套接字)最初是由加利福尼亚大学Berkeley(伯克利)分校为UNIX操作系统开发的网络通信接口,随着UNIX的广泛使用,Socket成为当前最流行的 ...
- Winsock系列函数 及 Socket通信流程
Socket是一种网络通信机制 Winsock系列函数 1. Socket 创建socket 2. Connect 尝试连接远端Socket 3. Send 在某个Socket 向远端 ...
随机推荐
- 「Luogu P5494 【模板】线段树分裂」
(因为没有认证,所以这道题就由Froggy上传) 线段树分裂用到的地方确实并不多,luogu上以前也没有这道模板题,所以就出了一道,实在是想不出怎么出模板了,所以这道题可能可以用一些其他的算法水过去. ...
- Python 基础之模块之os os.path 及os与shutil对比
一: os 对系统进行操作 #注:以下操作都在linux环境下操作,且很多运行之前需要做好相关条件import os#(1)system() 在python总执行系统命令#os.system(&quo ...
- java实现邮箱发送邮件
第一步:封装发件人账号密码 import javax.mail.Authenticator;import javax.mail.PasswordAuthentication; /** * 发件人账号密 ...
- 多线程分析之Semaphore
Semaphore分析由来 网上看了许多讲解Semaphore的,用Semaphore来实现顺序打印字母,但是可能大家都没有清楚具体的原因,所以来给大家分析下为什么可以使用Semaphore来实现顺序 ...
- 提高 Java 代码性能的各种技巧
Java 6,7,8 中的 String.intern – 字符串池 这篇文章将要讨论 Java 6 中是如何实现 String.intern 方法的,以及这个方法在 Java 7 以及 Java 8 ...
- list中会直接绑定HashMap中的数据
import java.util.ArrayList;import java.util.HashMap;import java.util.List; public class HashMapSync ...
- [SUCTF 2019]CheckIn
进入靶场只有一个文件上传界面,上传php一句话木马提示非法后缀. 尝试利用php后缀的多样性绕过,发现都被过滤掉了,先把php改成.jpg的图片,提示说有问号在内容中. php后缀的多样性:php语言 ...
- pgsql数据库 pg_hba.conf 中 METHOD 的说明
pg_hba.conf 文件是pgsql用于配置访问权限的配置文件, 内容如下: ##############begin#################### # TYPE DATABA ...
- ReadyBoost 的应用教程
一.什么是ReadyBoost 根据百度百科介绍,ReadyBoost是存在于Windows Vista中的一项新技术,在继Vista的下一代操作系统Windows 7中,同样包 含着这项技术,它利用 ...
- 吴裕雄--天生自然JAVA面向对象高级编程学习笔记:Object类
class Demo{ // 定义Demo类,实际上就是继承了Object类 }; public class ObjectDemo01{ public static void main(String ...