/* 服务器代码:主要是学习如何解析数据 */
#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
#define PORT 8888
#define MAX_BUFFER_SIZE 1024
typedef struct {
int id;
char data[1024]; //不清楚为什么使用指针会读不出来数据
} Employee;
typedef struct {
char name_buff[20];
}NAME;
typedef struct
{
char name[20];
int age;
}AGE;
//根据ID的不同进行不同的数据转换,可以在里面添加要处理的事务
void play_recv_value(Employee* value)
{
NAME* liming;
AGE* liuhua;
if (value->id == 1)
{
liming=(NAME*)value->data;
printf("%s\n", liming->name_buff);
}
else
{
liuhua = (AGE*)value->data;
printf("name is %s ,AGE is %d\n", liuhua->name, liuhua->age);
}
}
int main() {
WSADATA wsa;
SOCKET serverSocket, newSocket;
struct sockaddr_in serverAddr, clientAddr;
int clientAddrLen, receivedBytes;
char buffer[MAX_BUFFER_SIZE];
char* data_buff = (char*)malloc(100);
Employee haha = {0};
char response[] = "Server received employee details";
// 初始化Winsock库
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) {
printf("Failed. Error Code : %d", WSAGetLastError());
return 1;
}
// 创建服务器端套接字
if ((serverSocket = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) {
printf("Could not create socket : %d", WSAGetLastError());
}
// 设置服务器地址和端口
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = INADDR_ANY;
serverAddr.sin_port = htons(PORT);
// 绑定服务器套接字
if (bind(serverSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
printf("Bind failed with error code : %d", WSAGetLastError());
}
// 监听连接请求
listen(serverSocket, 3);
printf("Listening for incoming connections...\n");
clientAddrLen = sizeof(clientAddr);
// 接受客户端连接
if ((newSocket = accept(serverSocket, (struct sockaddr*)&clientAddr, &clientAddrLen)) == INVALID_SOCKET) {
printf("Accept failed with error code : %d", WSAGetLastError());
}
printf("Connection accepted\n");
// 接收结构体数据
Employee *employee =&haha ;
while(1)
{
receivedBytes = recv(newSocket, (char*)data_buff, sizeof(Employee), 0);
employee = (Employee*)data_buff;
if (receivedBytes == SOCKET_ERROR) {
printf("Failed to receive data : %d", WSAGetLastError());
}
play_recv_value(employee);
memset(data_buff, 0, sizeof(data_buff));
// 发送回应
send(newSocket, response, strlen(response), 0);
Sleep(3000);
receivedBytes= recv(newSocket, data_buff, sizeof(Employee), 0);
if (receivedBytes == SOCKET_ERROR) {
printf("Failed to receive data : %d", WSAGetLastError());
}
employee = (Employee*)data_buff;
play_recv_value(employee);
}
closesocket(newSocket);
closesocket(serverSocket);
WSACleanup();
return 0;
}
/* 客户端代码:传输结构体,模拟HAED和DATA的数据结构*/
#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
#pragma warning(disable:4996)
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#define SERVER_IP "127.0.0.1"
#define PORT 8888
#define MAX_BUFFER_SIZE 1024
typedef struct {
int id;
char data[1024];
} Employee;
typedef struct {
char name_buff[20];
}NAME;
typedef struct
{
char name[20];
int age;
}AGE;
int main() {
WSADATA wsa;
SOCKET clientSocket;
struct sockaddr_in serverAddr;
int receivedBytes;
char buffer[MAX_BUFFER_SIZE];
AGE LIHUA;
Employee temp;
temp.id = 2;
LIHUA.age = 20;
// 初始化Winsock库
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) {
printf("Failed. Error Code : %d", WSAGetLastError());
return 1;
}
// 创建客户端套接字
if ((clientSocket = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) {
printf("Could not create socket : %d", WSAGetLastError());
}
// 设置服务器信息
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(PORT);
serverAddr.sin_addr.s_addr = inet_addr(SERVER_IP);
// 连接服务器
if (connect(clientSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) < 0) {
printf("Connect error");
return 1;
}
printf("Connected\n");
// 构造结构体数据
Employee employee;
NAME liming;
strcpy_s(liming.name_buff, "LIMING");
employee.id = 1;
memcpy(employee.data, &liming, sizeof(liming));
while(1)
{
// 发送结构体数据
if (send(clientSocket, (char*)&employee, sizeof(Employee), 0) == SOCKET_ERROR) {
printf("Send failed with error code : %d", WSAGetLastError());
}
printf("SENF DATA SUCCESS\n");
memset(buffer, 0, sizeof(buffer));
// 接收回应
receivedBytes = recv(clientSocket, buffer, sizeof(buffer), 0);
if (receivedBytes == SOCKET_ERROR) {
printf("Failed to receive data : %d", WSAGetLastError());
}
printf("Server response: %s\n", buffer);
// 发送结构体数据
strcpy(LIHUA.name, "Liuhua1");
memcpy(temp.data, (char*)&LIHUA,sizeof(LIHUA));
Sleep(5000);
if (send(clientSocket, (char*)&temp, sizeof(Employee), 0) == SOCKET_ERROR) {
printf("Send failed with error code : %d", WSAGetLastError());
closesocket(clientSocket);
WSACleanup();
return 0;
}
}
}