Home C/C++ Windows Socket异步编程
//Server

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <conio.h>
#include <winsock.h>

#define MAX_SIZE 1024
#define SERVICEPORT 7777

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

typedef struct 
{
 struct sockaddr_in Address;
 SOCKET Socket;
}ClientSocket;

bool sendflag=false;
char SendBuff[MAX_SIZE];

DWORD WINAPI Input(PVOID Parameter)
{
 while(true)
 {
  fflush(stdin);
  gets(SendBuff);
  sendflag=true;
 }
 return 0;
}

DWORD WINAPI New_Client(PVOID Parameter)
{
 ClientSocket CS=*(ClientSocket *)Parameter;
 struct timeval timeout;
 fd_set readfd,writefd;
 char RecvBuff[MAX_SIZE];

    timeout.tv_sec=0;
 timeout.tv_usec=500;

 while (true)
 {
  FD_ZERO(&readfd);
  FD_ZERO(&writefd);
  FD_SET(CS.Socket,&readfd);
  FD_SET(CS.Socket,&writefd);

  if(select(-1,&readfd,&writefd,NULL,&timeout)>0)
  {
   if(FD_ISSET(CS.Socket,&readfd))
   {
    memset(RecvBuff,NULL,sizeof(RecvBuff));
    if(recv(CS.Socket,RecvBuff,sizeof(RecvBuff),0)<=0)
    {
     printf("客户端%s断开连接。\n",inet_ntoa(CS.Address.sin_addr));
     return -1;
    }
    printf("来自%s的消息:\n%s\n",inet_ntoa(CS.Address.sin_addr),RecvBuff);
   }
   if(FD_ISSET(CS.Socket,&writefd))
   {
    if(sendflag)
    {
     sendflag=false;
     if(send(CS.Socket,SendBuff,sizeof(SendBuff),0)<=0)
     {
      printf("客户端%s断开连接。\n",inet_ntoa(CS.Address.sin_addr));
          return -1;    
     }
     memset(SendBuff,NULL,sizeof(SendBuff));
    }
   }
  }
 }

 return 0;
}

int main(int argc,char *argv[])
{
 ClientSocket CS;
 WSADATA wsa;
 struct sockaddr_in ServerAddress;
 SOCKET ServerSocket=INVALID_SOCKET;
 int AddressLength;
 HANDLE hThread;

 memset(&ServerAddress,NULL,sizeof(ServerAddress));
 ServerAddress.sin_family=AF_INET;
 ServerAddress.sin_addr.s_addr=INADDR_ANY;
 ServerAddress.sin_port=htons(SERVICEPORT);
 
 if(WSAStartup(MAKEWORD(2,2),&wsa)!=0)
 {
  printf("Socket初始化失败。\n");
  getch();
  return -1;
 }
 if((ServerSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET)
 {
  printf("创建套接字失败。\n");
  getch();
  return -1;
 }
 if(bind(ServerSocket,(struct sockaddr *)&ServerAddress,sizeof(ServerAddress))!=0)
 {
  printf("绑定本地地址失败。\n");
  getch();
  return -1;
 }
 if(listen(ServerSocket,SOMAXCONN)!=0)
 {
  printf("套接字转被动模式失败。\n");
  getch();
  return -1;
 }
 printf("The service started!\n");
 AddressLength=sizeof(CS.Address);
 CloseHandle((hThread=CreateThread(NULL,0,Input,NULL,0,NULL)));
 while(true)
 {
  memset(&CS,NULL,sizeof(ClientSocket));
  CS.Socket=accept(ServerSocket,(struct sockaddr *)&CS.Address,&AddressLength);
  CloseHandle((hThread=CreateThread(NULL,0,New_Client,(PVOID)&CS,0,NULL)));
  Sleep(1);
 }

 return 0;
}

 

 

 

 

///////////////////////////////////////////////////////////////////////////////////////////////////////////

//Client

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <conio.h>
#include <winsock.h>

#define MAX_SIZE 1024
#define SERVICEPORT 7777
#define IPADDRESS "127.0.0.1"

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

bool sendflag=false;
char SendBuff[MAX_SIZE];

DWORD WINAPI Input(PVOID Parameter)
{
    while(true)
    {
        fflush(stdin);
        gets(SendBuff);
        sendflag=true;
    }
    return 0;
}

int main(int argc,char *argv[])
{
    WSADATA wsa;
    struct sockaddr_in ServerAddress;
    SOCKET ServerSocket=INVALID_SOCKET;
    HANDLE hThread;
    char RecvBuff[MAX_SIZE];
    fd_set readfd,writefd;
    struct timeval timeout;

    timeout.tv_sec=0;
    timeout.tv_usec=500;

    memset(&ServerAddress,NULL,sizeof(ServerAddress));
    ServerAddress.sin_family=AF_INET;
    ServerAddress.sin_addr.s_addr=inet_addr(IPADDRESS);
    ServerAddress.sin_port=htons(SERVICEPORT);

    if(WSAStartup(MAKEWORD(2,2),&wsa)!=0)
    {
        printf("Socket初始化失败。\n");
        getch();
        return -1;
    }
    if((ServerSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET)
    {
        printf("创建套接字失败。\n");
        getch();
        return -1;
    }
    if(connect(ServerSocket,(struct sockaddr *)&ServerAddress,sizeof(ServerAddress))!=0)
    {
        printf("连接失败。\n");
        getch();
        return -1;
    }
    printf("连接成功。\n");
    CloseHandle((hThread=CreateThread(NULL,0,Input,NULL,0,NULL)));   //启动输入线程。

    while(true)
    {
        FD_ZERO(&readfd);
        FD_ZERO(&writefd);
        FD_SET(ServerSocket,&readfd);
        FD_SET(ServerSocket,&writefd);

        if(select(-1,&readfd,&writefd,NULL,&timeout)<=0) continue;
        if(FD_ISSET(ServerSocket,&readfd))
        {
            memset(RecvBuff,NULL,sizeof(RecvBuff));
            if(recv(ServerSocket,RecvBuff,sizeof(RecvBuff),0)<=0)
            {
                printf("与服务端断开连接。\n");
                getch();
                return -1;
            }
            printf("来自服务端的消息:\n%s\n",RecvBuff);
        }
        if(FD_ISSET(ServerSocket,&writefd))
        {
            if(sendflag)
            {
                sendflag=false;
                if(send(ServerSocket,SendBuff,sizeof(SendBuff),0)<=0)
                {
                    printf("与服务端断开连接。\n");
                    getch();
                    return -1;
                }
                memset(SendBuff,NULL,sizeof(SendBuff));
            }
        }
    }

    return 0;
}

0 comment

You may also like

Leave a Comment