以前纠结过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里玩的,我一直喜欢开源的东西
分享到:
相关推荐
Linux下使用C++进行Socket编程是一门涉及网络通信的高级技术。在Linux操作系统中,Socket编程通常采用C语言,因为传统的GNU C库提供了丰富的Socket API函数,但这些函数是面向过程设计的,没有面向对象的封装,使用...
Java和C++之间的Socket通信是跨语言网络编程的一个常见应用场景,尤其在系统集成、设备通讯或者混合编程中。Socket提供了一种基于TCP/IP协议的进程间通信(IPC)方式,可以实现在不同操作系统上的进程之间的数据传输...
**C++ Socket通信库** C++ Socket通信库是用于实现网络通信的一种工具,它基于操作系统提供的Socket接口,为开发者提供了一种在C++程序中进行网络数据交换的标准方法。Socket库简化了网络编程,允许程序员通过调用...
C++ Socket通信框架是网络编程中的重要组成部分,它允许程序通过网络进行数据交换。在Windows平台上,使用C++实现Socket通信通常涉及到Windows Socket API(也称为Winsock)。本框架“HP-Socket”专为Windows环境...
在Linux环境下,C++实现基于Socket的文件传输是一项常见的任务,尤其在分布式系统、网络编程以及服务器开发中。Socket是网络通信的一种接口,它允许进程间通过网络进行数据交换。本篇文章将深入探讨如何利用C++在...
C++作为一门强大的编程语言,可以很好地实现Socket接口,构建服务器和客户端应用。在这个项目中,我们将探讨如何使用C++在Visual Studio 2008环境下实现Socket服务器和客户端的基本功能。 首先,Socket在C++中主要...
在C++编程中,多线程SOCKET收发是一项重要的技术,它允许程序同时处理多个网络连接,提高系统的并发性能。下面将详细讲解这个主题,包括C++中的多线程概念、SOCKET基础以及如何结合两者实现数据的收发。 首先,让...
标题 "C++纯socket写的FTP服务器" 涉及到的是使用C++编程语言构建一个基于原始Socket接口的FTP(文件传输协议)服务器的过程。FTP是互联网上用于在客户端和服务器之间交换文件的标准协议。纯Socket编程意味着不依赖...
本文将深入探讨如何使用C++来实现基于Socket的TCP/IP通信,以及如何在不同的开发环境中,如VC6.0和VS2010,进行编译与测试。 首先,Socket是操作系统提供的接口,它允许应用程序通过网络发送和接收数据。在C++中,...
Socket编程是计算机网络通信的核心技术之一,特别是在C++这样的系统级编程语言中,它提供了与操作系统底层通信的接口。...在学习过程中,结合提供的C++Socket源码进行实践,能更好地理解和掌握Socket编程。
C++结合OpenCV库,可以实现高效、稳定的图像和视频处理,并通过Socket进行网络通信。以下将详细介绍如何利用C++和OpenCV通过Socket来传输图片或视频。 首先,**OpenCV** 是一个强大的计算机视觉库,提供了丰富的...
在C++中进行Socket编程,主要是为了实现网络通信,它基于TCP/IP协议栈。TCP/IP协议族是一个分层的通信模型,包括应用层、传输层、网络层和数据链路层。C++中的Socket API提供了在这些层之间交互的接口。 1. **TCP/...
android与c++通过socket通信 vc6.0开发环境 android与c++通过socket通信 vc6.0开发环境 android与c++通过socket通信 vc6.0开发环境
在IT领域,网络编程是不可或缺的一部分,而C++ Socket编程则是实现网络通信的重要技术。本资源"**C++_Socket_Dev-C++5.11-source.rar**"提供了一个使用C++封装的Socket接口,特别适用于Dev-C++ 5.11版本的开发环境。...
"简单的socket通信C++版"是一个入门级的学习项目,旨在教授如何使用C++语言进行基本的Socket编程,实现客户端与服务器之间的数据交换。在这个项目中,我们有两个主要的文件:`simpleSocket_server`和`simpleSocket_...
在QT框架中,C++ Socket通信是实现网络数据交换的基础,它允许客户端和服务端通过网络进行数据传输。本文将深入探讨如何在QT中使用C++编写客户端和服务端的socket通信代码,以及涉及到的关键操作。 首先,我们需要...
在C++编程中,自定义封装socket操作是提高代码复用性和可维护性的重要方法,尤其是在网络编程领域。本实例提供了在Linux环境下实现C++自定义封装socket操作业务类的详细过程,允许开发者轻松地创建socket连接、设置...
此DEMO使用标准C++控制台来实现,对于刚接触网络编程的新手来说可以更容易跟踪理解 HP-Socket 组件的工作流程,从而快速移植到自己的项目中。 此DEMO采用PACK模型,包含服务器及客户端的实现。PACK模型可以让你不用...
在C++中,Socket编程是网络通信的基础,用于创建客户端和服务器端的连接。本话题主要探讨的是在C++ Socket编程中的阻塞模式与非阻塞模式,以及它们在多线程环境下的应用和资源管理。 一、阻塞与非阻塞模式 1. **...