📄 simpletcpserversrc.cpp
字号:
// SimpleTcpServerSrc.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "SimpleTcpServerSrc.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// The one and only application object
CWinApp theApp;
using namespace std;
UINT ServerThread(LPVOID pParam)
{
cout << "Starting up TCP server\r\n";
// SOCKET实际上是一个unsigned int类型
SOCKET server;
// WSADATA结构将有WSAStartup函数来填充
WSADATA wsaData;
// 对TCP/IP 套接字来说,sockaddr_in结构指定了套接字的地址
// 其他协议使用相似的结构
sockaddr_in local;
// WSAStartup函数负责加载Winsock库的函数
// 第一个参数用来指定想要加载的Winsock库的版本
int wsaret=WSAStartup(0x101,&wsaData);
// 调用成功,WSAStartup函数返回0
// 失败的话,程序就退出
if(wsaret!=0)
{
return 0;
}
// 现在我们填充sockaddr_in结构
local.sin_family=AF_INET; // 地址家族Address family
local.sin_addr.s_addr=INADDR_ANY; // 要求使用当前主机配置的所有IP地址
local.sin_port=htons((u_short)20248); // 使用的端口
// socket函数用来创建我们的SOCKET
server=socket(AF_INET,SOCK_STREAM,0);
// 如果socket()函数调失败,我们退出
if(server==INVALID_SOCKET)
{
return 0;
}
// 为套接字关联本地地址的函数是bind.
// bind函数用在没有建立连接的套接字上,它的作用是绑定面向连接的或者无连接的套接字。
// 套接字被socket函数创建以后,存在于指定的地址家族里,但它是未命名的。
// bind函数通过安排一个本地名称到未命名的socket建立此socket的本地关联。
// 本地名称包含3个部分:主机地址、协议号(分别为UDP或TCP)和端口号。
if(bind(server,(sockaddr*)&local,sizeof(local))!=0)
{
return 0;
}
// listen函数设置套接字进入监听状态
// 为了接受连接,首先使用socket函数创建一个套接字,然后使用bind函数将它绑定到一个本地地址,
// 再用listen函数为到达的连接指定一个backlog,最后使用accept接受请求的连接。
// 函数的第二个参数是backlog值
if(listen(server,10)!=0)
{
return 0;
}
// 我们需要变量在保存客户套接字,下面是这些变量的定义
SOCKET client;
sockaddr_in from;
int fromlen=sizeof(from);
// 下面进入无限循环
while(true)
{
char temp[512];
// accept() 将接受到了的客户连接
client=accept(server,
(struct sockaddr*)&from,&fromlen);
sprintf(temp,"Your IP is %s\r\n",inet_ntoa(from.sin_addr));
// 我们简单的将这串字符发送给客户
send(client,temp,strlen(temp),0);
cout << "Connection from " << inet_ntoa(from.sin_addr) <<"\r\n";
// 关闭客户套接字
closesocket(client);
}
// closesocket()关闭套接字,并且释放套接字描述表
closesocket(server);
// 每一个对WSAStartup的调用必须对应一个对WSACleanup的调用,这个函数释放Winsock库
WSACleanup();
return 0;
}
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
cout << "Press ESCAPE to terminate program\r\n";
AfxBeginThread(ServerThread,0);
while(_getch()!=27);
return nRetCode;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -