⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 simpletcpserversrc.cpp

📁 <Visual C++ 网络程序设计实例详解>配套源码
💻 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 + -