什么也不说了看代码

首先是服务端代码

 #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. 03搭建docker私有仓库

    搭建docker私仓,可以使用docker官方提供的registry镜像.该镜像目前有2.0,2.3和2.3.1版本.它只与1.6.0以上版本的docker兼容.搭建私仓的步骤如下: 一:无代理.无认 ...

  2. Android GDI 图形渲染

      发布于2011-07-26   导读:对于Android开发者来说,成系列的技术文章对他们的技术成长帮助最大.如下是我们向您强烈推荐的主题为Android开发的第一个系列文章. <Andro ...

  3. python实现以立春为起点n为周期任意日期所在的日期区间

    python实现以立春为起点n为周期任意日期所在的日期区间 需求 话不多说,直接上具体需求. ''' 以每年的立春作为起始点,每N天为一个单元,任给一个日期,返回该日期所在单元的起始和结束日期.例如: ...

  4. SpringBoot 获取properties配置文件的属性

    自定义properties文件获取属性 使用 @ConfigurationProperties((prefix = "demo")) 和 @PropertySource(" ...

  5. javascript 容易混淆遗忘的基础知识

    1.  标识符     所谓标识符,就是指变量.函数.属性的名字,或者函数的参数.标识符可以是按照下列格式规则组合起来的一或多个字符:     1.1   第一个字符必须是一个字母.下划线( _ )或 ...

  6. 手写call,apply方法实现

    call Function.prototype.myCall = function(){ var object = arguments[0]; var arr = []; for(var i = 1; ...

  7. Android 隐藏EditText的焦点

    在页面的开发过程中,我们可能会遇到这样的情况,打开某个页面(Activity)时,如果该页面中有EditText组建,则会自动弹出软键盘(因为该EditText自动获取焦点了),这样很容易影响用户体验 ...

  8. 三种查看MySQL数据库版本的方法

    https://blog.csdn.net/hj7jay/article/details/51921504 1.使用-V参数 首先我们想到的肯定就是查看版本号的参数命令,参数为-V(大写字母)或者-- ...

  9. Python--day28--面试题

  10. Native memory allocation (mmap) failed to map xxx bytes for committing reserved memory

    遇到问题 在服务器上运行 nexus 出现Native memory allocation (mmap) failed to map 838860800 bytes for committing re ...