一個關於linux socket的簡單例子

來源:互聯網
上載者:User

用戶端:dl_client.c
#include "unp.h"

int main(int argc,char *argv[])
{
    char recvbuff[50],buff[50],*p;
    int sockfd,len,ret,test;
    struct sockaddr_in serveraddr;
    FILE *fp;
   
    if(argc != 3){
        printf("input:./client <IPaddress> <filename>/n");
        return 0;
    }
   
    if((sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0){
        printf("socket error/n");
        return 0;
    }
       
    bzero(&serveraddr,sizeof(serveraddr));
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_port = htons(SERV_PORT);
    if(inet_pton(AF_INET,argv[1],&serveraddr.sin_addr) <= 0){
        printf("inet_pton error for %s/n",argv[1]);
        return 0;
    }
   
    if(connect(sockfd,(SA *)&serveraddr,sizeof(serveraddr)) < 0){
        printf("connect error1/n");
        return 0;
    }
   
    bzero(buff,sizeof(buff));
    strcpy(buff,argv[2]);
    send(sockfd,buff,sizeof(buff), 0);
    bzero(buff,sizeof(buff));
    sprintf(buff,"./dl_%s",argv[2]);
    recv(sockfd,recvbuff,sizeof(recvbuff),0);
    len = 0;
    ret = 0;
    if((len = atoi(recvbuff)) > 0){
        p = (char *)malloc(len + 1);
        bzero(p, len + 1);
        test = recv(sockfd,p,len,0);
        printf("***test = %d/n",test);
        printf("***len = %d/n",len);
        if((fp = fopen(buff,"w+")) != NULL){
            ret = fwrite(p,len,1,fp);
            fclose(fp);
        }
        free(p);
    }
    if(len != 0 && ret == 1)
        printf("Download %s OK!/n",argv[2]);
    else printf("Download error!/n");
   
    close(sockfd);
   
    return 0;
}
服務端:dl_server.c
#include "unp.h"

int Socket(int family,int type,int protocol)
{
    int ret;
    ret = socket(family,type,protocol);
    if(ret < 0){
        printf("socket error/n");
    }
    return ret;
}

void Bind(int sockfd,const struct sockaddr *myaddr,socklen_t addrlen)
{
    if(bind(sockfd,myaddr,addrlen) < 0)
        printf("bind error/n");
}

void Listen(int fd, int backlog)
{
    char *ptr;
    if((ptr = getenv("LISTENQ")) != NULL)
        backlog = atoi(ptr);
    if(listen(fd,backlog) < 0)
        printf("listen error/n");
}

int Fork()
{
    if(fork() == 0)
        return 0;
    else
        return -1;
}

int main(int argc,char *argv[])
{
    char recvbuff[50],path[50],*p = NULL;
    int listensock,connsock,ret,len;
    pid_t childpid;
    socklen_t clilen;
    struct sockaddr_in servaddr,cliaddr;
    FILE *fp;
   
    listensock = Socket(AF_INET,SOCK_STREAM,0);
   
    bzero(&servaddr,sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(SERV_PORT);
   
    Bind(listensock,(SA *)&servaddr,sizeof(servaddr));
   
    Listen(listensock,LISTENQ);
   
    for( ; ; ){
        clilen = sizeof(cliaddr);
        connsock = accept(listensock,(SA *)&cliaddr,&clilen);
       
        if((childpid = Fork()) == 0){
            bzero(recvbuff,sizeof(recvbuff));
            bzero(path,sizeof(path));
            recv(connsock,recvbuff,sizeof(recvbuff),0);
            sprintf(path,"./%s",recvbuff);
           
            ret = -1;
            if((fp = fopen(path, "r")) != NULL){
                fseek(fp, 0, SEEK_END);
                len = ftell(fp);
                p = (char *)malloc(len + 1);
                bzero(p, len + 1);
                fseek(fp, 0, SEEK_SET);
                ret = fread(p,len + 1,1,fp);
                fclose(fp);
            }
            if(ret != -1){
                bzero(path,sizeof(path));
                sprintf(path,"%d",len);
                send(connsock,path,sizeof(path),0);
                send(connsock,p,len + 1,0);
            }
            else{
                len = 0;
                bzero(path,sizeof(path));
                sprintf(path,"%d",len);
                send(connsock,path,sizeof(path),0);
            }
            free(p);
           
            close(listensock);
            return 0;
        }
        close(connsock);
    }
}
包含的標頭檔:unp.h(從項目裡拿出來的,可能有出入)
#include <getopt.h>
#include <resolv.h>
#include <dirent.h>
#include <stdarg.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <time.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <fcntl.h>
#include <netdb.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/uio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/un.h>

#ifdef HAVE_SYS_SELECT_H
#include <sys/select.h>
#endif

#ifdef HAVE_SYS_SYSCTL_H
#include <sys/sysctl.h>
#endif

#ifdef HAVE_POLL_H
#include <poll.h>
#endif

#ifdef HAVE_SYS_EVENT_H
#include <sys/event.h>
#endif

#ifdef HAVE_STRINGS_H
#include <string.h>
#endif

#ifdef HAVE_SYS_IOCTL_H
#include <sys/ioctl.h>
#endif

#ifdef HAVE_SYS_FILIO_H
#include <sys/filio.h>
#endif

#ifdef HAVE_SYS_SOCKIO_H
#include <sys/sockio.h>
#endif

#ifdef HAVE_PTHREAD_H
#include <pthread.h>
#endif

#ifdef HAVE_ENT_IF_DL_H
#include <net/if_dl.h>
#endif

#ifdef HAVE_NETINET_SCTP_H
#include <netinet/sctp.h>
#endif

#ifdef _osf_
#undef recv
#undef send
#define recv(a,b,c,d) recvfrom(a,b,c,d,0,0)
#define send(a,b,c,d) sendto(a,b,c,d,0,0)
#endif

#ifndef INADDR_NONE
#define INADDR_NONE 0xffffffff
#endif

#ifndef SHUT_RD
#define SHUT_RD 0
#define SHUT_WR 1
#define SHUT_RDWR 2
#endif

#ifndef INET_ADDRSTRLEN
#define INET_ADDRSTRLEN 16
#endif

#ifndef INET6_ADDRSTRLEN
#define INET_ADDRSTRLEN 46
#endif

#ifndef HAVE_BZERO
#define bzero(ptr,n) memset(ptr,0,n)
#endif

#ifndef HAVE_GETHOSTBYNAME2
#define gethostbyname2(host,family) gethostbyname((host))
#endif

struct unp_in_pktinfo{
    struct in_addr ipi_addr;
    int ipi_ifindex;
};

#ifndef CMSG_LEN
#define CMSG_LEN(size)
#endif

#ifndef CMSG_SPACE
#define CMSG_SPACE(size)
#endif

#ifndef SUN_LEN
#define SUN_LEN(su) (sizeof(*(su)) - sizeof((su)->sun_path) + strlen((su)->sun_path))
#endif

#ifndef AF_LOCAL
#define AF_LOCAL AF_UNIX
#endif
#ifndef PF_LOCAL
#define PF_LOCAL PF_UNIX
#endif

#ifndef INFTIM
#define INFTIM (-1)
#ifdef HAVE_POLL_H
#define INFTIM_UNPH
#endif
#endif

#define LISTENQ 1024

#define MAXLINE 4096
#define BUFFSIZE 8192

#define SERV_PORT 9877
#define SERV_PORT_STR "9877"
#define UNIXSTR_PATH "/tmp/unix.str"
#define UNIXDG_PATH "/tmp/unix.dg"

#define SA     struct sockaddr

#define HAVE_STRUCT_SOCKADDR_STORAGE
#ifndef HAVE_STRUCT_SOCKADDR_STORAGE

#define _SS_MAXSIZE 128
#define _SS_ALIGNSIZE (sizeof(int64_t))
#ifdef HAVE_SOCKADDR_SA_LEN
#define _SS_PAD1SIZE (_SS_ALIGNSIZE -sizeof(u_char) -sizeof(sa_family_t))
#else
#define _SS_PAD1SIZE (_SS_ALIGNSIZE -sizeof(sa_family_t))
#endif
#define _SS_PAD2SIZE (_SS_MAXSIZE -2*_SS_ALIGNSIZE)

struct sockaddr_storage{
#ifdef HAVE_SOCKADDR_SA_LEN
    u_char ss_len;
#endif
    sa_family_t ss_family;
    char _ss_pad1[_SS_PAD1SIZE];
    int64_t _ss_align;
    char _ss_pad2[_SS_PAD2SIZE];
};
#endif

#define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
#define DIR_MODE (FILE_MODE | S_IXUSR | S_IXGRP | S_IXOTH)

typedef void Sigfunc(int);

#define min(a,b) ((a) < (b) ? (a) : (b))
#define max(a,b) ((a) > (b) ? (a) : (b))

#ifndef HAVE_ADDRINFO_STRUCT
//#include "../lib/addrinfo.h"
#endif

#ifndef HAVE_IF_NAMEINDEX_STRUCT
struct if_nameindex{
    unsigned int if_index;
    char *if_name;
};
#endif

分別編譯用戶端和服務端,並運行。一個簡單資料轉送就OK了!

也是從csdn上看的!自己實踐了一下!沒問題!不過!要注意linux系統區域網路的設定!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.