一个关于linux socket的简单例子

From: http://blog.csdn.net/fjhyy/article/details/2983680

下面的例子是客户端向服务端发送数据,并且保存数据,对收到数据进行处理的例子。

客户端: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了!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值