TCP协议的问题
Server端接收到Client端信息后不会返回给Client端
// TCPEchoServer.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <Windows.h>
#include <WinSock2.h>
#include <strsafe.h>
#pragma comment(lib, "Ws2_32.lib")
#define GRS_ALLOC(sz) HeapAlloc(GetProcessHeap(), 0 ,sz)
#define GRS_CALLOC(sz) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sz)
#define GRS_CREALLOC(p, sz) HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, p, sz)
#define GRS_SAFEFREE(p) if(NULL != p){HeapFree(GetProcessHeap(), 0, p); p = NULL;}
#define GRS_USEPRINTF() TCHAR pBuf[1024] = {}; char pBufA[1024] = {};
#define GRS_PRINTF(...)\
StringCchPrintf(pBuf, 1024, __VA_ARGS__);\
WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), pBuf, lstrlen(pBuf), NULL, NULL);
#define GRS_PRINTFA(...)\
StringCchPrintfA(pBufA, 1024, __VA_ARGS__);\
WriteConsoleA(GetStdHandle(STD_OUTPUT_HANDLE), pBufA, lstrlenA(pBufA), NULL, NULL);
#define SOCK_VERH 2
#define SOCK_VERL 2
#define GRS_SERVER_PORT 5634
int _tmain(int argc, _TCHAR* argv[])
{
GRS_USEPRINTF();
WORD wVer = MAKEWORD(SOCK_VERH, SOCK_VERL);
WSADATA wd;
int err = ::WSAStartup(wVer, &wd); //因为多个WinSock版本库可能共存于一个系统,所以应用程序必须明确指定加载合适的WinSock版本库,这个过程称为WinSock初始化,一般用WSAStartup
//高字节副版本号,低字节主版本号
if(0 != err)
{
GRS_PRINTF(_T("无法初始化Scoket2环境,错误码为:%d!\n"), WSAGetLastError());
return 1;
}
if(LOBYTE(wd.wVersion) != SOCK_VERH || HIBYTE(wd.wVersion) != SOCK_VERL)
{
GRS_PRINTF(_T("无法初始化%d.%d版本环境!\n"), SOCK_VERH, SOCK_VERL);
::WSACleanup();
return 2;
}
GRS_PRINTF(_T("WinSock库初始化成功!\n\t当前系统中支持最高的WinSock版本为%d.%d\n\t当前应用程序使用的WinSock版本为%d.%d\n"),
LOBYTE(wd.wHighVersion), HIBYTE(wd.wHighVersion),
LOBYTE(wd.wVersion), HIBYTE(wd.wVersion));
SOCKET skServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
SOCKET skClient = INVALID_SOCKET;
SOCKADDR_IN saClient = {};
int isaLen = sizeof(SOCKADDR_IN);
VOID* pskBuf = NULL;
VOID* pskBufTmp = NULL;
int iBufLen = 1024;
int iBufLenTmp = 0;
int iRecv = 0;
SOCKADDR_IN sa = {AF_INET};
sa.sin_addr.s_addr = htonl(INADDR_ANY);
sa.sin_port = htons(GRS_SERVER_PORT);
if(0 != bind(skServer, (SOCKADDR*)&sa, sizeof(SOCKADDR_IN)))
{
GRS_PRINTF(_T("绑定到指定端口出错!\n"));
goto CLEAN_UP;
}
if(0 != listen(skServer, SOMAXCONN))
{
GRS_PRINTF(_T("SOCKET进入监听模式出错!\n"));
goto CLEAN_UP;
}
while(INVALID_SOCKET != (skClient=accept(skServer, (SOCKADDR*)&saClient, &isaLen)))
{
GRS_PRINTFA("客户端[%s : %u]连接进来了.....\n", inet_ntoa(saClient.sin_addr), ntohs(saClient.sin_port));
GRS_PRINTF(_T("\t开始接受客户端数据......\n"));
pskBuf = GRS_CALLOC(iBufLen);
pskBufTmp = pskBuf;
do
{
iRecv = recv(skClient, (char*)pskBufTmp, iBufLen-iBufLenTmp, 0);
if(SOCKET_ERROR == iRecv || 0 == iRecv)
{
break;
}
if(iRecv >= (iBufLen - iBufLenTmp))
{
iBufLenTmp = iBufLen;
iBufLen += 1024;
pskBuf = GRS_CREALLOC(pskBuf, iBufLen);
pskBufTmp = (void*)((BYTE*)pskBuf + iBufLenTmp);
continue;
}
}
while (1);
if(SOCKET_ERROR != iRecv && 0 != iRecv)
{
GRS_PRINTF(_T("\t接收客户端数据成功,开始返回......\n"));
send(skClient, (const char*)pskBuf, iBufLen, 0);
}
else
{
GRS_PRINTF(_T("\t接收客户端数据失败,关闭连接......\n"));
}
GRS_SAFEFREE(pskBuf);
pskBufTmp = NULL;
iBufLenTmp = 0;
iBufLen = 1024;
shutdown(skClient, SD_BOTH);
closesocket(skClient);
}
CLEAN_UP:
_tsystem(_T("PASUE"));
if(INVALID_SOCKET != skServer)
{
closesocket(skServer);
}
::WSACleanup();
return 0;
} //Server端的代码
// TCPEchoClient.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <Windows.h>
#include <strsafe.h>
#include <WinSock2.h>
#pragma comment(lib, "Ws2_32.lib")
#define GRS_ALLOC(sz) HeapAlloc(GetProcessHeap(), 0 ,sz)
#define GRS_CALLOC(sz) HeapAlloc(GetProcessheap(), HEAP_ZERO_MEMORY, sz)
#define GRS_CREALLOC(p, sz) HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, p, sz)
#define GRS_SAFEFREE(p) if(NULL != p){HeapFree(GetProcessHeap(), 0, p); p = NULL;}
#define GRS_USEPRINTF() TCHAR pBuf[1024] = {}; char pBufA[1024] = {};
#define GRS_PRINTF(...)\
StringCchPrintf(pBuf, 1024, __VA_ARGS__);\
WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), pBuf, lstrlen(pBuf), NULL, NULL);
#define GRS_PRINTFA(...)\
StringCchPrintfA(pBufA, 1024, __VA_ARGS__);\
WriteConsoleA(GetStdHandle(STD_OUTPUT_HANDLE), pBufA, lstrlenA(pBufA), NULL, NULL);
#define SOCK_VERH 2
#define SOCK_VERL 2
#define GRS_SERVER_PORT 5634
int _tmain(int argc, _TCHAR* argv[])
{
GRS_USEPRINTF();
WORD wVer = MAKEWORD(SOCK_VERH, SOCK_VERL);
WSADATA wd;
int err = ::WSAStartup(wVer, &wd); //因为多个WinSock版本库可能共存于一个系统,所以应用程序必须明确指定加载合适的WinSock版本库,这个过程称为WinSock初始化,一般用WSAStartup
//高字节副版本号,低字节主版本号
if(0 != err)
{
GRS_PRINTF(_T("无法初始化Scoket2环境,错误码为:%d!\n"), WSAGetLastError());
return 1;
}
if(LOBYTE(wd.wVersion) != SOCK_VERH || HIBYTE(wd.wVersion) != SOCK_VERL)
{
GRS_PRINTF(_T("无法初始化%d.%d版本环境!\n"), SOCK_VERH, SOCK_VERL);
::WSACleanup();
return 2;
}
GRS_PRINTF(_T("WinSock库初始化成功!\n\t当前系统中支持最高的WinSock版本为%d.%d\n\t当前应用程序使用的WinSock版本为%d.%d\n"),
LOBYTE(wd.wHighVersion), HIBYTE(wd.wHighVersion),
LOBYTE(wd.wVersion), HIBYTE(wd.wVersion));
SOCKET skClient = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
SOCKADDR_IN sa = {AF_INET};
sa.sin_addr.s_addr = inet_addr("127.0.0.1");
sa.sin_port = htons(GRS_SERVER_PORT);
WCHAR pszSendMsg[] = _T("Hello Internetssssssssssssssssssssssssss!");
size_t szLen = 0;
StringCchLength(pszSendMsg, 30, &szLen);
WCHAR pszRecvBuf[1024] = {};
if(0 != connect(skClient, (SOCKADDR*)&sa, sizeof(SOCKADDR_IN)))
{
GRS_PRINTF(_T("连接服务器出错......\n"));
goto CLEAN_UP;
}
send(skClient, (char*)pszSendMsg, szLen * sizeof(WCHAR), 0);
recv(skClient, (char*)pszRecvBuf, 1024 * sizeof(WCHAR), 0);
GRS_PRINTF(_T("ECHO:%s\n"), pszRecvBuf);
CLEAN_UP:
if(INVALID_SOCKET != skClient)
{
shutdown(skClient, SD_BOTH);
closesocket(skClient);
}
_tsystem(_T("PASUE"));
::WSACleanup();
return 0;
} //Client端的代码
Server端接收到Client端信息后不会返回给Client端,
TCP协议的问题的更多相关文章
- TCP协议学习
一.TCP参考模型 VS OSI参考模型 二.TCP/IP分层模型的四个协议层分别完成以下的功能 第一层 网络接口层 网络接口层包括用于协作IP数据在已有网络介质上传输的协议.实际上TCP/IP标准 ...
- 【转】TCP协议
TCP是什么? TCP(Transmission Control Protocol 传输控制协议)是一种面向连接(连接导向)的.可靠的. 基于IP的传输层协议.TCP在IP报文的协议号是6.TCP是一 ...
- 闲来无事,写个基于TCP协议的Socket通讯Demo
.Net Socket通讯可以使用Socket类,也可以使用 TcpClient. TcpListener 和 UdpClient类.我这里使用的是Socket类,Tcp协议. 程序很简单,一个命令行 ...
- 简单测试nginx1.90做TCP协议负载均衡的功能
最近工作中需要做TCP层面的负载均衡,以前网站用的反向代理nginx只支持应用层的负载均衡,对于TCP协议是无能为力的,需要使用LVS(linux虚拟服务器). LVS的特点是高性能和极复杂的配置.对 ...
- TCP协议
TCP是一个面向连接的协议,在发送数据之前,必须在双方之间建立一条连接. TCP首部 TCP数据封装在IP数据报中 TCP包首部 下面简单说明部分字段的作用: 端口号:通讯双方由IP地址和端口号标识. ...
- TCP协议的三次握手和四次挥手
暂时需要的信息有: ACK : TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1 SYN(SYNchronization) : 在连接建立时用来同步序号.当SYN= ...
- TCP协议三次握手和四次挥手
http://www.cnblogs.com/rootq/articles/1377355.html TCP(Transmission Control Protocol) 传输控制协议 TCP是主机对 ...
- ZeroMQ接口函数之 :zmq_tcp – 使用TCP协议的ØMQ网络单播协议
ZeroMQ 官方地址 :http://api.zeromq.org/4-1:zmq-tcp zmq_tcp(7) ØMQ Manual - ØMQ/4.1.0 Name zmq_t ...
- C#网络编程之---TCP协议的同步通信(二)
上一篇学习日记C#网络编程之--TCP协议(一)中以服务端接受客户端的请求连接结尾既然服务端已经与客户端建立了连接,那么沟通通道已经打通,载满数据的小火车就可以彼此传送和接收了.现在让我们来看看数据的 ...
- TCP协议学习笔记(一)首部以及TCP的三次握手连接四次挥手断开
TCP协议是一种面向连接的.可靠的流协议. 流即不间断的数据结构.这样能够保证接收到数据顺序与发送相同.但是犹如数据间没有间隔,因此在TCP通信中,发送端应用可以在自己所要发送的消息中设置一个标示长度 ...
随机推荐
- Linux下发布javaWeb项目,配置环境变量,tomcat,和安装mysql数据库
如果不懂,可以联系微博本人:QQ:3111901846 (原创) 1.配置java中jdk 注意一切操作,都是在root这个目录下进行的,不要选择其他目录,不然会出现一些小问题的 第一步: 你需要一个 ...
- python - multi-mechanize 安装笔记
1. multi-mechanize 是什么Multi-Mechanize 是一个开源的性能和负载测试框架,它并发运行多个 Python 脚本对网站或者服务生成负载(组合事务).测试输出报告保存为HT ...
- Kruskal算法 - C语言详解
最小生成树 在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子图,并使该连通子图中n-1条边上权值之和达到最小,则称其为连通网的最小生成树. 例如,对于如上图G4所示的连通网可以有多棵权值总 ...
- 敏捷转型中why与how的总结
敏捷转型參考框架: 为了成功顺畅地推行敏捷开发.下面将对整个敏捷转型參考框架作个整体说明.为企业进行敏捷转型提供基本方法參考.整个敏捷转型參考框架主要包括5个步骤,前两个步骤主要是回答 Wh y的问题 ...
- Java并发和多线程:序
近期,和不少公司的"大牛"聊了聊,当中非常多是关于"并发和多线程"."系统架构"."分布式"等方面内容的.不少问题, ...
- HIVE HBASE 整合
一直想将hbase 与hive整合在一起,因为公司项目工期一期紧似一期,故一直推后.还不知道推到什么时候呢. 今天尝试编译hive,看着官方文档.感觉非常easy: 1.svn co http://s ...
- Latex算法伪代码使用总结
Latex伪代码使用总结 algorithmicx例子 相应代码: \documentclass[11pt]{ctexart} \usepackage[top=2cm, bottom=2cm, lef ...
- 4X4矩阵键盘扫描程序
4X4矩阵键盘扫描: 1. 4根行线的GIO均设为Output,根列线的GIO均设为Input: 2. 4根行线的GIO分别置为0111.1011.1101.1110,读逐一读取列线GIO的值,可确定 ...
- 为ubuntu添加多媒体以及flash等等常用包
因为多媒体mp3,mp4以及flash等等都是一些有版权的东东,ubuntu不能直接集成到安装盘内,所以,做了2个常用包,来存放它们. ubuntu-restricted-addons ubuntu- ...
- 【Android】16.3 带Intent过滤器的Services
分类:C#.Android.VS2015: 创建日期:2016-03-01 一.简介 这一节演示带Intent过滤器的Services的基本用法. 1.配置Intent Filter 不论是本地解决方 ...