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协议的问题的更多相关文章

  1. TCP协议学习

    一.TCP参考模型  VS OSI参考模型 二.TCP/IP分层模型的四个协议层分别完成以下的功能 第一层 网络接口层 网络接口层包括用于协作IP数据在已有网络介质上传输的协议.实际上TCP/IP标准 ...

  2. 【转】TCP协议

    TCP是什么? TCP(Transmission Control Protocol 传输控制协议)是一种面向连接(连接导向)的.可靠的. 基于IP的传输层协议.TCP在IP报文的协议号是6.TCP是一 ...

  3. 闲来无事,写个基于TCP协议的Socket通讯Demo

    .Net Socket通讯可以使用Socket类,也可以使用 TcpClient. TcpListener 和 UdpClient类.我这里使用的是Socket类,Tcp协议. 程序很简单,一个命令行 ...

  4. 简单测试nginx1.90做TCP协议负载均衡的功能

    最近工作中需要做TCP层面的负载均衡,以前网站用的反向代理nginx只支持应用层的负载均衡,对于TCP协议是无能为力的,需要使用LVS(linux虚拟服务器). LVS的特点是高性能和极复杂的配置.对 ...

  5. TCP协议

    TCP是一个面向连接的协议,在发送数据之前,必须在双方之间建立一条连接. TCP首部 TCP数据封装在IP数据报中 TCP包首部 下面简单说明部分字段的作用: 端口号:通讯双方由IP地址和端口号标识. ...

  6. TCP协议的三次握手和四次挥手

    暂时需要的信息有: ACK : TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1 SYN(SYNchronization) : 在连接建立时用来同步序号.当SYN= ...

  7. TCP协议三次握手和四次挥手

    http://www.cnblogs.com/rootq/articles/1377355.html TCP(Transmission Control Protocol) 传输控制协议 TCP是主机对 ...

  8. 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 ...

  9. C#网络编程之---TCP协议的同步通信(二)

    上一篇学习日记C#网络编程之--TCP协议(一)中以服务端接受客户端的请求连接结尾既然服务端已经与客户端建立了连接,那么沟通通道已经打通,载满数据的小火车就可以彼此传送和接收了.现在让我们来看看数据的 ...

  10. TCP协议学习笔记(一)首部以及TCP的三次握手连接四次挥手断开

    TCP协议是一种面向连接的.可靠的流协议. 流即不间断的数据结构.这样能够保证接收到数据顺序与发送相同.但是犹如数据间没有间隔,因此在TCP通信中,发送端应用可以在自己所要发送的消息中设置一个标示长度 ...

随机推荐

  1. 关于ftpshell脚本中mget中去除多余交互式提示的方法

    默认情况下ftp里面的交互式提示是开启的,平常如果下载多个文件时,这种提示很让人烦,如果是在shell脚本里面要从ftp服务器上一次mget多个文件,写个交互式很麻烦,最好是把这个交互式提示关掉. 进 ...

  2. Android用shareUserID实现多个Activity显示在同一界面

    近来整理文档,发现两年前研究Android多个Activity叠加显示的方案.时光荏苒,一去不回. 虽然后来没有用上,但还是整理如下,Android版本还是2.2的: ActivityGroup描画方 ...

  3. Java将数据库数据导入EXCEL

    一般的数据库数据怎么导入excel中呢??这让人非常疑惑,今天我找到了一个方法能够实现 须要导入一个第三方包下载地址 详细内容例如以下: 里面含有指导文档,index.html里面含有怎样读取数据库文 ...

  4. js实现多物体运动框架并兼容各浏览器

    首先,我们须要知道在js中获取对象的宽度如offsetWidth等.可能会存在一些小小的bug.原因之中的一个在于offsetWidth只不过获取盒子模型中内容的部分宽度.并不包括内边距,边框和外边距 ...

  5. EC20 minipcie版4g模块开发笔记

    插在电脑上实验时若出现 AT+CREG? +CREG: 0,2 可能是usb口供电不足所致,换至主机箱后面usb口后问题解决,返回值+CREG: 0,1

  6. javascript Dictionary data structures

    Dictionary常被称为数据字典,是一种用来保存键值对的数据结构,比如我们日常的电话本,就是一个Dictionary.我们通过键(名字),就可以访问到对应的值(电话号码).在C++与java中我们 ...

  7. Java并发之AQS同步器学习

    AQS队列同步器学习 在学习并发的时候,我们一定会接触到 JUC 当中的工具,JUC 当中为我们准备了很多在并发中需要用到的东西,但是它们都是基于AQS(AbstractQueuedSynchroni ...

  8. zookeeper集群的部署

    因为这里zookeeper的集群部署都会2n+1台 Dubbo建议使用Zookeeper作为服务的注册中心. Zookeeper集群中只要有过半的节点是正常的情况下,那么整个集群对外就是可用的.正是基 ...

  9. [na]锐起无盘机并发部署多台windows

    小时候很好奇这个技术,也并无卵,只是为了遂儿时愿, 用到锐起无盘部署,支持win7哦: 视频教程: 拓展:网吧电脑为什么没有硬盘? 网吧电脑没有硬盘是怎么运行的? 所需软件: https://yunp ...

  10. linux 调试利器gdb, strace, pstack, pstree, lsof

    1) 如何使用strace+pstack利器分析程序性能? http://www.cnblogs.com/bangerlee/archive/2012/04/30/2476190.html 此文有详细 ...