如何在linux/ubuntu下编写c++网络通信代码
发布网友
发布时间:2022-05-01 18:39
我来回答
共1个回答
热心网友
时间:2022-06-21 09:01
方法/步骤
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