?? client.c
字號(hào):
/*
* TCP Stream Socket Client
* 這個(gè)例子說明了如何實(shí)現(xiàn)一個(gè)Winsock的客戶端。
* 它做的工作非常簡單,負(fù)責(zé)發(fā)送一條消息到服務(wù)器,并且接收從服務(wù)器的返回信息。
* 如果指定服務(wù)器名為"localhost",這個(gè)程序和TCP Stream Socket Server這個(gè)例子運(yùn)行在同一臺(tái)機(jī)器上。
* 也可以通過指定其他服務(wù)器名來在不同的機(jī)器上工作。
*/
#include <windows.h>
#include <winsock.h>
#define PORTNUM 5000 // 端口號(hào)
#define HOSTNAME "localhost" // 服務(wù)器名字
// 根據(jù)服務(wù)器的不同,更改上面的名字
int WINAPI WinMain (
HINSTANCE hInstance, // 實(shí)例句柄
HINSTANCE hPrevInstance,// NULL
LPTSTR lpCmdLine, // 用于運(yùn)行程序的命令行
int nCmdShow) // 程序的最初的顯示方式
{
int index = 0, // 索引
iReturn; // recv函數(shù)的返回值
char szClientA[100]; // ASCII碼串
TCHAR szClientW[100]; // Unicode串
TCHAR szError[100]; // 出錯(cuò)消息串
SOCKET ServerSock = INVALID_SOCKET; // 服務(wù)器的socket
SOCKADDR_IN destination_sin; // 服務(wù)器的socket地址
PHOSTENT phostent = NULL; // 指向服務(wù)器的HOSTENT結(jié)構(gòu)
WSADATA WSAData; // 包含了Winsocket執(zhí)行后的細(xì)節(jié)
// 初始化Winsocket.
if (WSAStartup (MAKEWORD(1,1), &WSAData) != 0)
{
wsprintf (szError, TEXT("WSAStartup failed. Error: %d"),
WSAGetLastError ());
MessageBox (NULL, szError, TEXT("Error"), MB_OK);
return FALSE;
}
// 創(chuàng)建一個(gè)綁定服務(wù)器的TCP/IP socket
if ((ServerSock = socket (AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
{
wsprintf (szError, TEXT("Allocating socket failed. Error: %d"),
WSAGetLastError ());
MessageBox (NULL, szError, TEXT("Error"), MB_OK);
return FALSE;
}
// 把服務(wù)器的socket的地址信息填入
destination_sin.sin_family = AF_INET;
// 通過主機(jī)名取得主機(jī)信息
if ((phostent = gethostbyname (HOSTNAME)) == NULL)
{
wsprintf (szError, TEXT("Unable to get the host name. Error: %d"),
WSAGetLastError ());
MessageBox (NULL, szError, TEXT("Error"), MB_OK);
closesocket (ServerSock);
return FALSE;
}
// 分配socket IP地址
memcpy ((char FAR *)&(destination_sin.sin_addr),
phostent->h_addr,
phostent->h_length);
// 轉(zhuǎn)化端口字段為大終點(diǎn)
destination_sin.sin_port = htons (PORTNUM);
// 建立一個(gè)到服務(wù)器socket的連接.
if (connect (ServerSock,
(PSOCKADDR) &destination_sin,
sizeof (destination_sin)) == SOCKET_ERROR)
{
wsprintf (szError,
TEXT("Connecting to the server failed. Error: %d"),
WSAGetLastError ());
MessageBox (NULL, szError, TEXT("Error"), MB_OK);
closesocket (ServerSock);
return FALSE;
}
// 向服務(wù)器發(fā)送信息
if (send (ServerSock, "To Server.", strlen ("To Server.") + 1, 0)
== SOCKET_ERROR)
{
wsprintf (szError,
TEXT("Sending data to the server failed. Error: %d"),
WSAGetLastError ());
MessageBox (NULL, szError, TEXT("Error"), MB_OK);
}
// 禁止服務(wù)器接收信息
shutdown (ServerSock, 0x01);
for (;;)
{
// 從服務(wù)器接收信息
iReturn = recv (ServerSock, szClientA, sizeof (szClientA), 0);
// 如果接收到服務(wù)器信息,顯示之
if (iReturn == SOCKET_ERROR)
{
wsprintf (szError, TEXT("No data is received, recv failed.")
TEXT(" Error: %d"), WSAGetLastError ());
MessageBox (NULL, szError, TEXT("Client"), MB_OK);
break;
}
else if (iReturn == 0)
{
MessageBox (NULL, TEXT("Finished receiving data"), TEXT("Client"),
MB_OK);
break;
}
else
{
// 把ASCII碼字符串轉(zhuǎn)換成Unicode碼字符串
for (index = 0; index <= sizeof (szClientA); index++)
szClientW[index] = szClientA[index];
// 顯示從服務(wù)器接收到的字符串
MessageBox (NULL, szClientW, TEXT("Received From Server"), MB_OK);
}
}
// 禁止服務(wù)器發(fā)送信息
shutdown (ServerSock, 0x00);
// 關(guān)閉服務(wù)器socket.
closesocket (ServerSock);
WSACleanup ();
return TRUE;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -