多线程并发服务器程序

1、server.c

#include "wrap.h"
#include <pthread.h>
#include <ctype.h>
#include <strings.h>

void *callback(void *arg)
{
    int *cfd = (int *)arg;
    printf("pthread %ld running...\n", pthread_self());
    while(1){
        char buf[BUFSIZ];
        int n = Readn(*cfd, buf, BUFSIZ);
        if (n <= 0){
            close(*cfd);
            pthread_exit(NULL);
        }
        int i = n;
        while(i--){
            buf[i] = toupper(buf[i]);
        }
        write(*cfd, buf, n);
    }
    return NULL;
}
#define SEV_PORT 3000
int main(){
    // 1、socket
    int sfd = Socket(AF_INET, SOCK_STREAM, 0);
    // 2、bind
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = htonl(INADDR_ANY);
    addr.sin_port = htons(SEV_PORT);
    Bind(sfd, &addr, sizeof(addr));
    // 3、listen
    Listen(sfd, 128);
    // 4、accept
    int cfds[256];
    int n = 0;
    while(1){
        struct sockaddr_in c_addr;
        socklen_t len = sizeof(c_addr);
        bzero(&c_addr, sizeof(c_addr));
        cfds[n] = Accept(sfd, &c_addr, &len);
        char buf[BUFSIZ];
        printf("Client connected -- ip:%s, port:%d\n", inet_ntop(AF_INET, &c_addr.sin_addr.s_addr, buf, BUFSIZ), ntohs(c_addr.sin_port));
        pthread_t thread;
        int ret = pthread_create(&thread, NULL, callback, cfds + n);
        if (ret < 0){
            perror("pthread create error");
            exit(1);
        }
        n++;
        pthread_detach(thread);
    }
}

wrap.h[……]

继续阅读

Socket及基本应用(TCP)

1、什么是Socket(插座、套接字)

  • IP:网络中能标识唯一一台主机;
  • Port:主机中标识唯一一个进程;
  • Socket:IP+Port;
  • socket在Linux中为七种基本文件中的一个(普通-、目录d、连接l、管道p、字符设备c、块设备b、套接字s)

2、Socket的基本特性

  • socket是成对出现,绑定ip+端口
  • 一个文件描述符,两个缓冲区,全双工读写

3、C/S模型

  • 大小端问题:
    • 小端:低地址-存低位、高地址-存高位
    • 大端:低地址-存高位、高地址-存低位
  • 网络数据流应采用大端字节序,即低地址高字节
    #include <arpa/inet.h>[......]

    继续阅读