分布式练手:Server

步骤:

1.新建一个空项目,项目名称为Server,解决方案名称为Socket;

2.新建一个空项目名称为Client;

3.为Server构建一个头文件,一个源文件,Client同理。

4.右击项目Client,将SDL检查改为否。

5.按ctrl+F5先运行Server,再右击"Client"->调试->启动新实例;

6.开始运行,可以互相发送消息了。

源程序:【免费】分布式练手:Server资源-CSDN文库

#include"Server.h"

#include<stdio.h>

#include<stdlib.h>

int main()

{

init_Socket();

SOCKET serfd = CreateServerSocket();

Sign:printf("IP:127.0.0.1\n");

printf("Listening port:%d \n", PORT);

printf("wait Client connect...\n");

//客户端请求连接

SOCKET clifd = accept(serfd, NULL, NULL);

if (INVALID_SOCKET == clifd)

{

err("accept");

}

//可以与客户端通信

char recvbuf[BUFSIZ] = { 0 };

char sendbuf[BUFSIZ] = { 0 };

printf("Client connected...\n");

while (true)

{

//接收消息

if (0 < recv(clifd, recvbuf, BUFSIZ, 0))

{

printf("recv:%s\n", recvbuf);

memset(recvbuf, 0, sizeof(recvbuf));

}

//给客户端发送消息

printf("send>");

gets_s(sendbuf, BUFSIZ);

if (SOCKET_ERROR == send(clifd, sendbuf, strlen(sendbuf), 0))

{

err("send");

printf("\n");

printf("Client disconnected\n");

goto Sign;

}

if (INVALID_SOCKET == clifd)

{

err("accept");

return false;

}

}

closesocket(clifd);

closesocket(serfd);

close_Socket();

system("pause");

return 0;

}

bool init_Socket()

{

WSADATA wsadata;

if (0 != WSAStartup(MAKEWORD(2, 2), &wsadata))

{

printf("WSAStartup failed code %d", WSAGetLastError());

return false;

}

//WSA Windows异步套接字

//parm1 请求的Socket版本

//parm2 传出参数

return true;

}

bool close_Socket()

{

if (0 != WSACleanup())

{

printf("WSACleanup failed code %d", WSAGetLastError());

return false;

}

return true;

}

SOCKET CreateServerSocket()

{

//1 创建空的Socket

//af 地址协议族

//type 传输协议类型: 流式套接字 数据报套接字

//protocol 使用的具体传输协议

SOCKET fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if (fd == INVALID_SOCKET)

{

err("socket");

return INVALID_SOCKET;

}

//2 绑定端口与ip地址

struct sockaddr_in addr;

addr.sin_family = AF_INET;

addr.sin_port = htons(PORT);

addr.sin_addr.S_un.S_addr = ADDR_ANY;

if (SOCKET_ERROR == bind(fd, (sockaddr*)&addr, sizeof(addr)))//SOCKET_ERROR == bind(fd, (sockaddr*)&addr, sizeof(addr))

{

err("bind");

return false;

}

//监听

listen(fd, 10);

return fd;

}

TCP服务器程序,使用了Windows Socket API(WSA)在C语言中编写。`int main()`函数初始化套接字、创建服务器套接字,并开始监听客户端连接。

  1. `init_Socket()` 函数用于初始化Windows套接字库(WSAStartup),设置所需的Socket版本并检查启动是否成功。

  2. `CreateServerSocket()` 和 `accept()` 分别负责创建服务器端套接字和等待客户端连接。如果接受失败,会返回错误并处理。

  3. 当有客户端连接后,进入一个无限循环,期间不断接收客户端发送的消息,然后将用户输入的内容发送回去。`recv()` 和 `send()` 函数分别用于接收和发送数据。

  4. 如果在发送数据过程中发生错误或断开连接,会打印错误信息,并关闭相应的套接字(clifd和serfd)。

  5. 循环结束后,关闭所有套接字资源(close_Socket()),暂停程序(system("pause"))等待用户按键,最后返回0表示正常退出。

相关推荐
眠りたいです44 分钟前
现代C++:C++14中的新语言特性和库特性
c语言·开发语言·c++
浅念-2 小时前
LeetCode 回溯算法题——综合练习
数据结构·c++·算法·leetcode·职场和发展·深度优先·dfs
сокол3 小时前
【网安-Web渗透测试-靶场系列】AWD-Platform(ctf-hub)
linux·服务器·ubuntu·网络安全·docker
楼田莉子3 小时前
C++17新特性:__had_include/属性/求值顺序规则
开发语言·c++·后端
500844 小时前
昇腾 CANN 的五层架构,到底分了哪五层
java·人工智能·分布式·架构·ocr·wpf
解道Jdon4 小时前
[Budi插件:VsCode状态栏显示Copilot使用情况
ide·windows·git·svn·eclipse·github·visual studio
song5014 小时前
Ascend C 算子开发:从入门到上手
c语言·开发语言·图像处理·人工智能·分布式·flutter·交互
h_a_o777oah5 小时前
状态机+划分型 DP :深度解析K-划分问题下 DP 状态的转移逻辑(洛谷P2679 P2331 附C++代码)
c++·算法·动态规划·acm·状态机dp·划分型dp·滚动数组优化
一个人旅程~5 小时前
如何避免在使用win安装U盘启动macbook时候出现键盘触摸板卡死的问题
windows·经验分享·macos·电脑
每天一把堆栈5 小时前
ciscn-pwn
安全·网络安全·pwn