Socket 服务器和客户端的说明

来源:互联网 发布:mac怎么输入特殊符号 编辑:程序博客网 时间:2024/05/19 20:01


服务端说明


#include <errno.h>                //一些错误信息的处理
#include <stdio.h>                 // 标准输入输出
#include <sys/types.h>          //基本系统数据类型
#include <netinet/in.h>           //Internet address family 定义像sockaddr_in这个的地址族
#include <sys/socket.h>        //socket
#include <unistd.h>               //系统定义符号常量的头文件,包含了许多UNIX系统服务的函数原型,例如read函数、write函数
#include <netdb.h>                //netdb.h 定义了与网络有关的结构,变量类型,宏,函数。如:struct hostent  *gethostbyaddr(const void *addr, size_t len, int type);
#include <arpa/inet.h>            // 定义了 inet_addr
#include <fcntl.h>                   //fcntl.h定义了很多宏和open,fcntl函数原型 close等
#include <stdlib.h>                 //标准库
#include <string.h>                 //string
int main(int argc, const char * argv[])
{

    int sfp,nfp; //套接字描述符
    struct sockaddr_in s_add,c_add; //服务端和客户端地址
    unsigned int sin_size;

    unsigned short portnum=3000; //绑定端口号
    
    printf("Hello,welcome to my server !\r\n");
    sfp = socket(AF_INET, SOCK_STREAM, 0); //套接字描述符
    if(-1 == sfp)//如果失败
    {
        printf("socket fail ! \r\n");
        return -1;
    }
    printf("socket ok !\r\n");
    
    
    bzero(&s_add,sizeof(struct sockaddr_in));//清0
    s_add.sin_family=AF_INET;
    s_add.sin_addr.s_addr=htonl(INADDR_ANY);// 任何地址
    s_add.sin_port=htons(portnum);//端口号
    
    if(-1 == bind(sfp,(struct sockaddr *)(&s_add), sizeof(struct sockaddr))) //如果绑定失败
    {
        printf("bind fail !\r\n");
        return -1;
    }
    printf("bind ok !\r\n");
    
    if(-1 == listen(sfp,5))//如果listen失败
    {
        printf("listen fail !\r\n");
        return -1;
    }
    printf("listen ok\r\n");
    
    while(1)
    {
        sin_size = sizeof(struct sockaddr_in);
        
        nfp = accept(sfp, (struct sockaddr *)(&c_add), &sin_size);//不断accept
        //如果accpet成功的话,客户端的一些信息就在 c_add 中
        if(-1 == nfp)//失败
        {
            printf("accept fail !\r\n");
            return -1;
        }
        printf("accept ok!\r\nServer start get connect from %#x : %#x\r\n",
               ntohl(c_add.sin_addr.s_addr),ntohs(c_add.sin_port));
        // 打印客户端的地址和端口
        
        if(-1 == write(nfp,"hello,welcome to my server \r\n",32))//写入数据
        {
            printf("write fail!\r\n");
            return -1;
        }
        printf("write ok!\r\n");
        close(nfp);//关闭
        
    }
    close(sfp);//关闭
    return 0;
}


客户端说明


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

int main()
{
    int cfd;//套接字描述符
    ssize_t recbytes;//接受字节长度
    char buffer[1024]={0};//接收字节缓存区
    struct sockaddr_in s_add;//连接的地址
    unsigned short portnum=3000;//连接端口
    
    printf("Hello,welcome to client !\r\n");
    
    cfd = socket(AF_INET, SOCK_STREAM, 0);
    if(-1 == cfd)
    {
        printf("socket fail ! \r\n");
        return -1;
    }
    printf("socket ok !\r\n");
    
    bzero(&s_add,sizeof(struct sockaddr_in));//清空
    s_add.sin_family=AF_INET;
    s_add.sin_addr.s_addr= inet_addr("192.168.1.101");
    s_add.sin_port=htons(portnum);
    printf("s_addr = %#x ,port : %#x\r\n",s_add.sin_addr.s_addr,s_add.sin_port);
    
    
    if(-1 == connect(cfd,(struct sockaddr *)(&s_add), sizeof(struct sockaddr)))//开始连接
    {
        printf("connect fail !\r\n");
        return -1;
    }
    printf("connect ok !\r\n");
    ssize_t num=1024;
    if(-1 == (recbytes = read(cfd,buffer,num)))//如果读取失败
    {
        printf("read data fail !\r\n");
        return -1;
    }
    printf("read ok\r\nREC:\r\n");
    
    buffer[recbytes]='\0';
    printf("%s\r\n",buffer);
    
    getchar();
    close(cfd);
    return 0;
}