栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

Winsock2 简单tcp client示例程序

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Winsock2 简单tcp client示例程序

C程序,事件接收、重叠发送

:回传接收到的数据

#undef UNICODE

#include 
#include 
#include 
#include 

// link with Ws2_32.lib
#pragma comment (lib, "Ws2_32.lib")

#define AMOUNT_TO_READ 1024

SOCKADDR_IN RemoteADDRinf;
WSAEVENT ClientNetEvent[WSA_MAXIMUM_WAIT_EVENTS];
DWORD  ClientEventTotal=0;
char recvbuf[AMOUNT_TO_READ];

int __cdecl main(int argc, char argv)
{

    WSADATA wsaData;
    int iResult;
	WSAEVENT ConnEvent;
	WSAOVERLAPPED SendOverlapped={0};
	SOCKET sock = INVALID_SOCKET;
	DWORD Index=0;
	int fConnectDone=0;
	int fConnectFlag=0;
    ClientEventTotal=0;
	WSANETWORKEVENTS NetworkEvents;
	DWORD RecvBytes=0;
    
	WSABUF sendbuf;
    DWORD SendBytes=0;
    DWORD err=0;
    DWORD Flags=0;


    //Initialize Winsock
    iResult = WSAStartup(MAKEWORd(2, 2), &wsaData);
    if (iResult != 0) {
        printf("WSAStartup failed: %dn", WSAGetLastError());
        return 0;
    }

	SendOverlapped.hEvent = WSACreateEvent();
    if (SendOverlapped.hEvent == NULL)
		printf("WSACreateEvent failed: %d n", WSAGetLastError());

    sock = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);
    if (sock == INVALID_SOCKET)
        printf("WSASocket failed: %dn", WSAGetLastError());

	RemoteADDRinf.sin_family = AF_INET;
	RemoteADDRinf.sin_addr.s_addr = inet_addr("192.168.1.7");
	RemoteADDRinf.sin_port = htons(2000);


	ClientNetEvent[ClientEventTotal]= WSACreateEvent();

	if (ClientNetEvent[ClientEventTotal] == WSA_INVALID_EVENT)
        printf("WSACreateEvent failed: %dn", WSAGetLastError());

    iResult=WSAEventSelect(sock, ClientNetEvent[ClientEventTotal],FD_ConNECT|FD_READ|FD_CLOSE);
    if (iResult == SOCKET_ERROR)
        printf("WSAEventSelect failed: %dn", WSAGetLastError());

     ClientEventTotal++;

    iResult=WSAConnect(sock,&RemoteADDRinf,sizeof(struct addrinfo),NULL,NULL,NULL,NULL);
    if (iResult != SOCKET_ERROR)
        printf("WSAConnect failed: %dn", WSAGetLastError());

    else
		{
          if (WSAEWOULDBLOCK == WSAGetLastError())
	     {
		   while(!fConnectFlag)
		   {


		     Index = WSAWaitForMultipleEvents(ClientEventTotal,ClientNetEvent,FALSE,WSA_INFINITE,FALSE);

			 switch(Index)
             {
		      case WSA_WAIT_TIMEOUT:
			  {
				  printf("WSAWaitForMultipleEvents WSA_WAIT_TIMEOUT n");
				  fConnectFlag=1;
			  }
              break;
		      case WSA_WAIT_FAILED:
			  {
                  printf("WSAWaitForMultipleEvents WSA_WAIT_FAILED n");
				  fConnectFlag=1;

			  }
              break;
              default:

				 WSAEnumNetworkEvents(sock, ClientNetEvent[Index - WSA_WAIT_EVENT_0], &NetworkEvents);
                 WSAResetEvent(ClientNetEvent[Index - WSA_WAIT_EVENT_0]);

			     switch(NetworkEvents.lNetworkEvents)
				 {
				   case FD_CONNECT:
				   {
                    if (NetworkEvents.iErrorCode[FD_CONNECT_BIT] != 0)
						{
						  printf("connect remote service failed= %d n",NetworkEvents.iErrorCode[FD_CONNECT_BIT]);
                          //continue;
						  fConnectFlag=1;
						}
						else
						{
				          printf("connect remote service successful n");
	                      fConnectFlag=1;
						  fConnectDone=1;
				        }

				   }
                   break;
				   default:
				   printf("no FD_ConNECT  n");
				   break;
				 }

		      break;

			  }
		    }
	      }

		  else
		  {
		  }
	     }

    //system("pause");

		   while(fConnectDone)
		   {

			 Index = WSAWaitForMultipleEvents(ClientEventTotal,ClientNetEvent,FALSE,0,FALSE);

			 switch(Index)
             {
		      case WSA_WAIT_TIMEOUT:
			  {
				  //printf("WSAWaitForMultipleEvents WSA_WAIT_TIMEOUT n");
				  //fConnectDone=1;
			  }
              break;
		      case WSA_WAIT_FAILED:
			  {
                  printf("WSAWaitForMultipleEvents WSA_WAIT_FAILED n");
				  //fConnectDone=1;
			  }
              break;
              default:

                 //printf("connect remote service Index = %d n",Index);

				 WSAEnumNetworkEvents(sock, ClientNetEvent[Index - WSA_WAIT_EVENT_0], &NetworkEvents);
                 WSAResetEvent(ClientNetEvent[Index - WSA_WAIT_EVENT_0]);

			     switch(NetworkEvents.lNetworkEvents)
				 {
				   case FD_READ:
				   {
                    if (NetworkEvents.iErrorCode[FD_READ_BIT] != 0)
						{
						  printf("read data failed= %d n",NetworkEvents.iErrorCode[FD_READ_BIT]);
                          //continue;
						}
						else
						{

						  iResult = recv(sock, recvbuf, AMOUNT_TO_READ, 0);
                          if(iResult>0)
						  {
						  printf("read data: %s n",recvbuf);
						  RecvBytes=iResult;
						  //fConnectDone=0;
						  //WSASendDisconnect(sock,NULL);
						  }
					      else
						  {
						    printf("client close n");
	                        fConnectDone=0;
						  }
				        }
				   }
                   break;

                   case FD_CLOSE:
				   {
                       if (NetworkEvents.iErrorCode[FD_CLOSE_BIT] != 0)
						{
                         printf("close failed= %d n",NetworkEvents.iErrorCode[FD_CLOSE_BIT]);

						}

						else
						{
							printf("server close.......... n");
							fConnectDone=0;

						}

				   }
                   break;

				   default:
				   printf("no FD_READ  n");
				   break;
				 }

		      break;
			  }


/
        if(RecvBytes>0)
	   {

        sendbuf.len=RecvBytes;
        sendbuf.buf=recvbuf;

        iResult = WSASend(sock,&sendbuf, 1,
                     NULL, 0, &SendOverlapped, NULL);
        if ((iResult == SOCKET_ERROR) &&
            (WSA_IO_PENDING != (err = WSAGetLastError()))) {
            printf("WSASend failed with error: %dn", err);
			RecvBytes=0;
            break;
        }

        iResult = WSAWaitForMultipleEvents(1, &SendOverlapped.hEvent, FALSE, 2000,
                                      FALSE);
        if (iResult == WSA_WAIT_FAILED) {
            printf("WSAWaitForMultipleEvents failed with error: %dn",
                   WSAGetLastError());
				   RecvBytes=0;
            break;
        }

        iResult = WSAGetOverlappedResult(sock, &SendOverlapped, &SendBytes,
                                    FALSE, &Flags);
        if (iResult == FALSE) {
            printf("WSASend failed with error: %dn", WSAGetLastError());
			RecvBytes=0;
            break;
        }

        printf("Wrote %d bytesn", SendBytes);

        WSAResetEvent(SendOverlapped.hEvent);
		RecvBytes=0;
	   }


	}


    WSACloseEvent(SendOverlapped.hEvent);
    closesocket(sock);
	while(ClientEventTotal)
	{

	  WSACloseEvent(ClientNetEvent[ClientEventTotal]);
	  ClientEventTotal--;
    }
    freeaddrinfo(&RemoteADDRinf);

    WSACleanup();

    return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/630657.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号