TCP网络编程实例

服务器端代码:

#include<t_stdio.h>
#include<sys/types.h>          
#include <sys/socket.h>
#include<arpa/inet.h>
#include <sys/socket.h>
#include<ctype.h>
#include<unistd.h>
int main(void){
    struct sockaddr_in serv,cli;
    socklen_t cli_len;
    char buf[128];
    char IP[32];
    //创建一个通讯端点,返回该端点的文件描述符
    //创建一个ipv4的tcp连接端口
    int s_fd=socket( AF_INET ,SOCK_STREAM ,0);

    //需要对server变量成员初始化
    serv.sin_family=AF_INET;
    serv.sin_port=htons(5556);
    serv.sin_addr.s_addr=htonl(INADDR_ANY);
    //将s_fd和本地地址,端口号绑定
    int b=bind(s_fd,(struct sockaddr *)&serv,sizeof(serv));

    if(b==-1)E_MSG("bind",-1);
    if(s_fd==-1)E_MSG("socket",-1);
    //将s_fd设置为被动连接,监听客户端连接的到来 
    //将客户端到来的连接放入未决连接队列中
    //指定未决连接队列的长度
    listen(s_fd,5);
    while(1){
        //从s_fd设备的未连接队列中提取一个进程进行处理
        //返回一个连接描述符,使用这个连接描述符与客户端进行通讯
        int c_fd=accept(s_fd,(struct sockaddr *)&cli,&cli_len);
        if(c_fd==-1)E_MSG("accept",-1);
        //binary--->text
        inet_ntop(AF_INET,&cli.sin_addr,IP,32); 
        printf("client ip: %s\n",IP);
        //代码执行到这里,三次握手以及完成,可以进行数据传输了
        //从c_fd中读取客户端发送过来的请求信息
        int r = read(c_fd,buf,128);
        //处理客户端的请求信息
        int i;
         for(i=0;i<r;i++){
            buf[i]=toupper(buf[i]);
         }
         //将处理结果回送客户端
         write(c_fd,buf,r);
        //关闭本次连接
        close(c_fd);
    }

    return 0;
}

客户端代码:

#include<t_stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include<string.h>
#include<unistd.h>
int main(int argc,char * argv[]){
     struct sockaddr_in serv;
     char * msg="this is a test..\n";
     char buf[128];
    //创建socket设备,返回该设备的文件描述符
    int fd=socket(AF_INET,SOCK_STREAM,0);
    if(fd==-1)E_MSG("socket",-1);
    //服务器信息初始化
    serv.sin_family=AF_INET;
    serv.sin_port=htons(5556);
    //127.0.0.1 text-->binary
    inet_pton(AF_INET,argv[1],&serv.sin_addr);
    // 向服务器发起连接
    int c=connect(fd,(struct sockaddr *)&serv,sizeof(serv));
    if(c==-1)E_MSG("connect",-1);
    //三次握手成功,向服务器发送请求信息
    write(fd,msg,strlen(msg)+1);
    //阻塞等待服务器回应
    int r=read(fd,buf,128);
    //将相应信息输出到显示器
    write(1,buf,r);
    //关闭连接
    close(fd);
    return 0;
}

解析:

  1. 在服务器端,首先创建了一个socket设备,用于建立网络连接。
  2. 使用bind函数,将socket设备与特定的网络地址和端口号绑定。在这里,地址被设为INADDR_ANY,表示该服务器可接受任意网络中的请求,端口号被设为5556
  3. 调用listen函数,使得该socket设备成为一个被动连接的设备,等待客户端的连接请求。该函数的第二个参数5,表示最多可以维护5个客户端的连接请求。
  4. 在一个无限循环中,使用accept函数,从设备的未接连接队列中取出一个连接进行处理。返回的c_fd是用来和客户端进行通信的连接描述符。
  5. 在接收到客户端连接之后,获取客户端的IP地址,打印到控制台。
  6. 使用read函数,读取c_fd中客户端发送过来的请求信息。
  7. 然后对客户端发送来的字符,从小写转换为大写。
  8. 使用write函数,将被转换为大写的字符回送给客户端。
  9. 传输完毕后,使用close函数关闭本次连接。
  10. 客户端也首先创建一个socket设备。
  11. 初始化服务器端的信息,包括网络协议、端口和服务器IP地址。
  12. 调用connect函数向服务器发起连接。
  13. 发起连接后,使用write 函数向服务器发送请求信息,这里请求的信息为 "this is a test.."
  14. 使用read函数等待服务器的回应。
  15. 最后将收到的回应信息输出到显示器,并关闭连接。
  • 31
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值