在1.0的版本上,加上了相互通信
1.0只能服务器给客户端发送,传送门:https://blog.csdn.net/weixin_43118073/article/details/105276238
client.cpp
#include<Winsock2.h>
#include<stdio.h>
#include <WS2tcpip.h>
#pragma comment(lib,"ws2_32.lib") //添加库文件WindowsSocket2.0版本32位,库是编译好的二进制代码
#pragma warning(disable:4996)
//服务器端口号为5050
#define DEFAULT_PORT 5050
#define DATA_BUFFER 512
int main(int argc,char *argv[])
{
WSADATA wsaData;
SOCKET sClient;
int iSend;
int iPort = DEFAULT_PORT;
int iLen;//从服务器端接收的数据长度
char recvbuf[DATA_BUFFER];//接收数据的缓冲
char sendbuf[DATA_BUFFER];//发送数据
struct sockaddr_in ser;//服务器端地址
//判断输入的参数是否正确
//if (argc < 2)
//{
// printf("Usage:client[Server IP sddress]\n");
// return 0;
//}
printf("----------------------------\n");
printf("client\n");
printf("----------------------------\n");
//接收数据的缓冲区初始化
memset(recvbuf, 0, sizeof(recvbuf));
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
printf("Failed to load Winsock.\n");
return 0;
}
//填写要连接的服务器地址信息
ser.sin_family = AF_INET;
ser.sin_port = htons(iPort);
ser.sin_addr.s_addr = inet_addr("127.0.0.1");
//建立客户端流式套接口
sClient = socket(AF_INET, SOCK_STREAM, 0);
if (sClient == INVALID_SOCKET)
{
printf("socket( ) Failed:%d\n", WSAGetLastError());
return 0;
}
//请求与服务器端建立TCP连接
if (connect(sClient, (struct sockaddr*)&ser, sizeof(ser)) == INVALID_SOCKET)
{
printf("connect( ) Failed:%d\n", WSAGetLastError());
return 0;
}
else
{
printf("连接成功!");
}
while (1)
{
//从服务器端接收数据
iLen = recv(sClient, recvbuf, sizeof(recvbuf), 0);
if (iLen == 0)
return 0;
else if (iLen == SOCKET_ERROR)
{
printf("recv( ) Failed:%d\n", WSAGetLastError());
return 0;
}
printf("recv( ) data from server:%s\n", recvbuf);
//给服务器发送数据
printf("Please input send data:");
char c = getchar();
int i = 0;
while (c != '\n')
{
sendbuf[i] = c;
i++;
c = getchar();
}
sendbuf[i] = '\0';
printf("The send data is:%s", sendbuf);
iSend = send(sClient, sendbuf, sizeof(sendbuf), 0);
if (iSend == SOCKET_ERROR)
{
printf("send( ) Failed.:%d\n", WSAGetLastError());
break;
}
else if (iSend == 0)
printf("isend==0");
//break;
else
{
printf("send( ) byte:%d\n", iSend);
printf("-------------------------------\n");
}
if (strcmp(sendbuf, "bye-bye") == 0)
{
closesocket(sClient);
break;
}
}
printf("通信结束!");
WSACleanup();
getchar();
return 0;
}
server.cpp
#include <WinSock2.h> //WindowsSocket2.0版本
#include <stdio.h>
#include <stdlib.h>
#include<malloc.h>
#include <WS2tcpip.h>
#include <string.h>
#pragma warning(disable:4996)
#pragma comment(lib,"ws2_32.lib") //添加库文件WindowsSocket2.0版本32位,库是编译好的二进制代码
#define DEFAULT_PORT 5050
#define DATA_BUFFER 512
int main(void)
{
int iPort = DEFAULT_PORT;
WSADATA wasData;//创建一个结构体
WORD wdVersion = MAKEWORD(2, 2);
SOCKET sListen, sAccept;
int iLen; //客户地址长度
int iSend; //发送的数据长度
char sendbuf[DATA_BUFFER]; //要发送给客户的信息
char recvbuf[DATA_BUFFER];
//接收数据的缓冲区初始化
memset(recvbuf, 0, sizeof(recvbuf));
struct sockaddr_in ser, cli; //服务器和客户的地址
printf("----------------------------\n");
printf("\tServer waiting\n");
printf("----------------------------\n");
if (WSAStartup(wdVersion, &wasData)!=0)
{
printf("Falied to load Winsock.\n");
return -1;
}
//创建服务器端套接口
sListen = socket(AF_INET, SOCK_STREAM, 0);
if (sListen == INVALID_SOCKET)
{
printf("socket() Failed:%d\n", WSAGetLastError());
return -1;
}
ser.sin_family = AF_INET; //建立服务器端地址
ser.sin_port = htons(iPort); //htons()函数吧一个双字节主机顺序转换为网络字节顺序数
//使用系统指定的IP地址INADDR_ANY
ser.sin_addr.s_addr = htonl(INADDR_ANY); //htonl( )函数把一个四字节主机字节顺序的数转换为网络字节顺序的数
if (bind(sListen, (LPSOCKADDR)&ser, sizeof(ser)) == SOCKET_ERROR)
{
printf("bind( ) Failed: %d\n", WSAGetLastError());
return -1;
}
//进入监听状态
if (listen(sListen, 5) == SOCKET_ERROR)
{
printf("listen( ) Failed:%d\n", WSAGetLastError());
return -1;
}
//初始化客户地址长度参数
iLen = sizeof(cli);
//进入一个无限循环,等待客户的连接请求
sAccept = accept(sListen, (struct sockaddr*)&cli, &iLen);
if (sAccept == INVALID_SOCKET)
{
printf("accept( ) Failed: %d\n", WSAGetLastError());
return -1;
}
else
{
printf("建立连接成功!");
}
//输出客户IP地址和端口号
printf("Accepted client IP:[%s],port:[%d]\n",inet_ntoa(cli.sin_addr),ntohs(cli.sin_port));
//给连接的客户发送信息
while (1)
{
//给客户端发送消息
//给客户端再次发送消息
printf("Please input send data:");
char c = getchar();
int i = 0;
while (c != '\n')
{
sendbuf[i] = c;
i++;
c = getchar();
}
sendbuf[i] = '\0';
iSend = send(sAccept, sendbuf, sizeof(sendbuf), 0);
if (iSend == SOCKET_ERROR)
{
printf("send( ) Failed.:%d\n", WSAGetLastError());
break;
}
else if (iSend == 0)
printf("isend==0");
//break;
else
{
printf("send( ) byte:%d\n", iSend);
printf("-------------------------------\n");
}
//closesocket(sAccept);
//从客户端接收数据
iLen = recv(sAccept, recvbuf, sizeof(recvbuf), 0);
if (iLen == 0)
return 0;
else if (iLen == SOCKET_ERROR)
{
printf("recv( ) Failed:%d\n", WSAGetLastError());
return 0;
}
printf("recv( ) data from server:%s\n", recvbuf);
if (strcmp(recvbuf, "bye-bye") == 0)
{
closesocket(sListen);
break;
}
}
printf("通信结束!");
WSACleanup();
system("pause");
getchar();
return 0;
}