项目实战Small example:C:Socket之Tcp编程 [控制台程序]
==================================================================
编辑环境:win10_x64 /VS2015
项目名称:C:Small example:C:Socket之Tcp编程 [控制台程序]
项目简介:Socket的TCP编程,在这里运行了一个win32控制台的程序,一个服务器,一个客户端之间的通信,对socket编程的一个加深入门理解,(之前也在Qt5,使用widget(在该系列文章中)编程了一个带UI的聊天小程序的)。
项目功能:只能够单方面的又服务器向着发送消息,客户端向服务端发送消息。可以发送多个消息并且将其显示出来。
其他:如果有知道,知道如何客户端向服务端发送消息,修改我里面的两个while(true){}里面的send和recv的,欢迎在下面留言,
==================================================================
项目运行效果:
==================================================================
项目思路分析:
==================================================================
项目不足之处:
没有对服务器对客户端之间发送消息,也没有使用到多线程,每次使用一个while(1){}来循环监测,看看有没有新的客户机进行连接,有的话们就创建一个新的线程,让他们之间能够进行通信,类似群聊一样。将会在后续学习的socket之中对这两个进行生深入地学习。其中,并发服务器的思路如下图:
==================================================================
项目主要源码:
服务器端:
// tcp_server.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#pragma comment(lib, "WS2_32")
int main()
{
system("title TCP服务器");
//检查协议栈是否可使用
WSADATA wsaData;
if (0 != WSAStartup(MAKEWORD(2, 2), &wsaData))
{
printf("error: WSAStartup() faile...\n");
return -1;
}
printf("服务器已经启动...\n");
//创建服务器端的套接字
SOCKET SockServer = socket(AF_INET, SOCK_STREAM, 0);
//建立服务器端的地址
SOCKADDR_IN addrSrever;
addrSrever.sin_family = AF_INET;
addrSrever.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSrever.sin_port = htons(2000);
//绑定套接字
if (SOCKET_ERROR == bind(SockServer, (SOCKADDR *)&addrSrever, sizeof(SOCKADDR)))
{
printf("error: bind() faile...:%d\n", WSAGetLastError());
return -1;
}
//监听
if (SOCKET_ERROR == listen(SockServer, 5))
{
printf("error: listen() faile...:%d\n", WSAGetLastError());
return -1;
}
printf("服务器监听中...\n");
//初始化客户地址长度参数
int len = sizeof(SOCKADDR);
SOCKADDR_IN addrClient;
char szSendBuf[2048] = "已经连接服务器成功";
char szRecvBuf[2048] = "";
//等待客户的连接请求,接收请求连接
SOCKET sockAccept = accept(SockServer, (SOCKADDR *)&addrClient, &len);
if (INVALID_SOCKET == sockAccept)
{
printf("error: accept() faile...:%d\n", WSAGetLastError());
return -1;
}
//输出连接成功的客户IP和端口号
printf("Accepted client IP:[%s], prot:[%d]\n", inet_ntoa(addrClient.sin_addr), ntohs(addrClient.sin_port));
//进入一个无限循环,
while (true)
{
recv(sockAccept, szRecvBuf, sizeof(szRecvBuf), 0);
printf("客户端:%s \n", szRecvBuf);
/*printf(">>");
scanf("%s", szSendBuf);
send(SockServer, szSendBuf, strlen(szSendBuf) + 1, 0);*/
}
//关闭套接字
closesocket(SockServer);
//关闭协议栈的检查
WSACleanup();
return 0;
}
客户端:
// tcp_client.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#pragma comment(lib, "WS2_32")
int main()
{
system("title TCP客户端");
//检查协议栈是否可使用
WSADATA wsaData;
if (0 != WSAStartup(MAKEWORD(2, 2), &wsaData))
{
printf("error: WSAStartup() faile...\n");
return -1;
}
//创建客户端的套接字
SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);
if(INVALID_SOCKET == sockClient)
{
printf("error: socket() faile...:%d\n", WSAGetLastError());
return -1;
}
SOCKADDR_IN addrServer;
addrServer.sin_family = AF_INET;
char szInIP[30] = "";
printf("请输入对方IP地址(同局域网):eg:127.0.0.1\nIP>>");
scanf("%s", szInIP);
addrServer.sin_addr.S_un.S_addr = inet_addr(szInIP);
addrServer.sin_port = htons(2000);
//请求与服务器建立TCP连接
if (INVALID_SOCKET == connect(sockClient, (SOCKADDR *)&addrServer, sizeof(SOCKADDR)))
{
printf("error: connect() faile...:%d\n", WSAGetLastError());
return -1;
}
char szRecvBuf[2048] = "";
char szSendBuf[2048] = "客户端已经连接成功";
while (true)
{
printf(">>");
scanf("%s", szSendBuf);
send(sockClient, szSendBuf, strlen(szSendBuf) + 1, 0);
/*recv(sockClient, szRecvBuf, sizeof(szRecvBuf), 0);
printf("客户端:%s \n", szRecvBuf);*/
}
closesocket(sockClient);
WSACleanup();
return 0;
}