1. 程式人生 > >TCP Socket客戶端程式設計(C++)

TCP Socket客戶端程式設計(C++)

程式碼來源:《Windows網路程式設計》(羅莉琴,詹祖橋 主編)(如造成任何不便,請聯絡我刪除)

// TcpClient.cpp : 定義控制檯應用程式的入口點。
//

#include "stdafx.h"
#include <winsock2.h>
#include <string>
#include <iostream>

#pragma comment(lib,"ws2_32.lib")

#define BUF_SIZE 64 //緩衝區大小


int _tmain(int argc, _TCHAR* argv[])
{
	WSADATA wsd;//用於初始化Windows Socket
	SOCKET sHost;//與伺服器進行通訊的Socket
	SOCKADDR_IN servAddr;//伺服器地址
	char buf[BUF_SIZE];//用於接受資料緩衝區
	int retVal;//呼叫各種Socket函式的返回值

	//---------初始化Socket-------------------
	if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0)
	{
		printf("WSAStartup failed !\n");
		return -1;
	}

	//--------------建立Socket----------------------------
	sHost = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//(指定協議的地址家族,指定套接字的型別,套接字使用的協議)
	if (INVALID_SOCKET == sHost)
	{
		printf("socket failed !\n");
		WSACleanup();
		return -1;
	}

	//----------設定伺服器的Socket地址---------------------
	servAddr.sin_family = AF_INET;
	servAddr.sin_port = htons(9990);
	servAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);

	int sServerAddlen = sizeof(servAddr);

	//--------------連線到伺服器-----------------------------
	retVal = connect(sHost,(LPSOCKADDR)&servAddr,sizeof(servAddr));
	if (SOCKET_ERROR == retVal)
	{
		printf("connect failed!\n");
		closesocket(sHost);
		WSACleanup();
		return -1;
	}

	//資訊互動
	while (true)
	{
		//向伺服器傳送資料
		printf("Please input a string to send:");
		std::string str;
		std::getline(std::cin,str);
		ZeroMemory(buf,BUF_SIZE);
		strcpy_s(buf,str.c_str());
		retVal = send(sHost,buf,strlen(buf),0);
		if (SOCKET_ERROR == retVal)
		{
			printf("send failed!\n");
			closesocket(sHost);
			WSACleanup();
			return -1;
		}

		//接收伺服器回傳的資料
		retVal = recv(sHost,buf,sizeof(buf)+1,0);
		printf("Recv From Server:%s\n",buf);

		if (strcmp(buf, "quit") == 0)
		{
			printf("quit!\n");
			break;
		}
	}

	//-----------釋放資源------------------
	closesocket(sHost);
	WSACleanup();

	system("pause");


	return 0;
}