客户端发送数据,服务器端接收数据
先运行server.exe,再运行client.exe
服务器端server.cpp
#include<stdio.h>
#include<winsock2.h>
#pragma comment(lib,"ws2_32.lib")//加载ws2_32.dll
int main()
{
//初始化DLL
WSADATA wsaData;
WSAStartup(MAKEWORD(2,2),&wsaData); //协议版本为2.2
//判断版本信号是否正确
if(LOBYTE(wsaData.wVersion)!=2 || HIBYTE(wsaData.wVersion)!=2)
{
printf("请求协议版本失败!\n");
return -1;
}
//创建套接字
SOCKET servSock = socket(PF_INET, SOCK_STREAM,IPPROTO_TCP);
if(SOCKET_ERROR == servSock)
{
printf("创建socket失败\n");
WSACleanup(); //清空版本协议
return -2;
}
//绑定套接字
sockaddr_in sockAddr;
memset(&sockAddr, 0, sizeof(sockAddr)); //每个字节都用0填充
sockAddr.sin_family = PF_INET;//使用IPv4地址
sockAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); //IP地址
sockAddr.sin_port=htons(10086);//端口
int bd=bind(servSock,(SOCKADDR*)&sockAddr,sizeof(SOCKADDR));
if(bd==-1)
{
printf("bind 失败\n");
closesocket(servSock);
WSACleanup();
return -3;
}
//进入监听状态
int lisn=listen(servSock,20);//20为监听队列的长度
if(lisn==-1)
{
printf("listen 失败\n");
closesocket(servSock);
WSACleanup();
return -4;
}
//接收客户端请求
SOCKADDR clntAddr;
int size=sizeof(SOCKADDR);
SOCKET clntSock=accept(servSock,(SOCKADDR*)&clntAddr,&size);
//接收客户端的数据
char recvBuff[1024];
while(1)
{
int r=recv(clntSock,recvBuff,1023,NULL);
if(r>0) //接收成功
{
recvBuff[r]='\0';
printf("接收到的客户端数据:%s\n",recvBuff);
}
}
return 0;
}
客户端client.cpp
#include<stdio.h>
#include<stdlib.h>
#include<winSock2.h>
#pragma comment(lib,"ws2_32.lib")
int main()
{
//初始化DLL
WSADATA wsaData;
WSAStartup(MAKEWORD(2,2),&wsaData);
//创建套接字
SOCKET sock=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
//获取服务器的协议地址族
sockaddr_in sockAddr;
memset(&sockAddr,0,sizeof(sockAddr));
sockAddr.sin_family=PF_INET;
sockAddr.sin_addr.s_addr=inet_addr("127.0.0.1");
sockAddr.sin_port=htons(10086);
//连接服务器
connect(sock,(SOCKADDR*)&sockAddr,sizeof(SOCKADDR));
//通信
char buff[1024];
while(1)
{
memset(buff,0,1024);
printf("请输入你要发送给服务器的信息:\n");
scanf("%s",buff);
send(sock,buff,strlen(buff),NULL);
}
return 0;
}