`
westice
  • 浏览: 115547 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

C++版socket

阅读更多

以前纠结过java版的socket通信,现在搞c++的。都是基于tcp/ip的,形式差不多,需要注意的只是细节问题。

服务器socket绑定一个端口,然后等待客户机的接入。

客户端socket去连服务器和一个特定端口,连接成功后即可进行通信,发送字符串。

客户端代码:

#include <iostream>
#include <string>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
/*
*客户端
*/
int main()
{   
	cout<<"客户端启动"<<endl;
	//初始化winsock
	WSADATA wsaD;
    WSAStartup(MAKEWORD(1,1),&wsaD);
	//创建客户端socket
	SOCKET sclient=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
	//连接服务器
	struct sockaddr_in servaddr;
	servaddr.sin_family=AF_INET;
	servaddr.sin_addr.s_addr=inet_addr("192.168.1.45"); //指定服务器
	servaddr.sin_port=htons(8080);             //指定端口
    cout<<"确实要建立连接? yes/no"<<endl;
	char flag[3];
	gets(flag);
	if(strcmp(flag,"yes")==0)
	{
      connect(sclient,(struct sockaddr*)&servaddr,sizeof(servaddr)); //通过套接字连接主机
    }                               
	//发送数据
	char buf[500];
    cout<<"输入发送内容:";
	while(cin.getline(buf,500))
	{
     //通过套接字给主机发送字符串
	 send(sclient,buf,strlen(buf)+1,0);  //字符串还有个结束标志,  
	}
	return 0;
}
 

服务器代码:

#include <iostream>
#include <string>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
using std::cout;
using std::cin;
using std::string;
using std::endl;
/*
*socket 服务器端 
*/ 
int main()
{
    cout<<"服务器启动!....."<<endl;
    //初始化winsock 
     WSADATA wsaD;
     WSAStartup(MAKEWORD(1,1),&wsaD);
    //创建监听套接字
    SOCKET slisten=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 
    // 绑定主机地址和监听套接字
    struct sockaddr_in my_addr;   //主机地址 
    my_addr.sin_family=AF_INET;
    my_addr.sin_port=htons(8080); //指定端口
    my_addr.sin_addr.s_addr=htonl(INADDR_ANY);
    bind(slisten,(struct sockaddr *)&my_addr,sizeof(my_addr));
    //启动监听
    listen(slisten,5);
    //开始接收数据
    struct sockaddr_in c_addr;  //客户地址 
    int addr_len=sizeof(c_addr);
    SOCKET sconnect=accept(slisten,(struct sockaddr*)&c_addr,&addr_len); //通过监听套接字创建连接套接字
    cout<<"连接已建立......"<<endl;
    while(true)
    {  
	   char buf[500]; //存储接收的字符
       int len=recv(sconnect,buf,sizeof(buf),0);  //通过连接套接字接收数据
       if(len>0)
       {
          cout<<"客户说:"<<buf<<endl;
       }
    } 
	return 0;
}
 

 

 在创建socket之前要调用WSAStartup(MAKEWORD(1,1),&wsad);

 这个函数说明使用的版本是1.1版的,wsad存储系统返回的winsocket信息。

 

创建socket 调用socket(int af,int type,int protocol) af不清楚,type有SOCK_STREAM(tcp),SOCK_DGRAM(udp)

protocol :通信协议(默认为0)

 

绑定端口,调用函数bind(SOCKET S,stuct sockaddr *name,int namelen),

S为监听socket,name为主机地址(里面指定了端口) ,namelen为地址变量长度。

 

接下来使服务器处于监听状态,调用函数listen(SOCKET s,int backlog)

s为监听socket, backlog为最大连接数,最大为5.

 

客户机连进来后就可通信了,但还要创建一个连接socket.调用accept(SOCKET S,struct sockaddr *addr int *addrlen);

s为监听socket,addr用来存放客户地址,addrlen为长度,然后返回连接socket.

这一步后就可以利用连接socket接收数据了,调用recv(SOCKET s,char *buf,int len,int flags).

s为连接socket,buf来存放接收数据,他为一个字符数组首地址。len为buf的最大长度,不是buf的实际长度,flags为此函数调用的方式(不太清楚)

 

而客户端跟java里的一样要简单一点,首先调用WSAStartup(),然后再 socket()创建客户端socket。指定主机的ip和开放的端口,就可以尝试和主机联机了,调用connect(SOCKET s,struct sockaddr addr,int len)

s为客户端socket,addr为主机地址,len为地址变量长度,这一步成功后,就可以给主机发送消息了,

调用send(SOCKET S,char *buf,int len,int flags),

s为客户端socket ,buf为字符串,len为字符串长度(里面一定要包含结束标志的长度) ,flags此函数调用的方式。

 

数据发送完毕后就要关闭连接,服务器端和客户端都可以关闭,调用函数closesocket(SOCKET S),S为要关闭的socket,

然后再调用WSACleanup()释放socket所占用的资源。

 

/*
*封装之后的接受函数 
*因为要判断每次接收了多少字节 
*/
bool my_recv(SOCKET socket,char *buf,int length,int flag){
     int recv_len = 0;
     short index = 0;
     while( length > 0 ){
       recv_len = recv(socket,&buf[index],length,flag);
       index = index + recv_len;
       length = length - recv_len;
     }
     
     if( 0 == recv_len ){
        return true;    
     }else{
        return false;
     }
}
 

 

 

在探讨这个问题时纠结过的问题:

//要包含这两句
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")

 

 

然后这个程序是window 控制台程序,在vc里的Project Options中将/subsystem:windows改成/subsystem:console
本来想在dev-cpp里玩的,调了老半天没搞好,最后还是在vc里玩的,我一直喜欢开源的东西

 

分享到:
评论
1 楼 nima123321 2013-11-29  
网上的人,发发代码就算了,但是最起码标明一个该代码是否能用嘛.

相关推荐

    Linux下使用C++进行Socket编程

    Linux下使用C++进行Socket编程是一门涉及网络通信的高级技术。在Linux操作系统中,Socket编程通常采用C语言,因为传统的GNU C库提供了丰富的Socket API函数,但这些函数是面向过程设计的,没有面向对象的封装,使用...

    java与c++通过socket通信

    Java和C++之间的Socket通信是跨语言网络编程的一个常见应用场景,尤其在系统集成、设备通讯或者混合编程中。Socket提供了一种基于TCP/IP协议的进程间通信(IPC)方式,可以实现在不同操作系统上的进程之间的数据传输...

    c++ socket通信库

    **C++ Socket通信库** C++ Socket通信库是用于实现网络通信的一种工具,它基于操作系统提供的Socket接口,为开发者提供了一种在C++程序中进行网络数据交换的标准方法。Socket库简化了网络编程,允许程序员通过调用...

    c++Socket通信框架

    C++ Socket通信框架是网络编程中的重要组成部分,它允许程序通过网络进行数据交换。在Windows平台上,使用C++实现Socket通信通常涉及到Windows Socket API(也称为Winsock)。本框架“HP-Socket”专为Windows环境...

    linux下的c++实现socket文件传输功能

    在Linux环境下,C++实现基于Socket的文件传输是一项常见的任务,尤其在分布式系统、网络编程以及服务器开发中。Socket是网络通信的一种接口,它允许进程间通过网络进行数据交换。本篇文章将深入探讨如何利用C++在...

    c++实现Socket服务器和客户端功能

    C++作为一门强大的编程语言,可以很好地实现Socket接口,构建服务器和客户端应用。在这个项目中,我们将探讨如何使用C++在Visual Studio 2008环境下实现Socket服务器和客户端的基本功能。 首先,Socket在C++中主要...

    C++纯socket写的FTP服务器

    标题 "C++纯socket写的FTP服务器" 涉及到的是使用C++编程语言构建一个基于原始Socket接口的FTP(文件传输协议)服务器的过程。FTP是互联网上用于在客户端和服务器之间交换文件的标准协议。纯Socket编程意味着不依赖...

    c++实现socket通信

    本文将深入探讨如何使用C++来实现基于Socket的TCP/IP通信,以及如何在不同的开发环境中,如VC6.0和VS2010,进行编译与测试。 首先,Socket是操作系统提供的接口,它允许应用程序通过网络发送和接收数据。在C++中,...

    用C++进行Socket编程

    Socket编程是计算机网络通信的核心技术之一,特别是在C++这样的系统级编程语言中,它提供了与操作系统底层通信的接口。...在学习过程中,结合提供的C++Socket源码进行实践,能更好地理解和掌握Socket编程。

    C++OpenCv利用Socket通讯类传输图片或者视频

    C++结合OpenCV库,可以实现高效、稳定的图像和视频处理,并通过Socket进行网络通信。以下将详细介绍如何利用C++和OpenCV通过Socket来传输图片或视频。 首先,**OpenCV** 是一个强大的计算机视觉库,提供了丰富的...

    C++中socket编程

    在C++中进行Socket编程,主要是为了实现网络通信,它基于TCP/IP协议栈。TCP/IP协议族是一个分层的通信模型,包括应用层、传输层、网络层和数据链路层。C++中的Socket API提供了在这些层之间交互的接口。 1. **TCP/...

    android与c++通过socket通信

    android与c++通过socket通信 vc6.0开发环境 android与c++通过socket通信 vc6.0开发环境 android与c++通过socket通信 vc6.0开发环境

    C++_Socket_Dev-C++5.11-source.rar

    在IT领域,网络编程是不可或缺的一部分,而C++ Socket编程则是实现网络通信的重要技术。本资源"**C++_Socket_Dev-C++5.11-source.rar**"提供了一个使用C++封装的Socket接口,特别适用于Dev-C++ 5.11版本的开发环境。...

    简单的socket通信C++版

    "简单的socket通信C++版"是一个入门级的学习项目,旨在教授如何使用C++语言进行基本的Socket编程,实现客户端与服务器之间的数据交换。在这个项目中,我们有两个主要的文件:`simpleSocket_server`和`simpleSocket_...

    QT中使用C++ socket通信 客户端与服务端的代码实例

    在QT框架中,C++ Socket通信是实现网络数据交换的基础,它允许客户端和服务端通过网络进行数据传输。本文将深入探讨如何在QT中使用C++编写客户端和服务端的socket通信代码,以及涉及到的关键操作。 首先,我们需要...

    C++多线程SOCKET收发

    在C++编程中,多线程SOCKET收发是一项重要的技术,它允许程序同时处理多个网络连接,提高系统的并发性能。下面将详细讲解这个主题,包括C++中的多线程概念、SOCKET基础以及如何结合两者实现数据的收发。 首先,让...

    C++自定义封装socket操作业务类完整实例

    在C++编程中,自定义封装socket操作是提高代码复用性和可维护性的重要方法,尤其是在网络编程领域。本实例提供了在Linux环境下实现C++自定义封装socket操作业务类的详细过程,允许开发者轻松地创建socket连接、设置...

    HPSocket C++控制台版DEMO.rar

    此DEMO使用标准C++控制台来实现,对于刚接触网络编程的新手来说可以更容易跟踪理解 HP-Socket 组件的工作流程,从而快速移植到自己的项目中。 此DEMO采用PACK模型,包含服务器及客户端的实现。PACK模型可以让你不用...

    C++ socket 阻塞与非阻塞

    在C++中,Socket编程是网络通信的基础,用于创建客户端和服务器端的连接。本话题主要探讨的是在C++ Socket编程中的阻塞模式与非阻塞模式,以及它们在多线程环境下的应用和资源管理。 一、阻塞与非阻塞模式 1. **...

Global site tag (gtag.js) - Google Analytics