使用WINSOCK 通讯编写一个C/S通讯程序
时间: 2024-03-10 22:47:29 浏览: 17
好的,下面是一个简单的C/S通讯程序的代码示例,使用Winsock库进行通讯:
Server端代码:
```c
#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib") // 链接库文件
int main() {
WSADATA wsaData;
SOCKET serverSocket, clientSocket;
SOCKADDR_IN serverAddr, clientAddr;
int clientAddrLen = sizeof(clientAddr);
int ret;
// 初始化Winsock库
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
printf("Failed to initialize Winsock.\n");
return 1;
}
// 创建套接字
serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (serverSocket == INVALID_SOCKET) {
printf("Failed to create socket.\n");
WSACleanup();
return 1;
}
// 绑定套接字到本地IP地址和端口
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
serverAddr.sin_port = htons(8888);
ret = bind(serverSocket, (SOCKADDR*)&serverAddr, sizeof(serverAddr));
if (ret == SOCKET_ERROR) {
printf("Failed to bind socket.\n");
closesocket(serverSocket);
WSACleanup();
return 1;
}
// 监听客户端连接
ret = listen(serverSocket, 5);
if (ret == SOCKET_ERROR) {
printf("Failed to listen on socket.\n");
closesocket(serverSocket);
WSACleanup();
return 1;
}
printf("Server started, waiting for client...\n");
// 等待客户端连接
clientSocket = accept(serverSocket, (SOCKADDR*)&clientAddr, &clientAddrLen);
if (clientSocket == INVALID_SOCKET) {
printf("Failed to accept client.\n");
closesocket(serverSocket);
WSACleanup();
return 1;
}
printf("Client connected: %s:%d\n", inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port));
// 接收客户端发送的数据
char recvBuf[1024];
int recvLen;
while (1) {
recvLen = recv(clientSocket, recvBuf, sizeof(recvBuf), 0);
if (recvLen <= 0) {
break;
}
printf("Received data from client: %s\n", recvBuf);
}
// 关闭套接字
closesocket(clientSocket);
closesocket(serverSocket);
// 卸载Winsock库
WSACleanup();
return 0;
}
```
Client端代码:
```c
#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib") // 链接库文件
int main() {
WSADATA wsaData;
SOCKET clientSocket;
SOCKADDR_IN serverAddr;
int ret;
// 初始化Winsock库
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
printf("Failed to initialize Winsock.\n");
return 1;
}
// 创建套接字
clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (clientSocket == INVALID_SOCKET) {
printf("Failed to create socket.\n");
WSACleanup();
return 1;
}
// 连接服务器
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
serverAddr.sin_port = htons(8888);
ret = connect(clientSocket, (SOCKADDR*)&serverAddr, sizeof(serverAddr));
if (ret == SOCKET_ERROR) {
printf("Failed to connect to server.\n");
closesocket(clientSocket);
WSACleanup();
return 1;
}
printf("Connected to server: %s:%d\n", inet_ntoa(serverAddr.sin_addr), ntohs(serverAddr.sin_port));
// 发送数据到服务器
char sendBuf[1024];
while (1) {
printf("Enter data to send: ");
gets_s(sendBuf, sizeof(sendBuf));
if (strlen(sendBuf) <= 0) {
break;
}
ret = send(clientSocket, sendBuf, strlen(sendBuf), 0);
if (ret == SOCKET_ERROR) {
printf("Failed to send data.\n");
closesocket(clientSocket);
WSACleanup();
return 1;
}
}
// 关闭套接字
closesocket(clientSocket);
// 卸载Winsock库
WSACleanup();
return 0;
}
```
注意事项:
1. 在编译时需要链接`ws2_32.lib`库文件;
2. 在使用`inet_addr`函数将IP地址转换为网络字节序时,需要注意将点分十进制形式的IP地址转换为整数后再调用`htonl`函数转换为网络字节序;
3. 代码中没有对输入进行安全处理,实际使用时需要注意输入合法性和缓冲区溢出等问题。