天天看点

linux网络通信编程基础实现

作者:三山春文

实现步骤:

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;
}
           

继续阅读