您的位置:首页 > 编程语言 > C语言/C++

Socket代码小例子——C++版

2016-03-06 20:49 543 查看
服务器端:

// HelloWorld2.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")

#define BUF_SIZE 64

int main(int argc, _TCHAR* argv[])
{
WSADATA wsd;					//WSADATA变量, 用于初始化Windows Sockets
SOCKET sServer;					//服务器Socket,用于监听客户端请求
SOCKET sClient;					//客户端Socket,用于实现与客户端通信
int retVal;						//调用各种Socket函数返回值
char buf[BUF_SIZE];				//用于接收客户端数据的缓冲区

//初始化Winsock2.2
WORD sockVersion = MAKEWORD(2, 2);
if (WSAStartup(sockVersion, &wsd) != 0)
{
printf("WSAStartup 无法初始化!");
return 1;
}

//显示wsaData中的数据
printf("Version: %d.%d\n", LOBYTE(wsd.wVersion), HIBYTE(wsd.wVersion));
printf("High Version: %d.%d\n", LOBYTE(wsd.wHighVersion), HIBYTE(wsd.wHighVersion));
printf("Description: %s\n", wsd.szDescription);
printf("System Status: %s\n", wsd.szSystemStatus);

//创建TCP Socket
sServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sServer == INVALID_SOCKET)
{
printf("socket error!");
}

//定义服务器地址
struct sockaddr_in addr;
addr.sin_family = AF_INET;						//地址家族
addr.sin_port = htons(9990);					//端口
addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);	//地址

//绑定到Socket
retVal = bind(sServer, (SOCKADDR*)&addr, sizeof(struct sockaddr_in));
if (retVal == SOCKET_ERROR)
{
printf("bind error!\n");
closesocket(sServer);
WSACleanup();
return 1;
}

//监听
retVal = listen(sServer, 1);
if (retVal == SOCKET_ERROR)
{
printf("listen error!\n");
closesocket(sServer);
WSACleanup();
return 1;
}

printf("TCPSocket Server start...\n");

sockaddr_in addrClient;							//客户端地址
int addrClientlen = sizeof(addrClient);
sClient = accept(sServer, (sockaddr FAR*)&addrClient, &addrClientlen);
if (sClient == INVALID_SOCKET)
{
printf("accept error!\n");
closesocket(sServer);
WSACleanup();
return 1;
}

while (true)
{
ZeroMemory(buf, BUF_SIZE);
retVal = recv(sClient, buf, BUFSIZ, 0);
if (SOCKET_ERROR == retVal)
{
printf("recv error!\n");
closesocket(sServer);
closesocket(sClient);
WSACleanup();
return -1;
}

//获取当前系统时间
SYSTEMTIME st;
GetLocalTime(&st);
char sDateTime[30];
sprintf_s(sDateTime, "%4d-%2d-%2d  %2d:%2d:%2d", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
//printf("%s, Rev From Client [%s:%d] :%s\n", sDateTime, inet_ntoa(addrClient.sin_addr), addrClient.sin_port, buf);
printf("%s, Rev From Client [%d] :%s\n", sDateTime, addrClient.sin_port, buf);
//如果客户端发送“quit”字符串,则服务器退出
if (strcmp(buf, "quit") == 0)
{
retVal = send(sClient, "quit", strlen("quit"), 0);
break;
}
//否则向客户端发送回显字符串
else
{
char msg[BUF_SIZE];
sprintf_s(msg, "Message received - %s", buf);
retVal = send(sClient, msg, strlen(msg), 0);
if (SOCKET_ERROR == retVal)
{
printf("send error!\n");
closesocket(sServer);
closesocket(sClient);
WSACleanup();
return -1;

}
}
}

closesocket(sServer);
closesocket(sClient);
//最后做一些清理工作
if (WSACleanup() == SOCKET_ERROR)
{
printf("WSACleanup 出错!");
}
system("pause");
return 0;
}


客户端:

// TcpSocketClient.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <string>
#include <iostream>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")

#define BUF_SIZE 64

int main(int argc, _TCHAR* argv[])
{
WSADATA wsd;											//WSADATA变量, 用于初始化Windows Sockets
SOCKET sHort;											//与服务器通信的Sockets
SOCKADDR_IN servAddr;									//服务器地址
int retVal;												//调用各种Socket函数返回值
char buf[BUF_SIZE];										//用于接收客户端数据的缓冲区

//初始化Winsock2.2
WORD sockVersion = MAKEWORD(2, 2);
if (WSAStartup(sockVersion, &wsd) != 0)
{
printf("WSAStartup 无法初始化!");
return -1;
}

//显示wsaData中的数据
printf("Version: %d.%d\n", LOBYTE(wsd.wVersion), HIBYTE(wsd.wVersion));
printf("High Version: %d.%d\n", LOBYTE(wsd.wHighVersion), HIBYTE(wsd.wHighVersion));
printf("Description: %s\n", wsd.szDescription);
printf("System Status: %s\n", wsd.szSystemStatus);

//创建TCP Socket
sHort = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sHort == INVALID_SOCKET)
{
printf("socket error!\n");
WSACleanup();
return -1;
}

//定义服务器地址
servAddr.sin_family = AF_INET;									//地址家族
servAddr.sin_port = htons(9990);								//端口
servAddr.sin_addr.S_un.S_addr = inet_addr("192.168.1.102");		//地址http://jingyan.baidu.com/article/1709ad8097e5904634c4f03e.html

int sServerAddlen = sizeof(servAddr);							//计算地址的长度

//连接服务器
retVal = connect(sHort, (LPSOCKADDR)&servAddr, sizeof(servAddr));
if (retVal == SOCKET_ERROR)
{
printf("connect error!\n");
closesocket(sHort);
WSACleanup();
return -1;
}

while (true)
{
//向服务器发送数据
printf("Please input a string to send: ");
std::string str;
//接收输入的数据
std::getline(std::cin, str);
//将用户输入的数据复制到buf中
ZeroMemory(buf, BUF_SIZE);
strcpy(buf, str.c_str());
//向服务器发数据
retVal = send(sHort, buf, strlen(buf), 0);
if (SOCKET_ERROR == retVal)
{
printf("send error!\n");
closesocket(sHort);;
WSACleanup();
return -1;
}
//接收服务器回传数据
retVal = recv(sHort, buf, strlen(buf)+1, 0);
printf("Recv Form Server: %s\n", buf);

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

closesocket(sHort);
//最后做一些清理工作
if (WSACleanup() == SOCKET_ERROR)
{
printf("WSACleanup 出错!");
}
system("pause");
return 0;
}


源自《WIndows网络编程》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: