Socket网络编程 (二)

socket网络编程 (二)

1.1 C语言代码(基于TCP协议)

本实例基于CENTOS7 Linux操作系统进行网络通信

服务端代码:

echosrv.c
#include <sys/socket.h>
#include<string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include<stdlib.h>
#include<stdio.h>
#include<errno.h>
#include<unistd.h>

#define ERR_EXIT(m)\
         do \
           {\
              perror(m);\
              exit(EXIT_FAILURE);\
           }while(0)

int main(){
     int listenfd;
     /*套接字初始化*/
     if((listenfd=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP))<0)
                ERR_EXIT("socket");
     struct sockaddr_in servaddr;
     memset(&servaddr,0,sizeof(servaddr));
     servaddr.sin_family=AF_INET;
     servaddr.sin_port=htons(5188);
     servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
     if(bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr))<0)
                ERR_EXIT("bind");
     if(listen(listenfd, SOMAXCONN)<0)
                ERR_EXIT("listen");
     struct sockaddr_in peeraddr;
     socklen_t peerlen=sizeof(peeraddr);
     int conn;
     //服务端套接字,与客户端套接字Sock进行连接通讯
     if((conn=accept(listenfd,(struct sockaddr*)&peeraddr,&peerlen))<0)
                ERR_EXIT("accept");
     char recvbuf[1024];
     while(1){
          memset(recvbuf,0,sizeof(recvbuf));
          int ret=read(conn,recvbuf,sizeof(recvbuf));
          fputs(recvbuf,stdout);
          write(conn,recvbuf,ret);
     }
     close(conn);
     close(listenfd);
     return 0;
}

客户端代码:

echocli.c
#include <sys/socket.h>
#include<string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include<stdlib.h>
#include<stdio.h>
#include<errno.h>
#include<unistd.h>

#define ERR_EXIT(m)\
         do \
           {\
              perror(m);\
              exit(EXIT_FAILURE);\
           }while(0)

int main(){
     int sock;
     /*套接字初始化*/
     if((sock=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP))<0)
                ERR_EXIT("socket");
     struct sockaddr_in servaddr;
     memset(&servaddr,0,sizeof(servaddr));
     servaddr.sin_family=AF_INET;
     servaddr.sin_port=htons(5188);
     servaddr.sin_addr.s_addr=inet_addr("127.0.0.1");
     if(connect(sock,(struct sockaddr*)&servaddr,sizeof(servaddr))<0)
                   ERR_EXIT("connect");
     char sendbuf[1024]={0};
     char recvbuf[1024]={0};
     while(fgets(sendbuf,sizeof(sendbuf),stdin) != NULL){
           write(sock,sendbuf,strlen(sendbuf));
           read(sock,recvbuf,sizeof(recvbuf));
           fputs(recvbuf,stdout);
           memset(sendbuf,0,sizeof(sendbuf));
           memset(recvbuf,0,sizeof(recvbuf));
     }
     close(sock);
     return 0;
}

服务端和客户端运行结果:
在这里插入图片描述
在这里插入图片描述

1.2 理论基础

C/S客户/服务模型

在这里插入图片描述

回射客户/服务器

在这里插入图片描述

socket函数

在这里插入图片描述

man socket:

在这里插入图片描述

bind函数

在这里插入图片描述
man 2 listen:
在这里插入图片描述

listen函数

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

accept函数

在这里插入图片描述

man 2 accept:

在这里插入图片描述
man connect:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alex1_Code

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值