由于兼容的问题更新下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的更多相关文章

  1. VB6+Winsock编写的websocket服务端

    早就写好了,看这方面资料比较少,索性贴出来.只是一个DEMO中的,没有做优化,代码比较草.由于没地方上传附件,所以只把一些主要的代码贴出来. 这只是服务端,不过客户端可以反推出来,其实了解了webso ...

  2. [转]VB Winsock 控件TCP与UDP连接实例

    [-] 可能的用途 选择通讯协议 协议的设置 确定计算机的名称 TCP 连接初步 接受多个连接请求 UDP 初步 关于 Bind 方法   利用 WinSock 控件可以与远程计算机建立连接,并通过用 ...

  3. NetBIOS与Winsock编程接口

    最近在看网络编程方面的书,由于不是通信专业出身的,以前理解的网络体系感觉就是tcp/ip,最近工作上接触到了一些光环网等乱七八糟的东西,有些基本的LC.SC连接器都不认识.花时间看了下计算机网络体系结 ...

  4. Winsock 入门 Echo 示例

    #include <stdio.h> #include <winsock2.h> #pragma comment(lib, "ws2_32") /* Win ...

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

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

  6. 在VBA中调用winsock控件

    如果系统没有Winsock控件的话,可以下载下面的控件MSWINSCK.OCX,然后将该文件复制到C:\Windows\System32目录下. 在VBE窗口中,从菜单"工具"-& ...

  7. VS2013使用winsock.h和winsock2.h发生冲突后的终极解决方法

    问题:彻底无语了,不小心某个文件包含了windows.h头文件,而windows.h文件里面包含着winsock.h文件, 如果你下次使用winsock2.h文件时,位置不对,然后编译器会给你一大堆重 ...

  8. WIN7只能上QQ打不开网页,使用CMD输入netsh winsock reset

    此类问题可以用腾讯电脑管家电脑诊所一键修复,请点击上方的[立即修复]即可. 附:手动修复步骤(来源:腾讯电脑管家电脑诊所,自动修复请点击上方的[立即修复])方案一:手动设置DNS(说明:如果您使用DN ...

  9. VB中WinSock控件的属性、方法、事件及应用

    一.WinSock简介       Socket(套接字)最初是由加利福尼亚大学Berkeley(伯克利)分校为UNIX操作系统开发的网络通信接口,随着UNIX的广泛使用,Socket成为当前最流行的 ...

  10. Winsock系列函数 及 Socket通信流程

    Socket是一种网络通信机制   Winsock系列函数   1. Socket 创建socket   2. Connect 尝试连接远端Socket   3. Send 在某个Socket 向远端 ...

随机推荐

  1. Lesson 13 The search for oil

    What do oilmen want to achieve as soon as they strike oil? The deepest holes of all are made for oil ...

  2. C++函数的理解思考

    函数指针调用方式 void testmy(int k) { cout << "testzhixing " <<k << endl; } int ...

  3. python之常见模块(time,datetime,random,os,sys,json,pickle)

    目录 time 为什么要有time模块,time模块有什么用?(自己总结) 1. 记录某一项操作的时间 2. 让某一块代码逻辑延迟执行 时间的形式 时间戳形式 格式化时间 结构化时间 时间转化 总结: ...

  4. react基础总结

    React的特点: 1.声明式: 可以声明式的在js中写html结构: 注意: react是用很像 js 的语言写标签; const jsx = <div className="app ...

  5. markdown基本语法教程

    标题 一级标题 二级标题 三级标题 以此类推,总共六级标题,建议在警号后面加一个空格,这是最标准的markdown语法 列表 在markdown下: 列表的显示只需要在文字前加上-.+或*即可变为无序 ...

  6. Pytorch 分割模型构建和训练【直播】2019 年县域农业大脑AI挑战赛---(四)模型构建和网络训练

    对于分割网络,如果当成一个黑箱就是:输入一个3x1024x1024 输出4x1024x1024. 我没有使用二分类,直接使用了四分类. 分类网络使用了SegNet,没有加载预训练模型,参数也是默认初始 ...

  7. 契约精神、尊重规则、SOP,对制造业来说是蜜糖还是毒药?

    契约精神.尊重规则.执行SOP,这些词儿都天然带有光环,也有很多相关的好故事,全球范围内的企业家都对其推崇备至,摆出一副虔诚教徒的模样,事实上,缺乏契约精神.不遵守规则比之缺乏资本.丢掉订单更加不可接 ...

  8. Java垃圾回收机制详解和调优

    gc即垃圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存.java语言并不要求jvm有gc,也没有规定gc如何工作.不过常用的jvm都有gc,而且大多数gc都使用类似的算法管理内存和执行收集 ...

  9. zookeeper logs is missing zookeeper 日志丢失

    ERROR [main:QuorumPeerMain@85] - Invalid config, exiting abnormally Invalid config, exiting abnormal ...

  10. COGS 2294. [HZOI 2015] 释迦

    额,其实就是裸的三模数NTT,上一篇已经说过了 哦,还有一个就是对乘起来炸long long的数取模,用long double之类的搞一下就好,精度什么的,,(看出题人心情??) #include&l ...