/****************************************************************************** * 程序: winsock_client.c * 目的: 创建一个套接字,通过网络连接一个服务器,并打印来自服务器的信息 * 作者: 周 晨 * 学号: 2011210154 *****************************************************************************/ #include #include #include #include #include /* 导入win32函数库 */ #pragma comment(lib, "WS2_32.lib") /* winsock初始化成功标志 */ #define WSA_STARTUP_SUCCESS 0 /* 接受服务器数据的缓冲区数组长度 */ #define BUFFER_SIZE 35 /* 获取系统当前的日期和时间 */ void GetSystemCurrentTime() { SYSTEMTIME sys; GetLocalTime( &sys ); printf("%4d-%02d-%02d %02d:%02d:%02d - ", sys.wYear, sys.wMonth, sys.wDay, sys.wHour, sys.wMinute, sys.wSecond); } int main() { /* 接收函数调用返回的状态码 */ int state_code = 0; /* 服务器IP地址 */ char FAR server_ip[] = "127.0.0.1"; /* 服务器端口号 */ int server_port = 5199; /* 声明一个客户端Socket连接 */ SOCKET client_socket; /* 声明服务器端的网络地址结构 */ SOCKADDR_IN server_address; /* 清空该网络地址结构 */ memset( &server_address, 0, sizeof(server_address) ); /* 设置为Internet协议簇 */ server_address.sin_family = AF_INET; /* 转化服务器IP地址 */ server_address.sin_addr.S_un.S_addr = inet_addr(server_ip); /* 转化服务器端口号 */ server_address.sin_port = htons(server_port); /* 网络地址结构所占字节大小 */ int server_address_size = (int)sizeof(SOCKADDR_IN); /* 从服务器端读取到的字符数 */ int character_count = 0; /* 接受服务器数据的缓冲区 */ char buffer[BUFFER_SIZE]; GetSystemCurrentTime(); printf("Client:客户端已启动!\n"); /* 初始化 WinSock 连接 */ WSADATA wsadata; state_code = WSAStartup(MAKEWORD(2, 2), &wsadata); if (WSA_STARTUP_SUCCESS != state_code) { GetSystemCurrentTime(); printf("发生错误:初始化WinSock连接失败!错误码:%d\n", WSAGetLastError()); exit(EXIT_FAILURE); } /* 创建 Socket 连接 */ client_socket = socket(AF_INET, SOCK_STREAM, 0); GetSystemCurrentTime(); if (INVALID_SOCKET == client_socket) { printf("发生错误:客户端套接字创建失败!错误码:%d\n", WSAGetLastError()); closesocket(client_socket); WSACleanup(); exit(EXIT_FAILURE); } printf("Client:客户端套接字已成功创建!\n"); /* 尝试连接到服务器端 */ GetSystemCurrentTime(); printf("Client:正在尝试连接服务器......\n"); state_code = connect(client_socket, (SOCKADDR*)&server_address, server_address_size); GetSystemCurrentTime(); if (SOCKET_ERROR == state_code) { printf("发生错误:连接服务器失败!错误码:%d\n", WSAGetLastError()); closesocket(client_socket); WSACleanup(); exit(EXIT_FAILURE); } printf("Client:连接服务器成功!\n"); /* 从服务器端读取数据并将其输出到屏幕上 */ character_count = recv(client_socket, buffer, strlen(buffer), 0); while (character_count > 0) { GetSystemCurrentTime(); printf("Client:收到来自服务器Server端的消息,内容如下:\n\n"); GetSystemCurrentTime(); printf("%s\n\n", buffer); character_count = recv(client_socket, buffer, strlen(buffer), 0); } /* 关闭本次socket连接并清除winsock */ closesocket(client_socket); WSACleanup(); system("pause"); exit(EXIT_SUCCESS); return EXIT_SUCCESS; }