c++ socket windows

介绍:网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。

步骤:

(借鉴图)

服务端

1、加载套接字库,创建套接字(WSAStartup()/socket());

2、绑定套接字到一个IP地址和一个端口上(bind());

3、将套接字设置为监听模式等待连接请求(listen());

4、请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept());

5、用返回的套接字和客户端进行通信(send()/recv());

6、返回,等待另一个连接请求;

7、关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup());

客户端

1、加载套接字库,创建套接字(WSAStartup()/socket());

2、向服务器发出连接请求(connect());

3、和服务器进行通信(send()/recv());

4、关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup());

//服务端
#include <stdio.h>
#include <sys/types.h>
#include <winsock.h>
#pragma comment(lib,"ws2_32.lib")
int main(int cout,char** args)
{
WORD sockVersion = MAKEWORD(2,2);//获取winsock版本
WSADATA wsadata;//
if (int ret=WSAStartup(sockVersion, &wsadata)!=0)//初始化WSA  
{//失败
switch (ret)
{
case WSASYSNOTREADY:printf("%s\n", "网络通信中下层的网络子系统没准备好"); break;
case WSAVERNOTSUPPORTED:printf("%s\n", "Socket实现提供版本和socket需要的版本不符"); break;
case WSAEINPROGRESS:printf("%s\n", "一个阻塞的Socket操作正在进行"); break;
case WSAEPROCLIM:printf("%s\n", "Socket的实现超过Socket支持的任务数限制"); break;
case WSAEFAULT:printf("%s\n", "lpWSAData参数不是一个合法的指针"); break;
default:
break;
}
return 0;
}
SOCKET slisten = socket(AF_INET,SOCK_STREAM, IPPROTO_TCP);//创建套接字 
if (slisten== INVALID_SOCKET)
{
printf("%s\n","invalid socket !");
return 0;
}
sockaddr_in serAddr;
serAddr.sin_family=AF_INET;
serAddr.sin_port = htons(8888);
serAddr.sin_addr.S_un.S_addr = INADDR_ANY;
if (bind(slisten,(LPSOCKADDR)&serAddr,sizeof(serAddr))==SOCKET_ERROR)//绑定IP、端口
{
printf("%s\n", "bind error!");
return 0;
}
if (listen(slisten,5)==SOCKET_ERROR)//开始监听
{
printf("%s\n","listen error!");
}
SOCKET sClient;
sockaddr_in remoteAdrr;
int adrrlen = sizeof(remoteAdrr);
char data[255];
while (true)
{
printf("%s\n","wait connect...");
sClient = accept(slisten,(sockaddr*)&remoteAdrr,&adrrlen);//等待连接请求
if (sClient == INVALID_SOCKET)
{
printf("%s\n","accept error!");
continue;
}
printf("接受到一个连接:%s \r\n", inet_ntoa(remoteAdrr.sin_addr));
int ret = recv(sClient, data, 255, 0);//接收数据    
if (ret > 0)
{
data[ret] = 0x00;
printf(data);
}
char sendData[512];
memset(sendData, 0, 255);
strcpy(sendData,data);
strcpy(sendData,",你好!");
send(sClient, sendData, strlen(sendData), 0);//发送数据    
closesocket(sClient);
}
closesocket(slisten);
WSACleanup();
return 0;
}

//客服端

#include <winsock.h>
#include <stdio.h>
#include <iostream>
using namespace std;
#pragma comment(lib,"ws2_32.lib")
int main(int cout, char** args)
{
WORD sVersion = MAKEWORD(2,2);
WSADATA wsadata;
if (WSAStartup(sVersion, &wsadata)!=0)
{
printf("%s\n","invalid WSAStartup !");
return 0;
}
while (true)
{
SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sclient==SOCKET_ERROR)
{
printf("%s\n","invaild socket!");
return 0;
}
sockaddr_in serAddr;
serAddr.sin_family = AF_INET;
serAddr.sin_port = htons(8888);
serAddr.sin_addr.S_un.S_addr = inet_addr("192.168.0.103");
if (connect(sclient,(const sockaddr*)&serAddr,sizeof(serAddr))==SOCKET_ERROR)
{//连接失败
printf("%s\n","connect error!");
closesocket(sclient);
}
char data[255];
memset(data,0,255);
cin >> data;
send(sclient,data,strlen(data),0);//发送数据


char recvdata[255];
memset(recvdata, 0, 255);
int ret = recv(sclient, recvdata, sizeof(recvdata), 0);
if (ret>0)
{
printf("%s\n",recvdata);
}
closesocket(sclient);
}
WSACleanup();
return 0;
}



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值