server.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <winsock.h>
#include <windows.h>
#include <stdbool.h>
#define MAXLINE 80
#define SERV_PORT 6666
int main()
{
//1.初始化网络环境
WSADATA wsaData;
if(WSAStartup(MAKEWORD(2,2),&wsaData) != 0)
{
printf("初始化winsock失败\n");
return -1;
}
printf("初始化winsock成功\n");
//2. 网络通信代码
//2.1 创建服务端套接字
SOCKET socketSever = socket(AF_INET,SOCK_STREAM,0);
if(INVALID_SOCKET == socketSever)
{
printf("创建socket失败\n");
WSACleanup();
return -1;
}
//2.2绑定ip地址和端口号
struct sockaddr_in sever_addr;
sever_addr.sin_family = AF_INET;
sever_addr.sin_port = htons(6666);
sever_addr.sin_addr.S_un.S_addr =inet_addr("192.168.1.112");
if(bind(socketSever,(struct sockaddr*)&sever_addr,sizeof(sever_addr)) == -1)
{
printf("绑定失败\n");
closesocket(socketSever);
WSACleanup();
return -1;
}
else
{
printf("绑定成功\n");
}
//2.3 监听连接
if(listen(socketSever,5) == SOCKET_ERROR)
{
printf("监听端口号失败\n");
closesocket(socketSever);
WSACleanup();
return -1;
}
else
{
printf("监听端口号成功\n");
}
//2.4 接收连接
while(true)
{
printf("准备等待客户端的到来...\n");
//创建一个用于通信的套接字
//accept() 会阻塞程序执行,直到有新的请求到来。
struct sockaddr_in clentAddr;
int clentAddrLen = sizeof(clentAddr);
SOCKET socketClent = accept(socketSever,(struct sockaddr*)&clentAddr,&clentAddrLen);
if(INVALID_SOCKET == socketClent)
{
printf("接收客户端连接失败\n");
continue;
}
else
{
printf("接收客户端连接成功\n");
}
//与客户端通信的循环
//数据传输:
//读取数据:通常使用recv()或read()函数从连接的套接字中读取数据。
//发送数据:使用send()或write()函数向对方发送数据。这些函数将数据写入套接字,进而传输到对方。
while(true)
{
char data[1024] = {};
//int recv(SOCKET s, char FAR *buf, int len, int flags)
// 套接字 缓冲区 缓冲区大小
//返回值: >0 成功 =0 对方关闭了连接 <0 发生错误
int ret = recv(socketClent,data,sizeof(data) - 1, 0);
if(ret > 0)
{
printf("接收数据成功\n");
//发送回复数据
ret = send(socketClent,data,ret,0);
if(ret == SOCKET_ERROR)
{
printf("发送数据失败\n");
break; //发送失败断开连接
}
}
else if (ret ==0) //客户端关闭连接
{
printf("客户端主动断开连接\n");
break;
}
else //发生错误
{
printf("接收客户端数据失败\n");
break;
}
}
//关闭客户端套接字
closesocket(socketClent);
printf("当前客户端已断开连接,等待下一个客户端...\n");
}
//3.清理资源
WSACleanup();
printf("资源已清理\n");
return 0;
}