[轉] 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;
}

 

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