zoukankan      html  css  js  c++  java
  • 一个简单的TCP通信的例子

    这篇里面涉及的函数和内部结构体请访问:

    http://www.cnblogs.com/bugY/archive/2011/10/26/2225152.html

    Server端

    /* server.c */
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #define MAXLINE 80
    #define SERV_PORT 8000
    int main(void)
    {
    struct sockaddr_in servaddr, cliaddr;
    socklen_t cliaddr_len;
    int listenfd, connfd;
    char buf[MAXLINE];
    char str[INET_ADDRSTRLEN];
    int i, n;
    listenfd = 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(listenfd, (struct sockaddr *)&servaddr,sizeof(servaddr));
    listen(listenfd, 20);
    printf("Accepting connections ...\n");
    while (1) {
    cliaddr_len = sizeof(cliaddr);
    connfd = accept(listenfd,(struct sockaddr *)&cliaddr,&cliaddr_len);//返回一个客户端的socket的整型
    n = read(connfd, buf, MAXLINE);
    inet_ntop(AF_INET, &cliaddr.sin_addr, str,sizeof(str));//转换网络地址,由整型转化为点分十进制
    printf("received from %s at PORT %d\n",str,ntohs(cliaddr.sin_port));
    for (i = 0; i < n; i++)
    buf[i] = toupper(buf[i]);
    write(connfd, buf, n);
    close(connfd);
    }
    }

    Client端

    /* client.c */
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #define MAXLINE 80
    #define SERV_PORT 8000
    int main(int argc, char *argv[])
    {
    struct sockaddr_in servaddr;
    char buf[MAXLINE];
    int sockfd, n;
    char *str;

    if (argc != 2) {
    fputs("usage: ./client message\n", stderr);
    exit(1);
    }
    str = argv[1];
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr);
    servaddr.sin_port = htons(SERV_PORT);

    connect(sockfd, (struct sockaddr *)&servaddr,sizeof(servaddr));
    write(sockfd, str, strlen(str));
    n = read(sockfd, buf, MAXLINE);
    printf("Response from server:\n");
    write(STDOUT_FILENO, buf, n);
    close(sockfd);
    return 0;
    }


    下面是两个防止接受和发送字符串超长的问题

    ssize_t Readn(int fd, void *vptr, size_t n)
    {
    size_t nleft;
    ssize_t nread;
    char *ptr;
    ptr = vptr;
    nleft = n;
    while (nleft > 0) {
    if ( (nread = read(fd, ptr, nleft)) < 0) {
    if (errno == EINTR)
    nread = 0;
    else
    return -1;
    } else if (nread == 0)
    break;
    nleft -= nread;
    ptr += nread;
         }
    return n - nleft;
    }
    ssize_t Writen(int fd, const void *vptr, size_t n)
    {
    size_t nleft;
    ssize_t nwritten;
    const char *ptr;
    ptr = vptr;
    nleft = n;
    while (nleft > 0) {
    if ( (nwritten = write(fd, ptr, nleft)) <= 0) {
    if (nwritten < 0 && errno == EINTR)
    nwritten = 0;
    else
    return -1;
    }
    nleft -= nwritten;
    ptr += nwritten;
    }
    return n;
    }




  • 相关阅读:
    Linux直接在通过终端打开图片文件
    【暑假】[实用数据结构]UVa11995 I Can Guess the Data Structure!
    【暑假】[实用数据结构]动态范围查询问题
    【暑假】[实用数据结构]范围最小值问题(RMQ)
    【暑假】[实用数据结构]动态连续和查询问题
    【暑假】[基本数据结构]基本的数据结构知识点总结梳理
    【暑假】[基本数据结构]根据in_order与post_order构树
    【暑假】[基本数据结构]根据BFS与DFS确定树
    【暑假】[网络流]网络流知识总结
    [HDOJ2546] 饭卡 (01背包)
  • 原文地址:https://www.cnblogs.com/bugY/p/2226843.html
Copyright © 2011-2022 走看看