步骤:
1.新建一个空项目,项目名称为Server,解决方案名称为Socket;
2.新建一个空项目名称为Client;
3.为Server构建一个头文件,一个源文件,Client同理。
4.右击项目Client,将SDL检查改为否。
5.按ctrl+F5先运行Server,再右击"Client"->调试->启动新实例;
6.开始运行,可以互相发送消息了。
#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()`函数初始化套接字、创建服务器套接字,并开始监听客户端连接。
-
`init_Socket()` 函数用于初始化Windows套接字库(WSAStartup),设置所需的Socket版本并检查启动是否成功。
-
`CreateServerSocket()` 和 `accept()` 分别负责创建服务器端套接字和等待客户端连接。如果接受失败,会返回错误并处理。
-
当有客户端连接后,进入一个无限循环,期间不断接收客户端发送的消息,然后将用户输入的内容发送回去。`recv()` 和 `send()` 函数分别用于接收和发送数据。
-
如果在发送数据过程中发生错误或断开连接,会打印错误信息,并关闭相应的套接字(clifd和serfd)。
-
循环结束后,关闭所有套接字资源(close_Socket()),暂停程序(system("pause"))等待用户按键,最后返回0表示正常退出。