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

原创 2007年09月22日 14:47:00

 // 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);
 }
}

 



boost::asio中的C/S同步实例源码

近来狂热地研究boost的开发技术,现将读书bij
  • tao_627
  • tao_627
  • 2014年06月07日 19:50
  • 1267

基于C/S模式socket编程实例

  • 2011年12月20日 22:39
  • 3.44MB
  • 下载

Java学习笔记------一个能相互通信的半双工Socket C/S实例

服务器端代码: /*  * 功能:是一个服务器,在9999端口上监听  * 可以通过控制台,输入会送给客户端的信息。  * 总共需要多少流???  * 1.把数据写入套接字流  *...
  • H002399
  • H002399
  • 2015年08月05日 17:55
  • 213

Java Socket实现C/S实例 (包括使用NIO)

Server端package thread.socket; import java.io.*; import java.net.*; import java.util.*; public cl...
  • mebusw
  • mebusw
  • 2011年05月10日 17:28
  • 1182

C++ Socket C/S ,实现客户端,服务器端断开重连

// WindowsSocketServer.cpp : 定义控制台应用程序的入口点。 #include "stdafx.h" #include #include #include #inclu...
  • Entre_
  • Entre_
  • 2015年08月12日 10:33
  • 787

c++ 使用socket实现C/S端文件的下载传输

首先是服务器端,大致说下流程:服务器创建线程去处理应答accept(),当接受到客户端连接请求时,首先获取要发送的指定的文件数据总大小给客户端,接着就是循环读取要发送的文件数据流向客户端发送文件数据,...

C++基础--完善Socket C/S ,实现客户端,服务器端断开重连

// WindowsSocketServer.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #include #include...

C++ 小词典[STL+Socket] (C/S版)

服务端:dictServer.cpp #include #include #include #include #include #include #include "dictCom.h"...
  • s_a_n_
  • s_a_n_
  • 2011年02月11日 11:54
  • 1136
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++ C/S Socket连接实例(源码)
举报原因:
原因补充:

(最多只允许输入30个字)