互联网应用 -- lab 3

TCP Socket

Client

'If you want to transmit .txt file , change the out.jpg to out.txt'

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

#define MAXDATASIZE 2048

int main(int argc, char *argv[])

{

    if(argc<3){
        printf("Usage: %s <Servcer IP> <Port> <File Name>\n",argv[0]);
        return 0;
    }

    int sockfd;
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    const char *server_ip = argv[1]; 
    struct sockaddr_in serveraddr;
    bzero(&serveraddr, sizeof(serveraddr));
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_port = htons(atoi(argv[2]));
    inet_pton(AF_INET, server_ip, &serveraddr.sin_addr);
    connect(sockfd, (struct sockaddr*)&serveraddr, sizeof(serveraddr));
    printf("=====================服务器链接成功=====================\n");

    char buf[MAXDATASIZE];
    char *filename=argv[3];
    printf("Request File :%s\n",filename);
    send(sockfd,filename,sizeof(filename),0);
    memset(buf, '\0', MAXDATASIZE/sizeof (char));

    FILE* fd;
    int recvNum;

    fd=fopen("out.jpg","wb");
    while((recvNum=recv(sockfd,buf,sizeof(buf),0))>0){
        printf("Receive: %d\n",recvNum);
        fwrite(buf,recvNum,1,fd);
        memset(buf, '\0', MAXDATASIZE/sizeof (char));
    }

    close(sockfd);
    fclose(fd);

    return 0;

}

Server

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

#define BACKLOG 10
#define MAXDATASIZE  2048

int main(int argc, char *argv[])
{
    if(argc!=2){
        printf("Usage: %s <Port> \n",argv[0]);
        return 0;
    }
    int listenfd;
    listenfd = socket(AF_INET, SOCK_STREAM, 0);
    struct sockaddr_in serveraddr;
    bzero(&serveraddr, sizeof(serveraddr));
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_port = htons(atoi(argv[1])); 
    serveraddr.sin_addr.s_addr = INADDR_ANY;
    bind(listenfd, (struct sockaddr*)&serveraddr, sizeof(serveraddr));
    listen(listenfd, BACKLOG);
    printf("======bind success,waiting for client's request on port:%s======\n",argv[1]);
    struct sockaddr_in peeraddr;
    socklen_t peer_len = sizeof(peeraddr);

    int connfd;
    while(1)
    {
        connfd = accept(listenfd, (struct sockaddr*)&peeraddr, &peer_len);
        printf("\n=====================客户端链接成功=====================\n");
        printf("IP = %s:PORT = %d\n", inet_ntoa(peeraddr.sin_addr), ntohs(peeraddr.sin_port));

        char buf[MAXDATASIZE];

        while(1)
        {
            memset(buf, '\0', MAXDATASIZE/sizeof (char));
            int recv_length = recv(connfd, buf, MAXDATASIZE/sizeof (char), 0);
            if(recv_length == 0)
            {
                printf("client has closed!\n");
                break;
            }

            int len,nread;
            FILE* fd;
            printf("request file name: %s\n",buf);
            fd=fopen(buf,"rb");
            fseek(fd,0,SEEK_END);
            len=ftell(fd);
            fseek(fd,0,SEEK_SET);
            printf("file length: %d\n",len);

            while((nread=fread(buf,1,MAXDATASIZE/sizeof(char),fd))>0){
                int sendNum;
                if((sendNum=send(connfd,buf,nread,0))!=nread){
                    printf("sending error %d\n",sendNum);
                }
                printf("sending data : %d\n",sendNum);
                memset(buf, '\0', MAXDATASIZE/sizeof (char));

            }
            fclose(fd);
            shutdown(connfd,SHUT_WR);
            recv(connfd,buf,MAXDATASIZE/sizeof (char), 0);
        }
        close(connfd);
        close(listenfd);
        
        return 0;
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值