代码来源:《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;
}