用Winsock的API套接字函数实现如下功能:服务器端接收客户端的连接,并向客户端发送“hello ,I am server !”.客户端显示接收到的内容。当一个客户端连接到服务器端后,在服务器端显示该客户端的IP地址。
时间: 2024-02-29 13:52:30 浏览: 127
利用windows中的套接字机制来设计的客户端/服务器通信
好的,我可以为您提供相关的代码。请注意,以下代码仅提供基本的实现方式,可能需要根据您的实际情况进行修改。以下是服务器端的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib") //加载 ws2_32.dll
int main()
{
//初始化 DLL
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
//创建套接字
SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (serverSocket == INVALID_SOCKET)
{
printf("创建套接字失败!错误代码:%d\n", WSAGetLastError());
WSACleanup();
return 0;
}
//绑定 IP 地址和端口号
SOCKADDR_IN serverAddr;
memset(&serverAddr, 0, sizeof(serverAddr));
serverAddr.sin_family = AF_INET; // IPv4
serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); // 任意IP地址
serverAddr.sin_port = htons(6000); // 端口号为 6000
if (bind(serverSocket, (SOCKADDR*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR)
{
printf("绑定 IP 地址和端口号失败!错误代码:%d\n", WSAGetLastError());
closesocket(serverSocket);
WSACleanup();
return 0;
}
//监听客户端的连接请求
if (listen(serverSocket, SOMAXCONN) == SOCKET_ERROR)
{
printf("监听客户端的连接请求失败!错误代码:%d\n", WSAGetLastError());
closesocket(serverSocket);
WSACleanup();
return 0;
}
printf("服务器已启动,等待客户端连接...\n");
//接收客户端的连接请求
SOCKADDR_IN clientAddr;
int clientAddrLen = sizeof(clientAddr);
SOCKET clientSocket = accept(serverSocket, (SOCKADDR*)&clientAddr, &clientAddrLen);
if (clientSocket == INVALID_SOCKET)
{
printf("接收客户端的连接请求失败!错误代码:%d\n", WSAGetLastError());
closesocket(serverSocket);
WSACleanup();
return 0;
}
//向客户端发送消息
const char* message = "hello, I am server!";
send(clientSocket, message, strlen(message), 0);
//显示客户端的 IP 地址
printf("客户端 %s:%d 已连接\n", inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port));
//关闭套接字
closesocket(clientSocket);
closesocket(serverSocket);
WSACleanup();
return 0;
}
```
以下是客户端的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib") //加载 ws2_32.dll
int main()
{
//初始化 DLL
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
//创建套接字
SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (clientSocket == INVALID_SOCKET)
{
printf("创建套接字失败!错误代码:%d\n", WSAGetLastError());
WSACleanup();
return 0;
}
//连接服务器
SOCKADDR_IN serverAddr;
memset(&serverAddr, 0, sizeof(serverAddr));
serverAddr.sin_family = AF_INET; // IPv4
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 服务器的 IP 地址
serverAddr.sin_port = htons(6000); // 服务器的端口号为 6000
if (connect(clientSocket, (SOCKADDR*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR)
{
printf("连接服务器失败!错误代码:%d\n", WSAGetLastError());
closesocket(clientSocket);
WSACleanup();
return 0;
}
//接收服务器发送的消息
char recvBuf[1024];
memset(recvBuf, 0, sizeof(recvBuf));
int recvLen = recv(clientSocket, recvBuf, sizeof(recvBuf), 0);
if (recvLen > 0)
{
printf("接收到服务器的消息:%s\n", recvBuf);
}
//关闭套接字
closesocket(clientSocket);
WSACleanup();
return 0;
}
```
希望这些代码能够帮助您实现所需的功能。
阅读全文