TCP server demo

#include "stdafx.h"
#include "winsock2.h"
#pragma comment(lib,"WS2_32.lib")

#include <stdio.h>
#include <stdlib.h>

#define  DEFAULT_PORT 5150
#define  DEFAULT_BUFFER 4096

int iPort = DEFAULT_PORT;
BOOL bInterface = FALSE;
BOOL bRecvOnly = FALSE;

//Interface to Listen for clients on
char szAddress[128];

void usage()
{
 printf("usage:server [-p:x] [-i:IP] [-o]/n/n");
 printf("      -p:x     port number to listen on/n");
 printf("      -o        don't echo the data back/n/n");
 ExitProcess(1);
}

void ValidateArgs(int argc, char** argv)
{
 int i;

 for(i=1;i<argc;i++)
 {
  if((argv[i][0] == '-') || (argv[i][0] == '/'))
  {
   switch(tolower(argv[i][1]))
   { 
                  
   case 'p':
    iPort = atoi(&argv[i][3]);
    break;
   case 'i':
    bInterface = TRUE;
    if(strlen(argv[i]) > 3)
     strcpy(szAddress ,&argv[i][3]);
    break;
   case 'o':
    bRecvOnly = TRUE;
    break;
   default:
    usage();
    break;

   }
  }
 }
}

DWORD WINAPI ClientThread(LPVOID lpParam)
{
   SOCKET sock = (SOCKET)lpParam;
   char szBuff[DEFAULT_BUFFER];
   int ret;
   int nLeft;
   int idx;


while(1)
{
   ret = recv(sock,szBuff, DEFAULT_BUFFER, 0);
   if(0 == ret)
   {
    break;
   }
   else if (ret == SOCKET_ERROR)
   {
    printf("recv() failed: %d/n", WSAGetLastError());
    break;
   }
   szBuff[ret]= '/0';
   printf("RECV: '%s'/n", szBuff);
  
   if(!bRecvOnly)
   {
    nLeft = ret;
    idx = 0;

    while(nLeft >0)
    {
     ret = send(sock, &szBuff[idx], nLeft, 0);
     if(ret == 0)
      break;
     else if(ret == SOCKET_ERROR)
     {
      printf("send() failed: %d/n", WSAGetLastError());
      break;
     }
     nLeft -= ret;
     idx += ret;
    }
   }
}
return 0;

}

int main(int argc, char **argv)
{
 WSADATA wsd;
 SOCKET sListen;
 SOCKET sClient;
    int iAddrSize;
 HANDLE hThread;
    DWORD dwThreadId;
 struct sockaddr_in local,
                 client;

 ValidateArgs(argc, argv);
 if(WSAStartup(MAKEWORD(2,2), &wsd) != 0)
 {
  printf("Failed to load winsock!/n");
  return 1;
 }
   
 //create our listening socket

    sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
 if(sListen == SOCKET_ERROR)
 {
  printf("socket() failed: %d/n",WSAGetLastError());
  return 1;
 }
   
 if(bInterface)
 {
  local.sin_addr.s_addr = inet_addr(szAddress);
  if(local.sin_addr.s_addr == INADDR_NONE)
   usage();

 }
 else
  local.sin_addr.s_addr = htonl(INADDR_ANY);
 local.sin_family = AF_INET;
 local.sin_port = htons(iPort);

 if(bind(sListen, (struct sockaddr*)&local, sizeof(local)) == SOCKET_ERROR)
 {

  printf("bind() failed: %d/n", WSAGetLastError());
  return 1;
 }
 listen(sListen , 8);

 while(1)
 {
  iAddrSize = sizeof(client);
  sClient = accept(sListen, (struct sockaddr *)&client, &iAddrSize);
  if(sClient == INVALID_SOCKET)
  {
   printf("accept() failed: %d/n",WSAGetLastError());
   break;
  }
 
 printf("Accepted client:%s:%d/n",inet_ntoa(client.sin_addr),ntohs(client.sin_port));

 hThread = CreateThread(NULL, 0, ClientThread,(LPVOID)sClient,0,&dwThreadId);
 if(hThread == NULL)
 {
  printf("CreateThread() failed: %d/n",GetLastError());
  break;
 }
 CloseHandle(hThread);
}

closesocket(sListen);

WSACleanup();
return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值