什么也不说了看代码

首先是服务端代码

 #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. HZOJ Drink

    神仙题,打了个whs式暴力卡常卡A了(我没脸),正解还是要打的,然而作者的题解看不懂…… Drink: 看惯了罗马音的小朋友们都会知道r发l的音,题目名:D Link. 每次修改都会改变O( N ^  ...

  2. matplotlib绘制热力图

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/jin_tmac/article/deta ...

  3. Jmeter json处理器

  4. @noi.ac - 508@ 01背包

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 有一天你学了一个能解决01背包问题的算法,你决定将这个算法应用到 ...

  5. es6新增语法之`${}`

    这是es6中新增的字符串方法 可以配合反单引号完成拼接字符串的功能 1.反单引号怎么打出来?将输入法调整为英文输入法,单击键盘上数字键1左边的按键. 2.用法step1: 定义需要拼接进去的字符串变量 ...

  6. px em rem %作为单位使用

    博客地址 :https://www.cnblogs.com/sandraryan/ px 我们都很熟悉啦,但是固定大小无法适配各种屏幕. rem是CSS3新增的一个相对单位(root em,根em), ...

  7. 用mysql查询某字段是否有索引

    可以使用SHOW INDEX FROM table_name来查看表的索引,从而查看字段的索引:查询结果中table为表名,key_name为索引名,Column_name为列名

  8. vue+vant 购物车的全选和反选

    https://blog.csdn.net/wjswangjinsheng/article/details/91392694

  9. 极简触感反馈Button组件

    一个简单的React触感反馈的button组件 import React from 'react'; import './index.scss'; class Button extends React ...

  10. 条件随机场(CRF) - 4 - 学习方法和预测算法(维特比算法)

    声明: 1,本篇为个人对<2012.李航.统计学习方法.pdf>的学习总结,不得用作商用,欢迎转载,但请注明出处(即:本帖地址). 2,由于本人在学习初始时有很多数学知识都已忘记,所以为了 ...