什么也不说了看代码

首先是服务端代码

 #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. SPOJ 8073 The area of the union of circles (圆并入门)

    Sphere Online Judge (SPOJ) - Problem CIRU [求圆并的若干种算法,圆并扩展算法]_AekdyCoin的空间_百度空间 参考AekdyCoin的圆并算法解释,根据 ...

  2. @loj - 2288@「THUWC 2017」大葱的神力

    目录 @description@ @solution@ @data - 1@ @data - 2@ @data - 3@ @data - 4@ @data - 5@ @data - 6@ @data ...

  3. C运行时库函数和API函数的区别和联系

    C运行时库函数 C运行时库函数是指C语言本身支持的一些基本函数,通常是汇编直接实现的.    API函数 API函数是操作系统为方便用户设计应用程序而提供的实现特定功能的函数,API函数也是C语言的函 ...

  4. 解锁当前XXX用户

    pam_tally2 查看当前锁账户 pam_tally2 --user=XXX用户 --reset 解锁当前XXX用户

  5. laravel 授权使用gate门类

    第一:先注册 第二:使用方式三种 路由中:Route::group(['middleware'=>'can:system'],function() {}) 模板中:@can("syst ...

  6. 手动实现如何从H264流中提取SPS/PPS信息

    1,代码比较简单,可以直接用了.流的第一个NALU一定是SPS void get_sps_pps_nalu(uint8_t *data, int len, std::vector<uint8_t ...

  7. github下载慢,轻松提速教程

    获取github的IP地址访问:https://www.ipaddress.com/ 网址 依次获取以下三个网址的IP github.comgithub.global.ssl.fastly.netco ...

  8. Laravel 修改默认日志文件名称和位置

    修改默认日志位置 我们平常的开发中可能一直把laravel的日志文件放在默认位置不会有什么影响,但如果我们的项目上线时是全量部署,每次部署都是git中最新的代码,那这个时候每次都会清空我们的日志,显示 ...

  9. CSS定位方式有哪些?position属性的值有哪些?他们之间的区别是什么?

    在CSS中关于定位的内容是:position:relative | absolute | static | fixed • static 自动定位,自动定位就是元素在页 面普通文档流中由HTML自动定 ...

  10. css技巧 1200px居中容器中某个div增加横屏背景

    <div class='container' style='width:1200px;margin:0 auto;'> <div style='width:200px;margin: ...