又延伸到socket去了。

下面是我最近研究的用C写的Linux,socket聊天程序。要学Epoll,EPOLL中有很多socket的语句,所以又跳到C这边来了。

server.c

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

#define BUFLEN 10
#define SER_ADDR "127.0.0.1"
#define PORT 8080
#define MAX_CONN 200

int main(int argc, char **argv)
{
    int sockfd, newfd;
    struct sockaddr_in s_addr, c_addr;
    char buf[BUFLEN];
    socklen_t len;
    unsigned int port=8080, listnum=200;

    /*简历socket*/
    if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
        perror("socket");
        exit(errno);
    }
    else
    {
        printf("socket create success!\n");
    }
    /*设置侦听队列的长度*/
    printf("listnum = %d", listnum);
    /*设置服务器ip*/
    bzero(&s_addr, sizeof(s_addr));
    s_addr.sin_family = AF_INET;
    s_addr.sin_port = htons(port);
    printf("port= %d\n", port);
    if(SER_ADDR)
        s_addr.sin_addr.s_addr = inet_addr(SER_ADDR);
    else
        s_addr.sin_addr.s_addr = INADDR_ANY;
    printf("socket_addr.addr = %d", s_addr.sin_addr.s_addr);
    /*把地址和端口绑定到套接字上*/
    if((bind(sockfd, (struct sockaddr*)&s_addr, sizeof(struct sockaddr))) == -1)
    {
        perror("bind");
        exit(errno);
    }
    else
    {
        printf("bind success!\n");
    }
    /*侦听本地端口*/
    if(listen(sockfd, listnum) == -1)
    {
        perror("listen");
        exit(errno);
    }
    else
        printf("the server is listening!\n");
    while(1)
    {
        printf("**********聊天开始********\n");
        len = sizeof(struct sockaddr);
        if((newfd = accept(sockfd, (struct sockaddr*)&c_addr, &len)) == -1)
        {
            printf("a client connected\n");
            perror("accept");
            exit(errno);
        }
        else
            printf("正在与您聊天的客户端是:%s:%d\n", inet_ntoa(c_addr.sin_addr), ntohs(c_addr.sin_port));
        while(1)
        {
_retry:
            /****发送消息****/
            bzero(buf, BUFLEN);
            printf("请输入发送对方的消息:");
            /*fgets函数:从流中读取BUFLEN-1个字符*/
            fgets(buf, BUFLEN, stdin);
            /*打印发送的消息*/
            //fputs(buf, stdout);
            if(!strncasecmp(buf, "quit", 4))
            {
                printf("server请求终止聊天!\n");
                break;
            }
            /*如果输入的字符串只有"\n", 即回车,那么轻重新输入*/
            if(!strncmp(buf, "\n", 1))
            {
                printf("输入的字符只有回车, 这个是不正确的!!!\n");
                goto _retry;
            }
            /*如果buf中含有‘\n‘, 那么要用strlen(buf)-1, 去掉‘\n‘*/
            if(strchr(buf, ‘\n‘))
                len = send(newfd, buf, strlen(buf)-1, 0);
            /*如果buf中没有‘\n‘,则用buf的真正长度strlen(buf)*/
            else
                len = send(newfd, buf, strlen(buf), 0);
            if(len > 0)
                printf("消息发送成功,本次发送的字节数是:%d\n", len);
            else
            {
                printf("消息发送失败!\n");
                break;
            }
            /*****接受消息******/
            bzero(buf, BUFLEN);
            len = recv(newfd, buf, BUFLEN, 0);
            if(len > 0)
                printf("客户端发来的信息是:%s, 共有字节数是:%d\n", buf, len);
            else
            {
                if(len<0)
                    printf("接受消息失败!\n");
                else
                    printf("客户端退出了,聊天终止!\n");
                break;
            }
        }
        /*关闭聊天的套接字*/
        close(newfd);
        /*是否退出服务器*/
        printf("服务器是否退出程序:y->是;n->否?");
        bzero(buf, BUFLEN);
        fgets(buf, BUFLEN, stdin);
        if(!strncasecmp(buf, "y", 1))
        {
            printf("server退出!\n");
            break;
        }
    }
    /*关闭服务器的套接字*/
    close(sockfd);
    return 0;
}

  client.c

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

#define BUFLEN 100

int main(int argc, char **argv)
{
    int sockfd;
    struct sockaddr_in s_addr;
    socklen_t len;
    unsigned int port=8080;
    char buf[BUFLEN];

    /*简历socket*/
    if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
        perror("socket");
        exit(errno);
    }
    else
        printf("socket create success!\n");
    /*设置服务器ip*/
    bzero(&s_addr, sizeof(s_addr));
    s_addr.sin_family=AF_INET;
    s_addr.sin_port = htons(port);
    char *server_addr = "127.0.0.1";
    if(inet_aton(server_addr, (struct in_addr*)&s_addr.sin_addr.s_addr) == 0)
    {
        perror(server_addr);
        exit(errno);
    }
    printf("s_addr.sin_addr.s_addr = %d", s_addr.sin_addr.s_addr);
    /*开始连接服务器*/
    if(connect(sockfd, (struct sockaddr*)&s_addr, sizeof(struct sockaddr)) != 0)
    {
        printf("connect failed");
        perror("connect");
        exit(errno);
    }
    else
        printf("connect success! %d \n", errno);
    printf("enter the while loop");
    while(1)
    {
        printf("while");
        /**接受消息**/
        bzero(buf, BUFLEN);
        len = recv(sockfd, buf, BUFLEN, 0);
        if(len > 0)
            printf("服务器发送来的消息是:%s,共有字节数是:%d\n", buf, len);
        else
        {
            printf("else");
            if(len < 0)
                printf("接受消息失败!\n");
            else
                printf("服务器退出了,聊天终止!\n");
            break;
        }
_retry:
        /***发送消息***/
        bzero(buf, BUFLEN);
        printf("请输入发送给对方的消息:");
        /*fgets函数:从流中读取BUFLEN-1个字符*/
        fgets(buf, BUFLEN, stdin);
        /*打印发送的消息*/
        //fputs(buf, stdout);
        if(!strncasecmp(buf, "quit", 4))
        {
            printf("client请求终止聊天!\n");
            break;
        }
        /*如果输入的字符串只有‘\n‘,即回车, 那么请重新输入*/
        if(!strncmp(buf, "\n", 1))
        {
            printf("输入的字符只有回车,这个是不正确的!!!\n");
            goto _retry;
        }
        printf("%s", buf);
        /*如果buf中含有‘\n‘, 那么要用strlen(buf)-1,去掉‘\n‘*/
        if(strchr(buf, ‘\n‘))
        {
            printf("start to send");
            len = send(sockfd, buf, strlen(buf)-1, 0);
        }
        /*如果buf中没有\n,则用buf的真正长度strlen(buf)*/
        else
            len = send(sockfd, buf, strlen(buf), 0);
        printf("len = %d", len);
        if(len > 0)
            printf("消息发送成功,本次共发送的字节数是:%d\n", len);
        else
        {
            printf("消息发送失败!\n");
            break;
        }
    }
    /*关闭连接*/
    close(sockfd);
    return 0;
}

  

另外最近在看《C和指针》,断断续续看了点。今天记录一个比较有意思的

对于常量

int const a;

const int a;

这两种申明都是规范的。

int *pi;  pi是一个普通的指向整形的指针。

int const *cpi;    pci是一个指向整型常量的指针, 你可以修改指针的值,但是不能修改它所指向的值。

int * const cpi;    cpi是一个指向整形的常量指针。指针是常量,他的值无法修改,但是你可以修改它所指向的整型。

int const * const cpci;     无论是指针本身还是指针所指向的值都是常量,不能修改。

又延伸到socket去了。,布布扣,bubuko.com

时间: 2024-08-27 10:39:55

又延伸到socket去了。的相关文章

【Python3之socket编程】

一.socket的定义 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议.所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的. 补充:也有人将socket说成ip+port,ip是用来

socket 套接字

套接字基础 c/s架构 client ---------internet------------serverserver端: 力求一直提供服务 要绑定一个唯一的地址,让客户端能够明确的找到 客户端/服务器基于网络进行通信,所以要遵询互联网协议ios五层协议:图 TCP/IP协议族包括传输层.网络层.链路层tcp协议传输数据: 以太网头 + IP头 + tcp头 + 数据udp协议传输数据: 以太网头 + IP头 + udp头 + 数据 socket是什么:定义:源IP地址和目的IP地址以及源端口

聊天程序(基于Socket、Thread)

聊天程序简述 1.目的:主要是为了阐述Socket,以及应用多线程,本文侧重Socket相关网路编程的阐述.如果您对多线程不了解,大家可以看下我的上一篇博文浅解多线程 . 2.功能:此聊天程序功能实现了服务端跟多个客户端之间的聊天,可以群发消息,选择ip发消息,客户端向服务端发送文件. (例子为WinForm应用程序) Socket,端口,Tcp,UDP. 概念 1.Socket还被称作"套接字",应用程序通常通过套接字向网络发送请求或者应答网络请求.根据连接启动的方式以及本地套接字要

HTTP、TCP、UDP以及SOCKET之间的区别/联系

一.TCP/IP代表传输控制协议/网际协议,指的是一系列协组. 可分为四个层次:数据链路层.网络层.传输层和应用层. 在网络层:有IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议. 在传输层:中有TCP协议与UDP协议. 在应用层:有FTP.HTTP.TELNET.SMTP.DNS等协议. TCP和UDP使用IP协议从一个网络传送数据包到另一个网络.把IP想像成一种高速公路,它允许其它协议在上面行驶并找到到其它电脑的出口.TCP和UDP是高速公路上的"卡车",它们携带的

深入浅出讲解:php的socket通信

深入浅出讲解:php的socket通信 对TCP/IP.UDP.Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵.那么我想问: 1.         什么是TCP/IP.UDP?2.         Socket在哪里呢?3.         Socket是什么呢?4.         你会使用它们吗? 什么是TCP/IP.UDP? TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协

php的socket通信

对TCP/IP.UDP.Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵.那么我想问: 1.         什么是TCP/IP.UDP?2.         Socket在哪里呢?3.         Socket是什么呢?4.         你会使用它们吗? 什么是TCP/IP.UDP? TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网

socket总结

Socket简介 1,socket是什么? 2,socket的作用 3,socket怎么用 4,socket的扩展 ——————————————————- socket是什么? Socket这个名词现在有很多不同的意思,这里主要讲到其中2个含义.一是,套接字socket=(IP地址:端口号),是端的概念.二是,socket在应用层和传输层之间,是层的概念. 要理解socket是什么,首先要理解网络的分层结构,目前internet广泛使用的TCP/IP模型,总结起来网络模型分为四层,从上层往下依次

socket、tcp、udp、http 的认识及区别

一.先来一个讲TCP.UDP和HTTP关系的 1.TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层. 在网络层有IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议. 在传输层中有TCP协议与UDP协议. 在应用层有FTP.HTTP.TELNET.SMTP.DNS等协议. 因此,HTTP本身就是一个协议,是从Web服务器传输超文本到本地浏览器的传送协议. 2.HTTP协议是建立在请求/响应模型上的. 首先由客户建立一条与服务器的TCP链接,并发送一个请求到服务器, 请求

[转]Linux的SOCKET编程详解

From : http://blog.csdn.net/hguisu/article/details/7445768 1. 网络中进程之间如何通信 进 程通信的概念最初来源于单机系统.由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进 程之间既互不干扰又协调一致工作,操作系统为进程通信提供了相应设施,如 UNIX BSD有:管道(pipe).命名管道(named pipe)软中断信号(signal) UNIX system V有:消息(message).共享存储区(shared mem