//函数参数介绍,请看注释
//server.cpp
#include<string>
#include<iostream>
#include<sys/socket.h>
#include<netinet/in.h>
#include<string.h>
#include<arpa/inet.h>
using namespace std;
#define PORT 6666
int StarService()
{
int lisFd;
// init socket
lisFd = socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
//AF_INET IPv4 Internet protocols
//SOCK_STREAM Provides sequenced, reliable, two-way, connection-based byte stream
//IPPROTO_IP Dummy protocol for TCP //参考 netinet/in.h
if(lisFd == -1)
{
cout << "create socketFd error" << endl;
return -1;
}else
{
cout << "create socketFd ok" << endl;
}
//bind socketFd
sockaddr_in serAddr; //sockaddr 通常不用 sockaddr_in 网络通讯常用 sockaddr_un 本地进程使用
memset(&serAddr,0,sizeof(serAddr));
serAddr.sin_family = AF_INET; //IP protocol family
serAddr.sin_addr.s_addr = htonl(INADDR_ANY); //((in_addr_t) 0x00000000) = 0
serAddr.sin_port = htons(PORT); //自定义端口号
if(-1 == bind(lisFd,(sockaddr *)&serAddr,sizeof(serAddr)))
{
cout <<"bind error" << endl;
return -1;
}else
{
cout <<"bind ok" << endl;
}
//listen socketFd
if(-1 == listen(lisFd,10))
// 10 connection requests will be queued before further requests are refuse
{
cout <<"listen error" << endl;
return -1;
}else
{
cout <<"listen ok" << endl;
}
//accept socketFd
while (1)
{
sockaddr_in cliAddr;
memset(&cliAddr,0,sizeof(cliAddr));
socklen_t cliLen = sizeof(cliAddr);
int cFd ;
cFd = accept(lisFd,(sockaddr *)&cliAddr,&cliLen);
if(-1 == cFd)
{
cout <<"accept error" << endl;
return -1;
}else
{
cout <<"accept ok" << endl;
//处理逻辑...
char recvBuf[64] {0};
if(-1 == recv(cFd,recvBuf,64, 0)) //关于 flags 参数 可参考 socket.h/MSG_OOB
{
cout <<"recv error"<< endl;
}else
{
cout << "sli ip = "<< inet_ntoa(cliAddr.sin_addr) <<" port = "<<ntohs(cliAddr.sin_port) <<endl;
cout << recvBuf << endl;
}
char sendBuf[64] = "ser ser ser ser";
if(-1 == send(cFd,sendBuf,64,0))
{
cout <<"send error"<< endl;
}
}
cout << "已完成 @_@....@_@....."<< endl;
}
return 0;
}
int main()
{
StarService();
}
//client.cpp
#include<string>
#include<iostream>
#include<sys/socket.h>
#include<netinet/in.h>
#include<string.h>
#include<arpa/inet.h>
using namespace std;
int starClient()
{
int cFd = socket(AF_INET,SOCK_STREAM,IPPROTO_IP); //见 server.h
if(cFd == -1)
{
cout << "create socketFd error" << endl;
return -1;
}else
{
cout << "create socketFd ok" << endl;
}
//connect sFd
sockaddr_in sAddr;
memset(&sAddr,0,sizeof(sAddr));
sAddr.sin_family = AF_INET;
inet_pton(AF_INET,"127.0.0.1",&sAddr.sin_addr);
sAddr.sin_port = htons(6666);
if(-1 == connect(cFd,(sockaddr *)&sAddr,sizeof(sAddr)))
{
cout << "connect error" << endl;
return -1;
}else
{
cout << "connect ok" << endl;
//处理逻辑...
char sendBuf[64] = "cli cli cli cli";
if(-1 == send(cFd,sendBuf,64,0))
{
cout <<"send error"<< endl;
}
char recvBuf[64] {0};
if(-1 == recv(cFd,recvBuf,64, 0)) //关于 flags 参数 可参考 socket.h/MSG_OOB
{
cout <<"recv error"<< endl;
}else
{
cout << "ser ip = "<< inet_ntoa(sAddr.sin_addr) <<" port = "<<ntohs(sAddr.sin_port) <<endl;
cout << recvBuf << endl;
}
}
return 0;
}
int main()
{
starClient();
}