TCP实现服务器端接收客户端发送的数据

一. 服务器端接收

#include<stdio.h>
#include<unistd.h>
#include<sys/socket.h>
#include<stdlib.h>
#include<ctype.h>
#include<arpa/inet.h>
#include<fcntl.h>

#define SERV_IP "106.15.74.16"
#define SERV_PORT 6666
#define FILE_NAME "/home/pang/shipin.mp4"
int main()
{
        int lfd,cfd,i=1;
		int fd1;
        struct sockaddr_in serv_addr,clie_addr;                       // 结构体sockaddr_in 用来处理网络通信的地址,在头文件<arpa/inet.h>中定义
        socklen_t clie_addr_len;                                      //socklen_t类似unsigned int
        char buf[1024];
        int n;

        lfd = socket(AF_INET,SOCK_STREAM,0);                          //int socket(int domain, int type, int protocol); AF_INET表示IPv4 Internet协议;SOCK_STREAM(流式套接字)TCP连接;
                                                                      //通常某协议中只有一种特定类型,这样protocol参数仅能设置为0;
                                                                      /*这个函数建立一个协议族为domain、协议类型为type、协议编号为protocol的套接字文件描述符。
                                                                                     如果函数调用成功,会返回一个标识这个套接字的文件描述符,失败的时候返回-1。*/                                                                                                                            
        serv_addr.sin_family = AF_INET;
        serv_addr.sin_port = htons(SERV_PORT);                         //服务器端端口
        serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);                 //INADDR_ANY表示随机,没有绑定具体的ip

        bind(lfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr));    //通过bind函数把socket和协议,IP地址,端口号三个要素绑定起来

        listen(lfd,128);                                               //int listen(int s, int backlog);成功返回0;如果socket 为AF_INET 则参数backlog 最大值可设至128.

        clie_addr_len = sizeof(clie_addr);

        cfd = accept(lfd,(struct sockaddr *)&clie_addr,&clie_addr_len);  /*函数的第一个参数用来标识服务端套接字(也就是listen函数中设置为监听状态的套接字),
                                                                              第二个参数是用来保存客户端套接字对应的“地方”(包括客户端IP和端口信息等), 第三个参数是“地方”的占地大小。返回值对应客户端套接字标识。*/
		
        fd1=open(FILE_NAME,O_RDWR|O_CREAT);                             //O_CREAT表示如果指定文件不存在,则创建这个文件
		if(fd1<0)
		 perror("open file error\n");

       while((n=read(cfd,buf,1024)))
              {
                  printf(" %d ",i);           
                  if(write(fd1,buf,n)!=n)                              //把buf中的数据写到fd1中
                  perror("write failed\n");
                  else       
                  i++;
               }
        close(lfd);
        close(cfd);
        return 0;
}

二. 客户端发送

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<errno.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<arpa/inet.h> 
#include<string.h>

#define SERV_IP "106.15.74.16"
#define SERV_PORT 6666
#define ITEMSIZE 3
#define WIDEIMAGE 500

int main()
{
    int cfd, fd;
    struct sockaddr_in serv_addr;
    socklen_t serv_addr_len;
    char readChar[ITEMSIZE], writeChar[1024];
    int count, j = 1;

    cfd = socket(AF_INET, SOCK_STREAM, 0);                          //创建一个socket

    memset(&serv_addr, 0, sizeof(serv_addr));

    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(SERV_PORT);

    inet_pton(AF_INET, SERV_IP, &serv_addr.sin_addr.s_addr);       //IP地址转换函数;将“点分十进制” -> “二进制整数”; 第一个参数af是地址簇,第二个参数*src是来源地址,第三个参数* dst接收转换后的数据。

    connect(cfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));  /*第一个参数是客户端的套接字(表明即将发起连接请求),
                                                                      第二个参数是服务端的套接字所在的“地方”(“地方”是我自定义的专有名词),
                                                                        第三个参数是该“地方”的大小。 如果请求连接成功,则返回0,否则返回错误码。*/

    

    fd = open("shipin.mp4", O_RDONLY | O_WRONLY | O_CREAT);           //O_CREAT表示如果指定文件不存在,则创建这个文件

    while (1) {
        count = read(cfd, readChar, ITEMSIZE); 
        //write(fd,buf,sizeof(buf));
        if (count == 0) {
            break;
        }
        readChar[count] = '\0';

        count = sprintf(writeChar, "%02x%02x%02x ",readChar[0] & 0x00FF, readChar[1] & 0x00FF, readChar[2] & 0x00FF);
        writeChar[count] = '\0';
        write(fd, writeChar, count);  
        if (count < ITEMSIZE)
        {
            break;
        }
        if (j++ % WIDEIMAGE == 0)
        {
            write(fd, "\n", 1);
        }

    }
    close(fd);
    close(cfd);

    return 0;
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值