PS:vs2017 编译C++代码 支持 XP:项目属性-->链接器-->系统-->需要的最小版本--> 输入 "5.1"

1、ZC:测试:c向s 发送长度为0的数据,是可行的。(1)用s和c都在本机 测试,OK (2)用 冬的HP笔记本 和 我的联想小新笔记本 测试,OK

  ZC:要想 像UDP那样 像自己发送信息 来退出循环的话... 不太好办... 除非要 使用 非阻塞/异步模型(如 select模型、WSAAsyncSelect模型、WSAEventSelect模型、重叠IO模型),但是 有比较麻烦,还不如直接 使用 Qt的QTcpSocket(Qt的QUdpSocket会丢包,QTcpSocket用了之后 感觉还好)

2、测试代码:

// SampleTCP_01.cpp : This file contains the 'main' function. Program execution begins and ends there.
// #include <iostream>
#include <stdio.h> int main1();
int main2(); int main(int _argc, char** _argv)
{
std::cout << "Hello World!\n"; if (_argc <= )
{
printf("Command line no parameter .");
return ;
} printf("%s\n", _argv[]);
if (_argv[][] == 's')
main1();
else if (_argv[][] == 'c')
main2();
else
printf("Unknown command line parameter : %s\n", _argv[]); return ;
} #define _WINSOCK_DEPRECATED_NO_WARNINGS #include <iostream>
#include <string> #include <winsock2.h>
#pragma comment(lib, "ws2_32.lib") #define PORT 58888
#define BUFFER_SIZE 256 static const std::string kExitFlag = "-1"; // 参考:http://c.biancheng.net/cpp/html/3030.html int main1()
{
WORD winsock_version = MAKEWORD(, );
WSADATA wsa_data;
if (WSAStartup(winsock_version, &wsa_data) != ) {
std::cout << "Failed to init socket dll!" << std::endl;
return ;
} SOCKET server_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (server_socket == INVALID_SOCKET) {
std::cout << "Failed to create server socket!" << std::endl;
return ;
} sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
server_addr.sin_addr.S_un.S_addr = INADDR_ANY; if (bind(server_socket, (LPSOCKADDR)&server_addr, sizeof(server_addr)) == SOCKET_ERROR) {
std::cout << "Failed to bind port!" << std::endl;
return ;
} if (listen(server_socket, )) {
std::cout << "Failed to listen!" << std::endl;
return ;
} // 循环接收数据。
sockaddr_in client_addr;
int client_addr_len = sizeof(client_addr);
std::cout << "Wait for connecting..." << std::endl; // 程序一旦执行到 accept() 就会被阻塞(暂停运行),直到客户端发起请求。
SOCKET client_socket = accept(server_socket, (SOCKADDR*)&client_addr, &client_addr_len);
if (client_socket == INVALID_SOCKET) {
std::cout << "Failed to accept!" << std::endl;
return ;
} std::cout << "Succeed to receive a connection: " << inet_ntoa(client_addr.sin_addr) << std::endl; char recv_buf[BUFFER_SIZE] = {};
while (true)
{
// 接收数据。
// 返回值是读取的字节数。没有内容时,等待请求。
int ret = recv(client_socket, recv_buf, BUFFER_SIZE, );
if (ret < ) {
std::cout << "Failed to receive data!" << std::endl;
break;
} printf("ret : %d\n", ret);
if (ret == )
{
printf("break\n");
break;
} std::cout << "Receive from Client: " << recv_buf << std::endl;
if (kExitFlag == recv_buf) {
std::cout << "Exit!" << std::endl;
break;
} // 发送数据给客户端。
char* send_data = (char*)"Hello, Tcp Client!\n";
send(client_socket, send_data, strlen(send_data), );
} // 关闭套接字。
closesocket(client_socket);
closesocket(server_socket); // 释放dll。
WSACleanup(); return ;
} #define _WINSOCK_DEPRECATED_NO_WARNINGS #include <iostream>
#include <string> #include <winsock2.h>
#pragma comment(lib, "ws2_32.lib") #define PORT 58888
//#define SERVER_IP "127.0.0.1"
#define SERVER_IP "192.168.2.102"
#define BUFFER_SIZE 256 //static const std::string kExitFlag = "-1"; int main2()
{
// 初始化socket dll。
WORD winsock_version = MAKEWORD(, );
WSADATA wsa_data;
if (WSAStartup(winsock_version, &wsa_data) != ) {
std::cout << "Failed to init socket dll!" << std::endl;
return ;
} SOCKET client_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (client_socket == INVALID_SOCKET) {
std::cout << "Failed to create server socket!" << std::endl;
return ;
} // 绑定IP和端口。
sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
server_addr.sin_addr.S_un.S_addr = inet_addr(SERVER_IP);
// connect() 向服务器发起请求,服务器的IP地址和端口号保存在 sockaddr_in 结构体中。直到服务器传回数据后,connect() 才运行结束。
if (connect(client_socket, (LPSOCKADDR)&server_addr, sizeof(server_addr)) == SOCKET_ERROR) {
std::cout << "Failed to connect server!" << std::endl;
return ;
} char recv_data[BUFFER_SIZE] = {}; while (true) {
std::string data;
std::cout << "Input data: ";
std::cin >> data; //if (send(client_socket, data.c_str(), data.size(), 0) < 0) {
if (send(client_socket, &recv_data[], , ) < ) {
std::cout << "Failed to send data!" << std::endl;
break;
} break; int ret = recv(client_socket, recv_data, BUFFER_SIZE, );
if (ret < ) {
std::cout << "Failed to receive data!" << std::endl;
break;
} std::cout << "Receive data from server: " << recv_data << std::endl; if (recv_data == kExitFlag) {
std::cout << "Exit!" << std::endl;
break;
}
} closesocket(client_socket);
WSACleanup(); return ;
}

3、vs2017 编译C++代码 支持 XP

  

4、

5、

Winsock.简单TCP的更多相关文章

  1. 简单 TCP/IP 服务功能

    本主题使用每台 Windows 计算机上提供的 Echo 和 Quote of the Day 服务.在所有 Windows 版本中都提供了简单 TCP/IP 服务功能.该功能会提供了以下服务:Cha ...

  2. python socket和简单tcp通信实现

    python 服务端和客户端的简单交互 TCP服务端: 1 创建套接字,绑定套接字到本地IP与端口 s = socket.socket(socket.AF_INET,socket.SOCK_STREA ...

  3. [C++] socket - 1 [简单TCP通信C\S代码]

    服务端: #include<iostream> #include<winsock2.h> #include<stdio.h> #pragma comment(lib ...

  4. twisted 学习笔记二:创建一个简单TCP客户端

    #coding=utf-8 from twisted.internet import reactor,protocol class QuickClient(protocol.Protocol): de ...

  5. 原始套接字的简单tcp包嗅探

    原始套接字 sock_raw = socket(AF_INET , SOCK_RAW , IPPROTO_TCP); while(1) { data_size = recvfrom(sock_raw ...

  6. Winsock API TCP/IP网络通信

    通信流程如下: 1.Winsock库的装入.初始化 #pragma comment(lib,"WS2_32.lib").WSAStartup() 2.套接字的创建(服务器端是监听套 ...

  7. C# 简单Tcp通信demo

    Client 代码 private void btnSend_Click(object sender, EventArgs e) { TcpClient tcpClient = new TcpClie ...

  8. Java 简单TCP文件传输

    服务端 package TCP; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputSt ...

  9. 简单TCP代码

    服务器: SOCKET s; s = ::socket(AF_INET,SOCK_STREAM,); sockaddr_in addr; addr.sin_family = AF_INET; addr ...

随机推荐

  1. zeebe 集成elasticsearch exporter && 添加operate

    zeebe 的operate是一个功能比较强大的管理工具,比simple-monitor 有好多方面上的改进 安全,支持用户账户的登陆 界面更友好,界面比较符合开团队工作流引擎的界面 系统监控更加强大 ...

  2. 在运维中的shell经验总结

    来自良许Linux公众号 编写 脚本开头部分应有脚本功能说明.参数使用说明.作者姓名.创建/修改日期.版本信息,格式为: 脚本编写时,注意格式对齐,如所有的循环或者判断语句前后的语句进行对齐,以及ca ...

  3. P1041 传染病控制——暴力遍历所有相同深度的节点

    P1041 传染病控制 说实话这种暴力我还是头一次见,每次病毒都会往下传染一层: 数据范围小,我们可以直接枚举当前层保护谁就好了: 用vector 记录相同层数的节点:维护已经断了的点: 如果超出最底 ...

  4. 模板 - 数据结构 - ST表/SparseTable

    SparseTable,俗称ST表,其功能,就是静态的RMQ(区间最值查询)问题的解决.注意传入查询的时候两个参数的合法性,或者可以进行一次全部初始化来使得越界值不产生负面影响.不过访问越界是写程序的 ...

  5. CF1207题解

    D 全排列减去坏序列 坏序列分三种,容斥一下就好了 E 比较有意思 \(A=_{i=1}^{100}\{i\},B=_{i=1}^{100}\{i\cdot 2^7\}\),所以\(A_i~xor~ ...

  6. MySql的动态语句foreach各种用法比较

    1.单参数List的类型: 上述collection的值为list,对应的Mapper是这样的 2.单参数array数组的类型: 上述collection为array,对应的Mapper代码: 3.自 ...

  7. 服务器部署docker

    docker简介 可以把docker是一个容器,可以让开发者将自己的项目部署到这个容器中,最常用的场景是将自己的后端项目部署到服务器的时候会将其打入docker镜像中,可以理解为一个开销更小的虚拟机. ...

  8. Assignment4:闰年判断输入异常时的处理方法

    一.问题描述 在输入界面输入年份,界面返回是否为闰年. 判断依据为:输入的数字可以被4整除但不可以被100整除 || 输入的数字可以被400整除 如果输入为数字以外的其他字符,会抛出异常.那么如何防止 ...

  9. C仿黑白棋版XO棋

    两位玩家轮流在棋盘上放置不同颜色的棋子,一位玩家使用黑子,另一位使用白子,棋盘是一个偶数正方形. 只能将一个棋子放在对手的棋子旁边,使对手在水平.垂直.对角线方向上的棋子变成自己的棋子,游戏结束时,棋 ...

  10. rg.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session:

    原先跑TEST CASE的时候没有出错 但是跑到整个程序里面,除了这个问题, 网上也找了下资料,说是用merge之类的可以解决,因为你这个update的obj和session里面的不用,所以导致此问题 ...