C实现简单TCP的C/S模型(Linux & Mac OS系统)

来源:互联网 发布:交大医学院网络 编辑:程序博客网 时间:2024/05/16 18:54

Server:


#include <stdio.h>

#include <stdlib.h>

#include <sys/socket.h>

#include <unistd.h>//sleep();

#include <netinet/in.h>

#include <arpa/inet.h>


int main(int argc,const char * argv[]) {

    //Server Septs:

    /*

     1.创建socket

     2.循环监听

     3.创建线程处理数据

     */

    //创建流套接字:

    int sock;

    struct sockaddr_in in;

    if ((sock = socket(AF_INET,SOCK_STREAM,0)) == -1) {

        printf("创建原始套接字出错!\n");

        exit(1);//异常退出1/-1,正常退出0

    }

    //封装地址:(为本机地址)

    in.sin_addr.s_addr = inet_addr("0.0.0.0");

    in.sin_family = AF_INET;

    in.sin_port = htons(4396);

    //bind连接socket与ip:

    if (bind(sock, (struct sockaddr *)&in,sizeof(in)) != 0) {

        printf("bind error!\n");

        exit(1);

    }

    //监听:

    if (listen(sock, 5) != 0) {

        printf("listen error!\n");

        exit(1);

    }

    printf("Established!\n");

    

    struct sockaddr_in receiveAddr;

    socklen_t receiveAddrLen = sizeof(receiveAddr);

    while ((accept(sock, (struct sockaddr *)&receiveAddr, &receiveAddrLen)) != -1) {

        printf("来自 %s 的连接!\n",inet_ntoa(receiveAddr.sin_addr));

    }

    return 0;

}


Client:


#include <stdio.h>

#include <stdlib.h>

#include <sys/socket.h>

#include <arpa/inet.h>

#include <unistd.h>//close();

int main(int argc,const char * argv[]) {

    /*Step:

     1.创建socket

     2.connect

     */

    int sockfd;

    struct sockaddr_in addr;

    if ((sockfd = socket(AF_INET, SOCK_STREAM,0)) == -1) {

        printf("创建原始套接字出错!\n");

        exit(1);//异常退出1/-1,正常退出0

    }

    //这两种方式都可以将char*类型的地址转换成网络字节序:

    addr.sin_addr.s_addr = inet_addr("127.0.0.1");

//    inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr);

    addr.sin_family = AF_INET;

    addr.sin_port = htons(4396);

    if ((connect(sockfd, (struct sockaddr*)&addr,sizeof(addr))) != 0) {

        perror("connect");

        close(sockfd);

        exit(-1);

    }

    printf("Connected to server!\n");

    return 0;

}