win32简单的sockeTCP协议通信
什么也不说了看代码
首先是服务端代码
#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协议通信的更多相关文章
- SMTP 简单邮件传输协议
SMTP 锁定 本词条由“科普中国”百科科学词条编写与应用工作项目 审核 . SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传 ...
- winsock 编程(简单客户&服务端通信实现)
winsock 编程(简单客户&服务端通信实现) 双向通信:Client send message to Server, and if Server receive the message, ...
- Learning-Python【28】:基于TCP协议通信的套接字
什么是 Socket Socket 是应用层与 TCP/IP 协议通信的中间软件抽象层,它是一组接口.在设计模式中,Socket 其实就是一个门面模式,它把复杂的 TCP/IP 协议族隐藏在 Sock ...
- 图解HTTP学习笔记——简单的HTTP协议
简单的HTTP协议 前言 最近在学习Web开发的相关知识,发现<图解HTTP>这本书通俗易懂.所以花时间学习这本书,并记录下学习笔记. 如上图,我们每天都在浏览网页,一般我们都是在浏览器地 ...
- 【图解HTTP】第二章 简单的http协议
简单的HTTP协议 针对HTTP协议结构进行讲解,主要使用HTTP/1.1版本. HTTP协议用于客户端和服务器端之间的通信 通过请求和响应的交换达成通信(从客户端开始建立通信,服务器端在没有接收到请 ...
- 简单的HTTP协议
HTTP 协议和 TCP/IP 协议族内的其他众多的协议相同,用于客户端和服务器之间的通信. 请求访问文本或图像等资源的一端称为客户端,提供资源响应的一端称为服务器端. 在两台计算机之间使用 HTTP ...
- http基础(1.了解web及网络基础,2.简单的http协议)
第一章:了解web及网络基础 1.http:超文本传输协议 2.tcp/ip协议族:通常使用的网络是在tcp/ip协议族的基础上运作的,而http属于它内部的一个子集. 3.tcp/ip协议族按层次分 ...
- [转]HTTP协议通信原理
本文转自<HTTP协议通信原理> 了解HTTP HTTP(HyperText Transfer Protocol)是一套计算机通过网络进行通信的规则.计算机专家设计出HTTP,使HTTP客 ...
- 《图解HTTP》阅读笔记--第二章 简单的HTTP协议--第三章 HTTP报文信息
第二章.简单的HTTP协议HTTP协议:HTTP协议用于客户端(请求资源的一端)和服务器端(响应回复提供资源的一端)的通信,是一种无状态协议HTTP1.1默认TCP持久连接,管线化发送(并行发送多个 ...
随机推荐
- LeetCode Weekly Contest 6
leetcode现在每周末举办比赛,这是今天上午参加的比赛的题解.题目难度不算大,两个easy,一个medium,一个hard.hard题之前接触过,所以做得比较顺利. 1. Sum of Left ...
- 从遇见到信任 | Apache Dubbo 的毕业之旅
所谓信任,就是多一次机会. 2018年2月16日,Apache Dubbo 加入 Apache 基金会孵化器. ... 2019年5月16日,Apache 软件基金会董事会决议通过了 Apache D ...
- @loj - 2339@ 「WC2018」通道
目录 @desription@ @solution@ @accepted code@ @details@ @desription@ 11328 年,C 国的科学家们研发了一种高速传送通道,可以在很短的 ...
- Android 高仿QQ滑动弹出菜单标记已读、未读消息
在上一篇博客<Android 高仿微信(QQ)滑动弹出编辑.删除菜单效果,增加下拉刷新功能>里,已经带着大家学习如何使用SwipeMenuListView这一开源库实现滑动列表弹出菜单,接 ...
- hdu 1384 Intervals (差分约束)
Problem - 1384 好歹用了一天,也算是看懂了差分约束的原理,做出第一条查分约束了. 题意是告诉你一些区间中最少有多少元素,最少需要多少个元素才能满足所有要求. 构图的方法是,(a)-> ...
- Oracle - @和@@、&与&& 的区别
2018-01-15 15:36:17 袭冷 阅读数 4783更多 分类专栏: DB 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接 ...
- POJ2752 Seek the Name, Seek the Fame 题解 KMP算法
题目链接:http://poj.org/problem?id=2752 题目大意:给你一个字符串 \(S\) ,如果它的一个前缀同时也是它的后缀,则输出这个前缀(后缀)的长度. 题目分析:next函数 ...
- H3C 轮询DCC和共享DCC
- Python--day72--ajax完整版
来源: AJAX准备知识:JSON 什么是 JSON ? JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻量级的文本数据交换格 ...
- [转]Spring历史版本变迁和如今的生态帝国
前两篇: 为什么要有Spring? 为什么要有Spring AOP? 前两篇从Web开发史的角度介绍了我们在开发的时候遇到的一个个坑,然后一步步衍生出Spring Ioc和Spring AOP的概念雏 ...