/****************************************************************************** |
* 程序: winsock_client.c |
* 目的: 创建一个套接字,通过网络连接一个服务器,并打印来自服务器的信息 |
* 作者: 周 晨 |
* 学号: 2011210154 |
*****************************************************************************/ |
#include <stdio.h> |
#include <stdlib.h> |
#include <string.h> |
#include <WinSock2.h> |
#include <Windows.h> |
/* 导入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; |
} |