精华内容
下载资源
问答
  • MinGW WinSockets 编程

    千次阅读 2015-08-05 09:53:51
    前言: 大一的时候一个学长给我推荐MinGW(Minimalist GNUfor Windows) ...最近需要写一个简单的winsockets Client 来测试服务器,发现编译问题。 客户端代码: #include #include using namespace std; #p

    前言:

    大一的时候一个学长给我推荐MinGW(Minimalist GNUfor Windows) Developer Studio,后来就一直用了下去,感觉比VC++和DEV C好用,比VS更轻量级吧。

    最近需要写一个简单的winsockets Client 来测试服务器,发现编译问题。

    客户端代码:

    #include <iostream>
    #include <winsock2.h>
    using namespace std;
    #pragma comment(lib, "ws2_32.lib")
    #define PORT 5154
    #define IP_ADDRESS "127.0.0.1"
    
    int main(int argc, char * argv[])
    {
    	WSADATA Ws;
    	SOCKET ClientSocket;
    	struct sockaddr_in ServerAddr;
    	int Ret = 0;
    	int AddrLen = 0;
    	HANDLE hThread = NULL;
    	char SendBuffer[MAX_PATH];
    	if (WSAStartup(MAKEWORD(2, 2), &Ws) != 0)
    	{
    		cout << "Init Windows Socket Failed::" << GetLastError() << endl;
    		return -1;
    	}
    	
    	ClientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    	if (ClientSocket == INVALID_SOCKET)
    	{
    		cout << "Create Socket Failed::" << GetLastError() << endl;
    		return -1;
    	}
    
    	ServerAddr.sin_family = AF_INET;
    	ServerAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS);
    	ServerAddr.sin_port = htons(PORT);
    	memset(ServerAddr.sin_zero, 0x00, 8);
    
    	Ret = connect(ClientSocket, (struct sockaddr*)&ServerAddr, sizeof(ServerAddr));
    	if (Ret == SOCKET_ERROR)
    	{
    		cout << "Connect Error::" << GetLastError() << endl;
    		return -1;
    	}
    	while (true)
    	{
    		cout << "Please input Message:"<<endl;
    		cin.getline(SendBuffer, sizeof(SendBuffer));
    		Ret = send(ClientSocket, SendBuffer, (int)strlen(SendBuffer), 0);
    		if (Ret == SOCKET_ERROR)
    		{
    			cout << "Send Info Error::" << GetLastError() << endl;
    			break;
    		}
    	}
    
    	closesocket(ClientSocket);
    	WSACleanup();
    
    	return 0;
    }
    简单分析一下代码:

    1.WSAStartup完成Winsocket服务初始化

    2.创建套接字

    3.设置服务器网络参数

    4.发起连接

    5.发送数据

    6.关闭套接字关闭Winsockets服务

    这里出现的问题,在MinGW Studio下编译通过但是在Link(链接)的时候会报错:

    undefined reference to `WSAStartup@8'

    undefined reference to xxxxxxx

    网上有这样的解决方案

    在代码前面加上:

    #pragma comment(lib, "ws2_32.lib")

    发现并没有什么作用。

    后来得知,MinGW没有#pragma comment这样的预处理命令。


    最终解决办法

    project -> settings -> links -> Extra linking options 

    加上:-lws2_32



    展开全文
  • select模式的思想 创建FD_SET fd_all,并初始化FD_ZERO(&fd_all); Step1 初始时: Step2 加入一个套接字之后,比如FD_SET(sServer,&...//////////////////////////////////////////////...

    select模式的思想

    创建FD_SET fd_all,并初始化FD_ZERO(&fd_all);

    Step1  初始时: 

    Step2   加入一个套接字之后,比如FD_SET(sServer,&fd_all);

    Step3   调用select函数之后,有两种情况

    上述的select假设是在非阻塞的情况下。由图示可以看出, select对FD_SET的结构进行了动态改变,没有变化的会置为0,有变化的会保持为1,这就是select的思想。

    //

    保持FD_SET的状态

    假设有1,2,3,4四个标号的套接字加入FD_SET

    //伪码
    FD_SET(1,&fd_all);
    FD_SET(2,&fd_all);
    FD_SET(3,&fd_all);
    FD_SET(4,&fd_all);
    for(;;)
    {
        ...
        select(0,&fd_all,0,NULL,NULL);
        ...
    }

    在进行选择之后,有些套接字可能暂时没有数据收发就被select函数过滤掉了,所以要保持套接字的状态,模式如下:

    //保持套接字状态的方法示例
    
        while(true)
        {
            fd_read=fd_all;
            fd_write=fd_all;
            select(0,&fd_read,0,NULL,NULL);//①阻塞;
    
            for(UINT i=0;i<fd_all.fd_count;i++)
            {
                if(FD_ISSET(fd_all.fd_array[i],&fd_read))
                {
                    if(fd_all.fd_array[i]==sServer)//
                    {
                        sockaddr_in addrClient;
                        int addrClientlen = sizeof(addrClient);
                        sClient = accept(sServer,(sockaddr FAR*)&addrClient, &addrClientlen);//
    
                        FD_SET(sClient,&fd_all);//
                    }
                    else //⑤ 收发数据
                    {
                        ZeroMemory(buf, BUF_SZIE);
                        retVal = recv(fd_all.fd_array[i], buf, BUF_SZIE-1, 0);//
                        if (SOCKET_ERROR == retVal)
                        {
                            printf("recv failed!\n");        
                            closesocket(sServer);
                            closesocket(sClient);    //关闭套接字        
                            WSACleanup();
                            return -1;
                        }
                        printf("%s\n", buf);
                    }
                }
            }

     

    版本一(有点问题,需要修正):

    /**************************************************************************************************************

    2018/10/9号进行修正:

    原因:

    1. 在select轮询时,如果没有连接返回-1
    2. 在while循环时,需要Sleep(100),不然CPU空转太厉害导致CPU使用率上升!

    /**************************************************************************************************************

    #include <WinSock2.h>
    #include <iostream>
    
    #include <stdio.h>
    
    #pragma comment(lib,"ws2_32.lib")
    
    #define PORT 8000
    #define MSGSIZE 255
    #define SRV_IP "127.0.0.1"
    
    int g_nSockConn = 0;                //请求连接的数目
    
    struct ClientInfo
    {
        SOCKET sockClient;                //客户端套接字
        SOCKADDR_IN addrClient;            //客户端地址
    };
    
    ClientInfo g_Client[FD_SETSIZE];    //客户端套接字集合;
    DWORD WINAPI WorkThread(LPVOID lpParameter);
    
    int main(int argc, char *argv[])
    {
        WSADATA wsd;
        WSAStartup(MAKEWORD(2, 2), &wsd);
    
        SOCKET sockListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建套接字
        
        SOCKADDR_IN addrSrv;
        addrSrv.sin_addr.S_un.S_addr = inet_addr(SRV_IP);
        addrSrv.sin_family = AF_INET;
        addrSrv.sin_port = htons(PORT);
        bind(sockListen, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));//绑定
    
        listen(sockListen, 64);//监听
    
        DWORD dwThreadIDRecv = 0;
        DWORD dwThreadIDWrite = 0;
    
        HANDLE hand = CreateThread(NULL, 0, WorkThread, NULL, 0, &dwThreadIDRecv);//工作线程
        if (hand == NULL)
        {
            std::cout <<"创建线程失败!"<<std::endl;
            return -1;
        }
    
        SOCKET sockClient;
        SOCKADDR_IN addrClient;
        int nLenAddrClient = sizeof(SOCKADDR_IN);
    
        while (true)
        {
            sockClient = accept(sockListen, (SOCKADDR*)&addrClient, &nLenAddrClient);
            if (sockClient != INVALID_SOCKET)
            {
                g_Client[g_nSockConn].addrClient = addrClient;//保存客户端地址信息
                g_Client[g_nSockConn].sockClient = sockClient;
                g_nSockConn++;
            }
        }
        closesocket(sockListen);
        WSACleanup();
        return 0;
    }
    
    DWORD WINAPI WorkThread(LPVOID lpParameter)
    {
        std::cout << "线程开始执行...." << std::endl;
        FD_SET fdRead;
        int nRet = 0;        //记录发送或者接受的字节数
        
        TIMEVAL tv;            //设置超时等待时间
        tv.tv_sec = 1;
        tv.tv_usec = 0;
    
        char buf[MSGSIZE] = { '\0' };
    
        while (true)
        {
            FD_ZERO(&fdRead);
            for (int i = 0; i < g_nSockConn; i++)
            {
                FD_SET(g_Client[i].sockClient, &fdRead);
            }
    
            //只处理read事件,不过后面还是会有读写消息发送的
            nRet = select(0, &fdRead, NULL, NULL, &tv);
            std::cout << "g_nSockConn=" << g_nSockConn << std::endl;
            std::cout << "nRet=" << nRet << std::endl;
    
            if (nRet == -1)//没有连接或者没有读事件
            {
           Sleep(100);  //需睡眠
    continue; } for (int i = 0; i < g_nSockConn; i++) { std::cout << "已连接的套接字数目g_nSockConn=" << g_nSockConn << std::endl; Sleep(1000); if (FD_ISSET(g_Client[i].sockClient, &fdRead)) { nRet = recv(g_Client[i].sockClient, buf, sizeof(buf), 0); if (nRet == 0 || (nRet == SOCKET_ERROR && WSAGetLastError() == WSAECONNRESET)) { std::cout << "Client " << inet_ntoa(g_Client[i].addrClient.sin_addr) << "closed" <<std::endl; closesocket(g_Client[i].sockClient); if (i < g_nSockConn - 1) { //将失效的sockClient剔除,用数组的最后一个补上去 g_Client[i--].sockClient = g_Client[--g_nSockConn].sockClient; } } else { std::cout <<"客户端地址为:"<<inet_ntoa(g_Client[i].addrClient.sin_addr) << ": " << std::endl; std::cout << buf <<std::endl; strcpy_s(buf, "Hello!"); nRet = send(g_Client[i].sockClient, buf, strlen(buf) + 1, 0); g_nSockConn--; } } } } return 0; }

     版本二(正常运行):

    #include <stdio.h>
    #include "initSocket.h"
    CInitSock theSock; 
    int main()
    {
        USHORT nPort = 4567;
        SOCKET sListen = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        sockaddr_in sin;
        sin.sin_family = AF_INET;
        sin.sin_port = htons(nPort);
        sin.sin_addr.S_un.S_addr = INADDR_ANY;
        if (::bind(sListen, (sockaddr*)&sin, sizeof(sin)) == SOCKET_ERROR)
        {
            printf(" Failed bind() \n");
            return -1;
        }
        ::listen(sListen, 5);
    
        fd_set fdSocket;
        FD_ZERO(&fdSocket);
        FD_SET(sListen, &fdSocket);
        while (TRUE)
        {
            fd_set fdRead = fdSocket;
            int nRet = ::select(0, &fdRead, NULL, NULL, NULL);
            if (nRet > 0)
            {
                for (int i = 0; i < (int)fdSocket.fd_count; i++)
                {
                    if (FD_ISSET(fdSocket.fd_array[i], &fdRead))
                    {
                        if (fdSocket.fd_array[i] == sListen)
                        {
                            if (fdSocket.fd_count < FD_SETSIZE)
                            {
                                sockaddr_in addrRemote;
                                int nAddrLen = sizeof(addrRemote);
                                SOCKET sNew = ::accept(sListen, (SOCKADDR*)&addrRemote, &nAddrLen);
                                FD_SET(sNew, &fdSocket);
                                printf("接收到连接(%s)\n", ::inet_ntoa(addrRemote.sin_addr));
                            }
                            else
                            {
                                printf(" Too much connections! \n");
                                continue;
                            }
                        }
                        else
                        {
                            char szText[256];
                            int nRecv = ::recv(fdSocket.fd_array[i], szText, strlen(szText), 0);
                            if (nRecv > 0)          //  (2)可读 
                            {
                                szText[nRecv] = '\0';
                                printf("接收到数据:%s \n", szText);
                            }
                            else
                            {
                                printf("连接断开...!");
                                ::closesocket(fdSocket.fd_array[i]);
                                FD_CLR(fdSocket.fd_array[i], &fdSocket);
                            }
                        }
                    }
                }
            }
            else
            {
                printf(" Failed select() \n");
                break;
            }
        }
        return 0;
    }

     

    转载于:https://www.cnblogs.com/tinaluo/p/7698624.html

    展开全文
  • 占位## #include <WinSock2.h> #include <Windows.h> #include <StrSafe.h> #pragma comment(lib, "Ws2_32") #define WM_SOCKET WM_USER+1 //定义SOCKET...LRESULT CALLBACK WinProc(H...

    占位##

    #include <WinSock2.h>
    #include <Windows.h>
    #include <StrSafe.h>
    
    #pragma comment(lib, "Ws2_32")
    
    #define WM_SOCKET WM_USER+1 //定义SOCKET消息;
    
    LRESULT CALLBACK WinProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
        switch (uMsg)
        {
            case WM_SOCKET:
            {
                if(WSAGETSELECTERROR(lParam))
                {
                    shutdown(wParam, SD_BOTH);
                    closesocket(wParam);
                    return 0;
                }
    
                switch (WSAGETSELECTEVENT(lParam))
                {
                    case FD_ACCEPT:
                    {
                        SOCKET client = accept(wParam, NULL, NULL);
                        WSAAsyncSelect(client, hWnd, WM_SOCKET, FD_READ | FD_WRITE | FD_CLOSE);
                    }
                        break;
                    case FD_WRITE:
                        break;
                    case FD_READ:
                    {
                        CHAR szText[1024] = { 0 };
                        if (SOCKET_ERROR == recv(wParam, szText, 1024, 0))
                        {
                            shutdown(wParam, SD_BOTH);
                            closesocket(wParam);
                        }
                        else
                        {
                            CHAR szMsg[1100] = "接收数据:";
                            strcat_s(szMsg, sizeof(szMsg), szText);
                            MessageBoxA(hWnd, szMsg, "结果", MB_OK);
                        }
                    }
                        break;
                    case FD_CLOSE:
                        shutdown(wParam, SD_BOTH);
                        closesocket(wParam);
                        break;
                }
            }
            return 0;
            
            case WM_DESTROY:
                PostQuitMessage(0);
                return 0;
            default:
                return DefWindowProc(hWnd, uMsg, wParam, lParam);
        }
        return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, PSTR pcszCommand, int iShow)
    {
        TCHAR szAppName[] = TEXT("WSAAsyncSelect");
        WNDCLASSEX wndClsEx;
    
        wndClsEx.cbClsExtra = 0;
        wndClsEx.cbSize = sizeof(wndClsEx);
        wndClsEx.cbWndExtra = 0;
        wndClsEx.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
        wndClsEx.hCursor = LoadCursor(NULL, IDC_ARROW);
        wndClsEx.hIcon = LoadIcon(NULL, IDI_APPLICATION);
        wndClsEx.hIconSm = NULL;
        wndClsEx.hInstance = hInstance;
        wndClsEx.lpfnWndProc = WinProc;
        wndClsEx.lpszClassName = szAppName;
        wndClsEx.lpszMenuName = NULL;
        wndClsEx.style = CS_HREDRAW | CS_VREDRAW;
    
        if (!RegisterClassEx(&wndClsEx))
        {
            MessageBox(NULL, TEXT("注册窗口类失败,本程序需要在Windows NT系统上才能运行。"), TEXT("错误"), MB_OK | MB_ICONERROR);
            return 0;
        }
    
        HWND hWnd = CreateWindowEx(
            0,
            szAppName,
            szAppName,
            WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT,
            CW_USEDEFAULT,
            CW_USEDEFAULT,
            CW_USEDEFAULT,
            NULL,
            NULL,
            hInstance,
            NULL);
        if (NULL == hWnd)
        {
            MessageBox(NULL, TEXT("创建窗口失败"), TEXT("错误"), MB_OK | MB_ICONERROR);
            return 0;
        }
    
        ShowWindow(hWnd, iShow);
        UpdateWindow(hWnd);
    
        WSADATA wsaData;
        WSAStartup(WINSOCK_VERSION, &wsaData);
    
        SOCKET sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if (INVALID_SOCKET == sListen)
        {
            MessageBox(hWnd, TEXT("创建套接字失败"), TEXT("错误"), MB_OK | MB_ICONERROR);
            WSACleanup();
            return 0;
        }
    
        SOCKADDR_IN sin;
        USHORT uPort = 4567;
    
        ZeroMemory(&sin, sizeof(sin));
        sin.sin_family = AF_INET;
        sin.sin_port = htons(uPort);
        sin.sin_addr.S_un.S_addr = INADDR_ANY;
    
        if (SOCKET_ERROR == bind(sListen, (PSOCKADDR)&sin, sizeof(sin)))
        {
            MessageBox(hWnd, TEXT("绑定套接字失败"), TEXT("错误"), MB_OK | MB_ICONERROR);
            shutdown(sListen, SD_RECEIVE);
            closesocket(sListen);
            WSACleanup();
            return 0;
        }
    
        //将套接字设为窗口通知消息类型
        WSAAsyncSelect(sListen, hWnd, WM_SOCKET, FD_ACCEPT | FD_CLOSE);
        listen(sListen, 5);
    
        MSG msg;
        while (GetMessage(&msg, NULL, 0, 0))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    
        WSACleanup();
        return msg.wParam;
    }

     

    转载于:https://www.cnblogs.com/tinaluo/p/7699122.html

    展开全文
  • 初始化DLL之后,接着创建套接字,通过socket()和WSASocket()函数实现此功能。 SOCKET socket(  int af,  int type,  int protocol ...type:协议的套接字类型,有SOCK_STREAM、SOCK_DGRAM和SOCK_RA...

    初始化DLL之后,接着创建套接字,通过socket()和WSASocket()函数实现此功能。

    SOCKET socket(
      int af,
      int type,
      int protocol
    );
    • af:协议的地址家族。创建TCP或者UDP套接字时,该参数为AF_INET。
    • type:协议的套接字类型,有SOCK_STREAMSOCK_DGRAMSOCK_RAM 3种类型。
    • protocol:协议。指定的地址家族和套接字类型有多个数目时,使用该字段来取定一上特殊的传输。对于SOCKET_STREAM套接字类型,该字段为IPPROTO_TCP或者为0,对于SOCK_DGRAM套接字类型,该字段为IPPROTO_UDP或者为0。

    创建成功后,返回一个套接字句柄;调用失败则返回INVALID_SOCKET

    #代码示例#

    SOCKET s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    if(INVALID_SOCKET==s)
    {
        //失败;
    }

     

    转载于:https://www.cnblogs.com/tinaluo/p/7677002.html

    展开全文
  • loadrunner使用Winsockets协议

    千次阅读 2010-12-22 20:17:00
    一般情况下,winsocket可以实现任何c/s的测试。 很多的这种协议都是tcp协议的扩展,只是定义了数据格式和命令字等。 比如:smtp协议,就是定义了几个发送数据和接收数据的步骤,然后定义了每个步骤...
  • 在阻塞模式下,在I/O操作完成前,执行的操作函数将一直等候而不会立即返回,该函数所在的线程会阻塞在这里。相反,在非阻塞模式下,套接字函数立即返回,而不管I/O是否完成。 重点知识和思想: ...
  • 功能:向服务器端发送一个字符串,属于最简易的形式,一共需要4个主要步骤,初始化-建立套接字-连接服务器-发送数据 /************************************************************************ ...
  • ## 转载于:https://www.cnblogs.com/tinaluo/p/7698618.html
  • 基于VC的WinSock网络编程实用宝典

    千次阅读 2006-03-24 13:28:00
    基于VC的WinSock网络编程实用宝典来源: 天极网Windows Sockets是一套开放的、支持多种协议的Windows下的网络编程接口。现在的Winsock已经基本上实现了与... 在这个专辑中我整理在栏目中发表的关于WinSockets编程的文
  • <div><p>Hello, I have a problem, i programmed a class where construct a instance of WinSockets, then start the instance with a new thread, i tried to access to a property where i save a reference of ...
  • 在使用LoadRunner winsockets协议写脚本,遇到下面问题: 在接收到的查询数据库的结果中我要取红色部份用于下面的select recv buf60 769 "\x01\x00\x00\x01" "\bK" "\x00\x00\x02\x03" "def\tsystem_...
  • 昨天用winsockets写了一些代码,谁知道一直就是编译不过,出现2019 :无法解析的外部符号 错误。经搜索,发现时少了一个库文件ws2_32.lib,在新的08上要加入链接库 方法:项目>属性->配置属性->链接器->输入...
  • 9.5.1参照MFC AppWizard创建WinSockets程序 261 9.5.2 利用Windows Sockets API和第三方提供的类进行编程 262 9.6 串口通信用于遥控操作简例 262 第10章 计算机串口与其他设备通信编程实例 266 10.1通过串口收发短...
  • visual C++_Turbo C串口通信编程实践

    热门讨论 2010-07-30 09:14:24
    9.5.1参照MFC AppWizard创建WinSockets程序 9.5.2 利用Windows Sockets API和第三方提供的类进行编程 9.6串口通信用于遥控操作简例 第10章 计算机串口与其它通信协议设备的联接 10.1 串口与其它通信协议模块的...

空空如也

空空如也

1 2
收藏数 21
精华内容 8
关键字:

winsockets