如何在linuxubuntu下编写c++网络通信代码

如何在linuxubuntu下编写c++网络通信代码,第1张

方法/步骤

1

1.服务器端的代码

void

SocketServer::CreateConnect(){std::cout<<"start Create

Socket!"<<std::endl m_nSocket = -1 struct sockaddr_in

server_addr struct sockaddr_in client_addr int

portnumber=4321 if((m_nSocket=socket(AF_INET,SOCK_STREAM,0))==-1)

{std::cout<<"socket Create

Failed!"<<strerror(errno)<<std::endl return }

std::cout<<"Create Socket Finish!"<<std::endl/*

服务器端填充 sockaddr结构 */bzero(&server_addr,sizeof(struct

sockaddr_in)) server_addr.sin_family=AF_INET

server_addr.sin_addr.s_addr=inet_addr("127.0.0.1")

server_addr.sin_port=htons(portnumber) /* 捆绑sockfd描述符 */

if(bind(m_nSocket,(struct sockaddr *)(&server_addr),sizeof(struct

sockaddr))==-1){std::cout<<"Server Bind

Failed!"<<strerror(errno)<<std::endl return }

std::cout<<"bind Socket Finish!"<<std::endl /*

监听sockfd描述符 */if(listen(m_nSocket,5)==-1){

std::cout<<"Listen

Failed!"<<strerror(errno)<<std::endl return }

std::cout<<"listen Socket Finish!"<<std::endl

while(1){/* 服务器阻塞,直到客户程序建立连接 */

std::cout<<"listen start..."<<std::endl int

nNewFd=-1 size_t nSize = sizeof(struct sockaddr_in)

if((nNewFd=accept(m_nSocket,(struct sockaddr

*)(&client_addr),&(nSize))) == -1){

std::cout<<"accept

Failed!"<<strerror(errno)<<std::endl return

}std::cout<<"server Get Connect

from:"<<inet_ntoa(client_addr.sin_addr)<<std::endl

while(1){char buf[256] = "0" size_t

len = recv( nNewFd, buf, 256, 0)if ( len >0)

std::cout<<"接受的消息为:"<<buf<<std::endl

else {if ( len <0)

std::cout<<"错误为:"<<strerror( errno)<<std::endl

else

std::cout<<"客户端断开:"<<std::endl break

}}/* 这个通讯已经结束 *///close(nNewFd)

/* 循环下一个 */}}

2

2.客户端代码:

//

创建链接void SocketClient::CreateConnect(){char buffer[1024] struct

sockaddr_in server_addr std::cout<<"socket create

start!"<<std::endl /* 客户程序开始建立 sockfd描述符 */

if((m_nSocket=socket(AF_INET,SOCK_STREAM,0))==-1){

std::cout<<"Client socket Create

Failed!!"<<strerror(errno)<<std::endl return }

std::cout<<"socket create finshed!"<<std::endl /*

客户程序填充服务端的资料 */int portnumber = 4321

bzero(&server_addr,sizeof(server_addr))

server_addr.sin_family=AF_INET

server_addr.sin_port=htons(portnumber)

server_addr.sin_addr.s_addr=inet_addr("127.0.0.1") /*

客户程序发起连接请求 */if(connect(m_nSocket,(struct sockaddr

*)(&server_addr),sizeof(struct sockaddr))==-1){

std::cout<<"Client connect

Fialed!"<<strerror(errno)<<std::endl return }

std::cout<<"connect finshed!"<<std::endl std::string

str="start..." while(!str.empty()){

std::cout<<"starting....!"<<std::endl

std::cin>>str size_t len = send ( m_nSocket, str.c_str(),

str.length(), 0)if ( len <0){

std::cout<<"消息发送失败"<<str<<strerror

(errno)<<std::endl }else{

std::cout<<"消息发送成功"<<str<<std::endl }}

close(m_nSocket)}

3

3.编译完成后,启动服务器端代码和客户端代码就可以进行通信了。

4

4.

普及一下TCP/IP协议的部分知识,大家都知道TCP是面向链接的协议,即在进行通信前服务器是被动链接,客户端是主动链接,那么客户端与服务器端的连

接需要经过三次握手才能建立链接。在整个通信过程中客户端与服务器端的进行的通信都有确认机制,保证包能顺利的到达对方,但这也不是100%,中间的路由

等中间桥出现问题,也有可能造成数据包的丢失,而任何一方没有收到确认包,都会一直处于等待和重传的过程中...

服务器:

创建socket->bind->listen->recv(send)->close

客户端:

创建socket->connect->recv(send)->close

你自己都没有说清楚,叫我们怎么说清楚?是装虚拟机安装还是实体安装?

实体就如此安装就可以了,要注意的只有引导问题,装好windows了之后可能会出现grub引导的丢失,无法引导ubuntu系统,修复一下引导就可以

1,使用livecd(强烈推荐)

使用任何你喜欢的linux livecd(比如,ubuntu 6.06的desktop cd)

在终端下输入:

代码:

sudo su

grub

你应该看到像这样的东西:

代码:

grub>

接着输入:

代码:

root (hdx,y)

setup (hdx)

请不要完全照样输入!请弄懂这些命令的含义。

hd表示硬盘,格式是

(hd硬盘号,分区号)

从零开始计算。

所以(按照日常的习惯,从1开始数),(hd0,0)表示第一个硬盘的第一个分区,(hd0,1)表示第一个硬盘的第2个分区,(hd1,4)表示第2个硬盘的第5个分区。

(注意,linux系统里是用hda1表示第一个硬盘的第一个分区,不要把它和grub中的表示混起来。)

root (hdx,y)

这里的(hdx,y) 是/boot 目录所在的分区(通常情况下,也就是你装ubuntu系统的分区,除非你安装的时候把/boot分出去了。)如果你不知道你把ubuntu装在第几个分区,可以在输入root (hd0, 时按Tab键来补全。(假设你把ubuntu装在第一块硬盘上)

按了tab后,你将看到一些有关各个分区的信息。通常你可以通过分区的大小和格式看出你把ubuntu系统装在哪里了。

setup (hdx) 通常情况下,是setup (hd0)。(多半你把ubuntu装在第一块硬盘上。)要注意的是,不要输入setup (hd0,0)。我曾经犯过这个错误。(如果你没把命令抄下来,凭记忆 *** 作的话,可能会犯这种错误。)

最后,用

代码:

quit

退出grub,重启系统。

好了,总结一下用到的命令(建议你把下面的代码抄在纸上。如果你对(hdx,y)表示的含义还感觉模糊,最好把上面几段解释也抄下来。)

代码:

sudo su

grub

root (hdx,y)

setup(hdx)

quit


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8946396.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-23
下一篇2023-04-23

发表评论

登录后才能评论

评论列表(0条)

    保存