什么也不说了看代码

首先是服务端代码

 #include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>
#include <Windows.h>
#include <process.h>
#include <string.h>
#define BUFFSIZE 1024
#pragma comment(lib,"ws2_32.lib") //lib库
unsigned int WINAPI ThreadProc(LPVOID lpArgs);
typedef struct _tagSOCKET
{
SOCKET m_clientSocket;
SOCKET m_ServerSocket;
sockaddr_in m_ClientAddr;
}TAGSOCKET,*PTAGSOCKET;
HANDLE g_Thread = NULL;
int main(void)
{
WSADATA wsData;
//建立一个服务器socket
SOCKET hServer;
int hError;
WORD wVersion = MAKEWORD(,);
if(WSAStartup(wVersion,&wsData))//初始化
{
WSACleanup();
return ;
}
hServer = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); //创建套接字
hError = WSAGetLastError();
if (hServer==INVALID_SOCKET)
{
printf("错误代码%d\r\n",hError);
if(SOCKET_ERROR != closesocket(hServer)) //关闭套接字
WSACleanup(); //终止使用流式网络连接
return ;
}
//创建服务监听的地址端口
sockaddr_in addrServer;
addrServer.sin_family = AF_INET;
addrServer.sin_port = htons();
addrServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //INADDR_ANY 意思是接收当前机器上任何配置的本地ip连接
//绑定与相关联的套接字本地地址
if(SOCKET_ERROR == bind(hServer,(sockaddr*)&addrServer,sizeof(addrServer)))
{
printf("绑定失败\r\n");
if(SOCKET_ERROR != closesocket(hServer)) //关闭套接字
WSACleanup(); //终止使用流式网络连接
return ;
}
//在socket上监听
if(SOCKET_ERROR==listen(hServer,SOMAXCONN))
{
printf("监听失败\r\n");
if(SOCKET_ERROR != closesocket(hServer)) //关闭套接字
WSACleanup(); //终止使用流式网络连接
return ;
}
//接收来自客户端的连接请求信息
SOCKET cLientSocket;
sockaddr_in clientAddr;
int nLent = sizeof clientAddr;
cLientSocket = accept(hServer,(sockaddr*)&clientAddr,&nLent);
if(cLientSocket== SOCKET_ERROR)
{
printf("错误的客户socket连接\r\n");
if (SOCKET_ERROR !=closesocket(hServer))
{
WSACleanup();
return ;
}
}
TAGSOCKET uSerdata;
ZeroMemory(&uSerdata,sizeof(TAGSOCKET));
uSerdata.m_clientSocket = cLientSocket;
uSerdata.m_ServerSocket = hServer;
uSerdata.m_ClientAddr = clientAddr;
//循环接收客户端数据
g_Thread = (HANDLE)_beginthreadex(NULL,NULL,ThreadProc,(LPVOID)&uSerdata,NULL,NULL);
WaitForSingleObject(g_Thread,INFINITE);
CloseHandle(g_Thread);
/*in_addr addr;
addr.S_un.S_addr = inet_addr("192.168.1.1"); //将字符串ip转换成in_addr
//htonl() 主机转TCP 该 htonl函数可用于在主机字节顺序IPv4地址转换为网络字节顺序的IPv4地址。
//该功能不会检查hostlong参数是否是有效的IPv4地址。
// htons()
//inet_ntoa函数 将in_addr类型转换成字符串格式
//htons() 该 htons函数可用于将IP端口号主机字节顺序转换成网络字节顺序的IP端口号
*/ system("pause"); return ;
}
unsigned int WINAPI ThreadProc(LPVOID lpArgs)
{
//接收来自客户发送的数据
PTAGSOCKET tempSocket = (PTAGSOCKET)lpArgs;
if(tempSocket->m_clientSocket == SOCKET_ERROR || tempSocket->m_ServerSocket == SOCKET_ERROR)
{
closesocket(tempSocket->m_clientSocket);
closesocket(tempSocket->m_ServerSocket);
WSACleanup();
return ;
}
char szbuf[BUFFSIZE];
int nRecverror = SOCKET_ERROR;
while(TRUE)
{
ZeroMemory(szbuf,BUFFSIZE);
nRecverror = recv(tempSocket->m_clientSocket,szbuf,BUFFSIZE,NULL);
if(nRecverror==SOCKET_ERROR)
{
closesocket(tempSocket->m_clientSocket);
closesocket(tempSocket->m_ServerSocket);
WSACleanup();
break;
}
char sprintfbuf[BUFFSIZE];
ZeroMemory(sprintfbuf,BUFFSIZE);
sprintf_s(sprintfbuf,"Ip:%s:\t数据:%s\r\n",inet_ntoa(tempSocket->m_ClientAddr.sin_addr),szbuf);
printf("%s\r\n",sprintfbuf);
if (!_stricmp(szbuf,"close"))
{
nRecverror = send(tempSocket->m_clientSocket,"close",strlen("close")+,NULL);
if (nRecverror== SOCKET_ERROR)
{
closesocket(tempSocket->m_clientSocket);
closesocket(tempSocket->m_ServerSocket);
WSACleanup();
break;
}
break;
}else
{
sprintf_s(sprintfbuf,"已经接收到您发送的信息:%s\r\n",szbuf);
nRecverror = send(tempSocket->m_clientSocket,sprintfbuf,strlen(sprintfbuf),NULL);
if (nRecverror== SOCKET_ERROR)
{
closesocket(tempSocket->m_clientSocket);
closesocket(tempSocket->m_ServerSocket);
WSACleanup();
break;
}
}
}
printf("程序即将退出\r\n");
closesocket(tempSocket->m_clientSocket);
closesocket(tempSocket->m_ServerSocket);
WSACleanup();
return ;
}

下面是客户端代码

 #include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>
#include <Windows.h>
#pragma comment(lib,"ws2_32.lib")
#define BUFFSIZE 1024
int main(void)
{
WSADATA wSdata;
// char hostName[256]={0};
SOCKET hClientSocket;
WORD wVerison = MAKEWORD(,);
sockaddr_in sockeaddr;
// PHOSTENT hoStent;
if(WSAStartup(wVerison,&wSdata))
{
WSACleanup();
return ;
}
hClientSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(hClientSocket==INVALID_SOCKET)
{
WSACleanup();
return ;
}
/* gethostname(hostName,256);
hoStent = gethostbyname(hostName);
if(!hoStent)
{
closesocket(hClientSocket);
WSACleanup();
return 0;
}*/
ZeroMemory(&sockeaddr,sizeof(sockaddr_in));
sockeaddr.sin_family = AF_INET;
// printf("%s\r\n",inet_ntoa(*(in_addr*)hoStent->h_addr));
sockeaddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
sockeaddr.sin_port = htons();
//然后链接远程服务器
if(SOCKET_ERROR == connect(hClientSocket,(sockaddr*)&sockeaddr,sizeof(sockaddr_in)))
{
closesocket(hClientSocket);
WSACleanup();
return ;
}
char szbuf[BUFFSIZE];
int Nerror = SOCKET_ERROR;
while(TRUE)
{
ZeroMemory(szbuf,BUFFSIZE);
char sztemp[BUFFSIZE]={};
ZeroMemory(sztemp,BUFFSIZE);
printf("请输入你要发送的内容:\r\n");
scanf("%s",sztemp);
Nerror = send(hClientSocket,sztemp,strlen(sztemp)+,);
if (Nerror==SOCKET_ERROR)
{
break;
}
Nerror = recv(hClientSocket,szbuf,BUFFSIZE,);
if (Nerror==SOCKET_ERROR)
{
break;
}else
{
printf("接收到的数据:%s\r\n",szbuf);
}
if (!_stricmp(szbuf,"close"))
{
printf("即将关闭程序\r\n");
break;
}
}
closesocket(hClientSocket);
WSACleanup();
system("pause");
return ;
}

最后的效果就是这样

win32简单的sockeTCP协议通信的更多相关文章

  1. SMTP 简单邮件传输协议

    SMTP 锁定 本词条由“科普中国”百科科学词条编写与应用工作项目 审核 . SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传 ...

  2. winsock 编程(简单客户&服务端通信实现)

    winsock 编程(简单客户&服务端通信实现) 双向通信:Client send message to Server, and if  Server receive the message, ...

  3. Learning-Python【28】:基于TCP协议通信的套接字

    什么是 Socket Socket 是应用层与 TCP/IP 协议通信的中间软件抽象层,它是一组接口.在设计模式中,Socket 其实就是一个门面模式,它把复杂的 TCP/IP 协议族隐藏在 Sock ...

  4. 图解HTTP学习笔记——简单的HTTP协议

    简单的HTTP协议 前言 最近在学习Web开发的相关知识,发现<图解HTTP>这本书通俗易懂.所以花时间学习这本书,并记录下学习笔记. 如上图,我们每天都在浏览网页,一般我们都是在浏览器地 ...

  5. 【图解HTTP】第二章 简单的http协议

    简单的HTTP协议 针对HTTP协议结构进行讲解,主要使用HTTP/1.1版本. HTTP协议用于客户端和服务器端之间的通信 通过请求和响应的交换达成通信(从客户端开始建立通信,服务器端在没有接收到请 ...

  6. 简单的HTTP协议

    HTTP 协议和 TCP/IP 协议族内的其他众多的协议相同,用于客户端和服务器之间的通信. 请求访问文本或图像等资源的一端称为客户端,提供资源响应的一端称为服务器端. 在两台计算机之间使用 HTTP ...

  7. http基础(1.了解web及网络基础,2.简单的http协议)

    第一章:了解web及网络基础 1.http:超文本传输协议 2.tcp/ip协议族:通常使用的网络是在tcp/ip协议族的基础上运作的,而http属于它内部的一个子集. 3.tcp/ip协议族按层次分 ...

  8. [转]HTTP协议通信原理

    本文转自<HTTP协议通信原理> 了解HTTP HTTP(HyperText Transfer Protocol)是一套计算机通过网络进行通信的规则.计算机专家设计出HTTP,使HTTP客 ...

  9. 《图解HTTP》阅读笔记--第二章 简单的HTTP协议--第三章 HTTP报文信息

     第二章.简单的HTTP协议HTTP协议:HTTP协议用于客户端(请求资源的一端)和服务器端(响应回复提供资源的一端)的通信,是一种无状态协议HTTP1.1默认TCP持久连接,管线化发送(并行发送多个 ...

随机推荐

  1. POJ-1125_Stockbroker Grapevine

    Stockbroker Grapevine Time Limit: 1000MS Memory Limit: 10000K Description Stockbrokers are known to ...

  2. 即插即用,基于阿里云Ganos快速构建云上开源GIS方案

    对于轻量级GIS应用,选择具备时空能力的云上数据库再搭配开源GIS软件,能够快速构建稳定.廉价.实用的GIS解决方案.Ganos是阿里云自研时空基础设施(PaaS层)的核心引擎,该引擎整合了云上异构计 ...

  3. Remove Extra One 权值线段树

    最近疯狂练习线段树... 这道题题意很简单,在1-n中,找寻一个数,使得去掉这个数后,对于每个位置中满足 1<=j<i && a[ j ]<a[ i ] 的位置尽可能 ...

  4. DECLARE

    -- 修正用プログラム DECLARE    CURSOR c_adv_fee_detail IS        SELECT adv_fee.fee_mgmt_num,                ...

  5. oracle 识别’低效执行’的SQL语句

    用下列SQL工具找出低效SQL: SELECT EXECUTIONS , DISK_READS, BUFFER_GETS, ROUND((BUFFER_GETS-DISK_READS)/BUFFER_ ...

  6. 利用sort对数字排序

    sort,可排序字符串,按照ASCII码排序. 但也可以穿一个比较函数,实现比较数组内容,排序数组的功能. var arr = [40, 32, 45, 89, 93, 0, 46, 74]; var ...

  7. Python--day72--json内容回顾

    前后端分离,Json格式字符串:序列化和反序列化 """ 复习python中的json模块 """ import json s = '{&q ...

  8. H3C PAP验证

  9. 通俗理解tf.name_scope()、tf.variable_scope()

    前言:最近做一个实验,遇到TensorFlow变量作用域问题,对tf.name_scope().tf.variable_scope()等进行了较为深刻的比较,记录相关笔记:tf.name_scope( ...

  10. CentOS7在防火墙与端口上的操作

    https://jingyan.baidu.com/article/cdddd41cb3bf6c53cb00e1ac.html CentOS7在安装软件包或类库的时候,常常会因为防火墙的拦截和端口未开 ...