吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3631|回复: 5
收起左侧

[其他原创] 【C】实作TCP socket(简易聊天软体)

[复制链接]
xiaokufd 发表于 2019-3-27 20:38
本帖最后由 xiaokufd 于 2019-3-27 20:49 编辑

今天来讲讲何为TCP以及他的运作方式。首先,TCP是一种网路的传输方法,也是在各种传输方法当中比较稳定的一种。
那除了TCP之外还有其他种吗?有,还有一种协定叫做UDP,这种传输方式比TCP还来的快,但是他的封包遗失率较高,不稳定。
TCP采用三向握手(three-way handshake)建立连线来确保封包出现掉失的情况(如图)



大概了解后,我们就用下图的这个TCP Socket流程图,来实作看看吧。

如果有不太懂的,可以上网查查或是留言问我。因为我是以大家有一定的基础来写这篇帖子的,所以可能没有讲的那么仔细。

这是Server的code
[C] 纯文本查看 复制代码
/* A simple server in the internet domain using TCP
   The port number is passed as an argument */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

void error(const char *msg)
{
    perror(msg);
    exit(1);
}

int main(int argc, char *argv[])
{
    int sockfd, newsockfd, portno;
    socklen_t clilen;
    char buffer[256];
    struct sockaddr_in serv_addr, cli_addr;
    int n;

    if (argc < 2) {
        printf("[ERROR] usage %s port\n", argv[0]);
        exit(1);
    }

    //Create Socket
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0)
       error("[ERROR] create socket\n");
    
    //Initial socket
    bzero((char *) &serv_addr, sizeof(serv_addr));
    portno = atoi(argv[1]);
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = INADDR_ANY;
    serv_addr.sin_port = htons(portno);

    //Binding
    if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
        error("[ERROR] on binding\n");

    //Listening
    listen(sockfd,5);
    
    clilen = sizeof(cli_addr);
    
    //Accept
    newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
    if (newsockfd < 0)
        error("[ERROR] on accept\n");
    else
        printf("[CLIENT CONNECTED.]\n");

    //sending and receiving
    while(1){
        bzero(buffer,256);
        n = read(newsockfd,buffer,255);
        if (n < 0) 
            error("[ERROR] reading from socket\n");
        printf("%s", buffer);

        bzero(buffer,256);
        fgets(buffer,255,stdin);
        n = write(newsockfd,buffer,255);
        if (n < 0) 
            error("[ERROR] writing to socket\n");
    }

    //closing socket
    close(newsockfd);
    close(sockfd);
    return 0;
}


这是Client的code
[C] 纯文本查看 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h> 

void error(const char *msg)
{
    perror(msg);
    exit(0);
}

int main(int argc, char *argv[])
{
    int sockfd, portno, n;
    struct sockaddr_in serv_addr;
    struct hostent *server;
    char buffer[256];

    if (argc < 3) {
       printf("[ERROR] usage %s hostname port\n", argv[0]);
       exit(0);
    }
    portno = atoi(argv[2]);

    //Create socket
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) 
        error("[ERROR] create socket");

    //Input ip
    server = gethostbyname(argv[1]);
    if (server == NULL) {
        printf("[ERROR] no such host\n");
        exit(0);
    }

    //Initial
    bzero((char *) &serv_addr, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length);
    serv_addr.sin_port = htons(portno);

    //Connecting to server
    if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) 
        error("[ERROR] connecting");
    else
        printf("[SERVER CONNECTED.]\n");

    while(1){
        //for sending
        bzero(buffer,256);
        fgets(buffer,255,stdin);
        n = write(sockfd,buffer,strlen(buffer));
        if (n < 0) 
             error("ERROR writing to socket");

        //for receiving
        bzero(buffer,256);
        n = read(sockfd,buffer,255);
        if (n < 0) 
             error("ERROR reading from socket");
        printf("%s",buffer);
    }
    //socket closing
    close(sockfd);
    return 0;
}


执行结果
55557063_1030431547148819_1753674145259847680_n.png

Downloads.zip

204.99 KB, 下载次数: 27, 下载积分: 吾爱币 -1 CB

有Server跟Client的代码以及执行的影片

免费评分

参与人数 2吾爱币 +4 热心值 +2 收起 理由
s_qiu + 1 + 1 用心讨论,共获提升!
苏紫方璇 + 3 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

wffeeff 发表于 2019-3-27 21:42
可以帮我写个小程序吗?
 楼主| xiaokufd 发表于 2019-3-27 21:59
wffeeff 发表于 2019-3-27 21:42
可以帮我写个小程序吗?

是什么样的程序呢?不知道的情况下我也不好回答哈哈。
wffeeff 发表于 2019-3-27 22:03
xiaokufd 发表于 2019-3-27 21:59
是什么样的程序呢?不知道的情况下我也不好回答哈哈。

写个DLL,即是服务端又是下载端,局域网传输文件用的。
 楼主| xiaokufd 发表于 2019-3-28 18:52
wffeeff 发表于 2019-3-27 22:03
写个DLL,即是服务端又是下载端,局域网传输文件用的。

其實你要的需求,用我的這個Code都可以滿足。只是要小改一下。
至於把它寫成DLL,其實也蠻簡單的,上網google一下應該就會了
相信你可以做到的,如果寫的過程中有遇到其他問題,可以問我~~
或是真的寫不出來,我有空再幫你寫個吧。
wffeeff 发表于 2019-3-30 18:55
xiaokufd 发表于 2019-3-28 18:52
其實你要的需求,用我的這個Code都可以滿足。只是要小改一下。
至於把它寫成DLL,其實也蠻簡單的,上網g ...

厉害,其实我不懂C, 等大神有空帮搞个吧。可给红包
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 05:50

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表