[转] C++ socket 例子

 

// CSocketSev.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <winsock.h>
#include <iostream>
#pragma comment(lib,"Ws2_32.lib")
#define DEFULT_PORT 2000
SOCKET m_Listening;

int Receive(SOCKET fd , char* szText , int len)
{
int cnt, rc;
cnt = len;
while(cnt > 0)
{
 rc = recv(fd,szText,cnt,0);
 if(rc == SOCKET_ERROR)
 {
 return -1;
 }
 if(rc == 0)
 {
 return len-cnt;
 }
 szText += rc;
 cnt -= rc;
}
return len;
}

int Send(SOCKET fd , char* szText , int len)
{
int cnt , rc;
cnt = len;
while(cnt > 0)
{
 rc = send(fd,szText,cnt,0);
 if(rc == SOCKET_ERROR)
 {
 return -1;
 }
 if(rc == 0)
 {
 return len-cnt;
 }
 szText += rc;
    cnt -= rc;
}
return len;
}

DWORD WINAPI ListenThread(LPVOID Ipparam)
{
 SOCKET Listening = m_Listening;
 //开始监听
 if(listen(Listening,40) == SOCKET_ERROR)
 {
 return -1;
 }
 char szBuf[MAX_PATH];
 memset(szBuf,0,MAX_PATH);
 
 while(1)
 {
  SOCKET ConnectSocket;
  SOCKADDR_IN ClientAddr;
  int         nLen = sizeof(sockaddr);
  //阻塞 线程 直到 有客户端连接 节省资源
  ConnectSocket = accept(Listening,(sockaddr*)&ClientAddr,&nLen);

  char* pAddrname = inet_ntoa(ClientAddr.sin_addr); //将网络地址 转换成 “.” 点隔字符串

  Receive(ConnectSocket,szBuf,100);
//界面显示请求数据
  strcat(szBuf,"来自(");
  strcat(szBuf,pAddrname);
  strcat(szBuf,")");

  Send(ConnectSocket,szBuf,100);
  puts(szBuf);

 }
 return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
 WSADATA wsaData;
 if(WSAStartup(0x0110,&wsaData)) //调用 windowSocketDll
 {
 puts("Winsock无法初始化");
   
 return -1;
 }
 DWORD dwThreadID = 0;

 sockaddr_in local;

 local.sin_family = AF_INET;
    
 //设置端口 DEFAULT_PORT
 if(argc > 0)
 {
  local.sin_port = htons((u_short)argv[0]); //htons 将主机的无符号短整形数 转换成网络字节顺序
 }
 else
 {
  local.sin_port = htons(DEFULT_PORT);
 }
 //ip 设置成 INADDR_ANY 系统自动查找
 local.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//INADDR_ANY;

 //初始化Socket
 m_Listening = socket(AF_INET,SOCK_STREAM,0);

 if(m_Listening == INVALID_SOCKET)
 {
  puts("创建Winsock实例失败!");
  return -1;
 }
 if(bind(m_Listening,(sockaddr*)&local.sin_addr,sizeof(local) == SOCKET_ERROR))
 {
 closesocket(m_Listening);
 puts("绑定端口失败");
 return -1;
 }
 if(m_Listening == SOCKET_ERROR)
 {
  puts("监听端口失败");
  return -1;
 }
 puts("启动成功");

 char szBuf[MAX_PATH];
 //初始化
 memset(szBuf,0,MAX_PATH);

 while(1)
 {
  SOCKET ConnectSocket;

  sockaddr_in ClientAddr;

  int         nLen = sizeof(sockaddr);

  //阻塞
  ConnectSocket = accept(m_Listening,(sockaddr*)&ClientAddr,&nLen);

  //得到客户端IP
  char* pAddrname = inet_ntoa(ClientAddr.sin_addr);

  Receive(ConnectSocket,szBuf,100);

  //像客户端 发送回复
  Send(ConnectSocket,szBuf,100);

  //界面显示数据
  strcat(szBuf,"来自(");
  strcat(szBuf,pAddrname);
  strcat(szBuf,")");

  puts(szBuf);
 }
 
 //return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章