如何在linux/ubuntu下编写c++网络通信代码

时间:2024-10-14 10:55:24

1、渲舫蒇芘服务器端的代码:void SocketServer::CreateConnect(){ std::cout<<"start Cre锾攒揉敫ate 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、客户端代码://创建链接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、编译完成后,启动服务器端代码和客户端代码就可以进行通信了。

如何在linux/ubuntu下编写c++网络通信代码
如何在linux/ubuntu下编写c++网络通信代码

4、普及一下TCP/IP协议的部分知识,大家都知道TCP是面向链接的协议,即在进行通信前服务器是被动链接,客户端是主动链接,那么客户端与服务器端的连接需要经过三次握手才能建立链接。在整个通信过程中客户端与服务器端的进行的通信都有确认机制,保证包能顺利的到达对方,但这也不是100%,中间的路由等中间桥出现问题,也有可能造成数据包的丢失,而任何一方没有收到确认包,都会一直处于等待和重传的过程中...服务器:创建socket->bind->listen->recv(send)->close客户端:创建socket->connect->recv(send)->close

© 手抄报圈