关闭

C++ C/S Socket连接实例(源码)

1952人阅读 评论(2) 收藏 举报

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

#include "stdafx.h"
#include <winsock.h>
#include <iostream>
#pragma   comment( lib,"Ws2_32.lib")
#define DEFAULT_PORT      2000
using namespace std;
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;
}
int _tmain(int argc, _TCHAR* argv[])
{
 WSADATA wsaData;
 if(WSAStartup(0x0110,&wsaData)) //调用Windows Sockets DLL
 {
  printf("Winsock无法初始化!");
  return -1;
 }
 DWORD dwIP = 0; 
 char szText[MAX_PATH];
 memset(szText,0,MAX_PATH);
 //把字符串形式的IP地址转成IN_ADDR结构需要的形式。
 dwIP = inet_addr("192.168.0.4");
 sockaddr_in local;
 SOCKET socketTmp;
 //必须是AF_INET,表示该socket在Internet域中进行通信
 local.sin_family=AF_INET;
 //端口号
 local.sin_port=htons(DEFAULT_PORT);
 //服务器的IP地址。
 local.sin_addr.S_un.S_addr=dwIP;
 ////初始化Socket
 socketTmp=socket(AF_INET,SOCK_STREAM,0);
 //连接服务器
 if(connect(socketTmp,(LPSOCKADDR)&local,sizeof(local)) < 0)
 {
  closesocket(socketTmp);
  printf("连接服务器失败。");
  system("pause");
  return 0;
 }
 //发送请求,为简单只发100字节,在服务器端也规定100字节。
 while(1)
 {
  char a[100];
  cin >> a;
  //if(a == char("exit"))
  //{
  // closesocket(socketTmp);
  // return 0;
  //}
  Send(socketTmp,a,100);
  //读取服务器端返回的数据。
  memset(szText,0,MAX_PATH);
  //接收服务器端的回应。
  Receive(socketTmp,szText,100);
  char szMessage[MAX_PATH];
  memset(szMessage,0,MAX_PATH);
  strcat(szMessage,szText);
  //界面上显示回应数据。
  puts(szMessage);
 }
 closesocket(socketTmp);
 //system("pause");
}

 

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

#include "stdafx.h"
#include <winsock.h>
#include <iostream>
#pragma   comment( lib,"Ws2_32.lib")
#define DEFAULT_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 lpparam)
{
 SOCKET  Listening = m_Listening;
 //开始监听是否有客户端连接。
 if(listen(Listening,40) == SOCKET_ERROR)
 {
  return 0;
 }
 char szBuf[MAX_PATH];
 //初始化
 memset(szBuf,0,MAX_PATH);
 while(1)
 {
  SOCKET ConnectSocket;
  sockaddr_in    ClientAddr;
  int                  nLen = sizeof(sockaddr);
  //阻塞直到有客户端连接,不然多浪费CPU资源。
  ConnectSocket = accept(Listening,(sockaddr*)&ClientAddr,&nLen);
  //都到客户端的IP地址。
  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)) //调用Windows Sockets DLL
 {
  puts("Winsock无法初始化!");
  return -1;
 }
 DWORD dwThreadID = 0;
 sockaddr_in local;
 //DWORD dwThreadID = 0;
 local.sin_family=AF_INET;
 //设置的端口为DEFAULT_PORT。
 if(argc>0)
 {
  local.sin_port = htons(argv[0]);
 }
 else
 {
  local.sin_port=htons(DEFAULT_PORT);
 }
 //local.sin_port=htons(DEFAULT_PORT);
 //IP地址设置成INADDR_ANY,让系统自动获取本机的IP地址。
 local.sin_addr.S_un.S_addr=INADDR_ANY;//inet_addr("127.0.0.1");
 //初始化Socket
 m_Listening=socket(AF_INET,SOCK_STREAM,0);
 if(m_Listening == INVALID_SOCKET)
 {
  puts("创建Winsock实例失败!");
  return -1;
 }
 if(bind(m_Listening,(LPSOCKADDR)&local,sizeof(local)) == SOCKET_ERROR )
 {
  closesocket(m_Listening);
  puts("绑定端口失败!");
  return -1;
 }
 //THREAD m_hListenThread;
 //m_hListenThread = ::CreateThread(NULL,0,ListenThread,this,0,&dwThreadID);
 if(listen(m_Listening,40) == 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);
  //阻塞直到有客户端连接,不然多浪费CPU资源。
  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,"/t来自(");
  strcat(szBuf,pAddrname);
  strcat(szBuf,")");
  //closesocket(ConnectSocket);
  puts(szBuf);
 }
}

 



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:2902次
    • 积分:47
    • 等级:
    • 排名:千里之外
    • 原创:2篇
    • 转载:0篇
    • 译文:0篇
    • 评论:2条
    文章存档
    最新评论