實作步驟:
1.引用網絡程式設計的相關頭檔案
2.建立socket對象
3.初始化網絡位址及綁定網絡位址
4.監聽用戶端的連接配接
5.進行資料的發送與接收
6.關閉socket連接配接
//1.引用網絡程式設計的相關頭檔案
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
//2.建立socket對象
sockfd= socket(AF_INET,SOCK_STREAM,0);//建立socket
//3.初始化網絡位址及綁定網絡位址
//初始化位址結構
struct sockaddr_in _addr;
bzero(&_addr,sizeof (_addr));
_addr.sin_family=AF_INET;//UDP,TCP
_addr.sin_port= htons(port);//端口
_addr.sin_addr.s_addr= htons(INADDR_ANY);//任何位址
//綁定
int err_log= bind(sockfd,(struct sockaddr*)&_addr,sizeof (_addr));
//監聽
err_log= listen(sockfd,10);
//接受用戶端連接配接
connfd= accept(sockfd,(struct sockaddr*)&cliAddr,&cliLen);
//接收資料
recv(connfd,recvBuf,sizeof (recvBuf),0)
//發送資料
send(connfd,sendBuf, len,0);
close(connfd);//關閉連接配接
完整源碼:
//1.引用網絡程式設計的相關頭檔案
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
//1.引用網絡程式設計的相關頭檔案
//2.建立socket對象
//3.初始化網絡位址及綁定網絡位址
//4.監聽用戶端的連接配接
//5.進行資料的發送與接收
//6.關閉socket連接配接
int main(int argc,char* argv[]) {
std::cout << "網絡服務端:" << std::endl;
unsigned short port = 8000;//服務監聽端口
//如果指令行傳入參數
if (argc>1)
{
port = atoi(argv[1]);//使用參數端口
}
pid_t pid;
pid = fork();
if (pid<0)
{
perror("fork error\n");
}
else if(pid==0)
{
printf("子程序\n");
}
else
{
printf("父程序\n");
}
int sockfd=0;
//2.建立socket對象
sockfd= socket(AF_INET,SOCK_STREAM,0);//建立socket
if(sockfd<0)
{
perror("create socket fail\n");
exit(-1);
}
//3.初始化網絡位址及綁定網絡位址
//初始化位址結構
struct sockaddr_in _addr;
bzero(&_addr,sizeof (_addr));
_addr.sin_family=AF_INET;//UDP,TCP
_addr.sin_port= htons(port);//端口
_addr.sin_addr.s_addr= htons(INADDR_ANY);//任何位址
//綁定
int err_log= bind(sockfd,(struct sockaddr*)&_addr,sizeof (_addr));
if (err_log!=0){
perror("bind socket fail\n");
close(sockfd);
exit(-1);
}
//監聽
err_log= listen(sockfd,10);
if (err_log!=0){
perror("socket listen fail\n");
close(sockfd);
exit(-1);
}
printf("server is listening in port:%d\n",port);
struct sockaddr_in cliAddr;
char cliIP[INET_ADDRSTRLEN]="";
socklen_t cliLen = sizeof (cliAddr);
int connfd;
//接受用戶端連接配接
connfd= accept(sockfd,(struct sockaddr*)&cliAddr,&cliLen);
if (connfd<0){
perror("accept client socket connect fail\n");
exit(-1);
}
//轉換并儲存用戶端IP位址字元串
inet_ntop(AF_INET,&cliAddr.sin_addr.s_addr,cliIP,INET_ADDRSTRLEN);
printf("the client ip:%s,port=%d\n",cliIP, ntohs(cliAddr.sin_port));
//循環接收發送資料
while (true)
{
char recvBuf[2048]={0};
//接收資料
if (recv(connfd,recvBuf,sizeof (recvBuf),0)>0)
{
printf("recv data from client:\r\n");
printf("%s\r\n",recvBuf);
//發送資料
char sendBuf[512]={0};
printf("send:");
fgets(sendBuf,sizeof (sendBuf),stdin);
int len = strlen(sendBuf);
sendBuf[len-1]=0;
send(connfd,sendBuf, len,0);
}
}
close(connfd);
printf("client closed!\r\n");
close(sockfd);
return 0;
}